使用Webwork实现IOC

来源:互联网 发布:python 接收post 编辑:程序博客网 时间:2024/06/04 17:40

Webwork版本2.1.7

首先,需要配置web.xml,webwork的IOC容器可以区分三种作用域requet,session,application,我们可以使用Listener和filter进行配置

<!-- webwork IOC 使用的listener -->
    
<listener>
      
<listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
    
</listener>
    
<listener>
      
<listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
    
</listener>
    
<!-- webwork IOC 使用的fitler -->
    
<filter>
      
<filter-name>container</filter-name>
      
<filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
    
</filter>
    
<filter-mapping>
      
<filter-name>container</filter-name>
       
<url-pattern>/*</url-pattern>
    
</filter-mapping>

我们还要修改action的interceptor栈,以便让所有实现Aware接口的action将资源应用到action,其中必须要引用component interceptor,否则调用依赖资源的方法时候会碰到空指针异常

<action name="testIOC" class="ch5.example2IOC.TestIOC">
 
<default-interceptor-ref name="completeStack"></default-interceptor-ref>

我们调用completeStack,已经包含了component interceptor了

创建组件接口:

package ch5.example2IOC;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public interface PersistenceManager {
    
void setHibernateSessionFactory (HibernateSessionFactory hibernateSessionFactory);
    
void setSessionFactory(SessionFactory sessionFactory);
   Session getSession();
   
void testIOC();
}



package ch5.example2IOC;
import com.opensymphony.webwork.lifecycle.SessionLifecycleListener;
import org.hibernate.SessionFactory;

public interface HibernateSessionFactory {
  SessionFactory getSessionFactory();
}

实现类:

package ch5.example2IOC;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.opensymphony.xwork.interceptor.component.Disposable;
import com.opensymphony.xwork.interceptor.component.Initializable;

public class HibernateSessionFactoryImpl implements HibernateSessionFactory,Initializable,Disposable {
    SessionFactory sessionFactory;
    
public void dispose() {
        
try {
            sessionFactory.close();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

        
    }


    
public void init() {
        
try{
            Configuration configuration
=new Configuration();
            sessionFactory
=configuration.configure().buildSessionFactory();
        }
catch(Throwable e){//此处一定要是Throwable,否则会漏掉NoClassDefFoiundError和其他Error子类
            e.printStackTrace();
        }

    }


    
public SessionFactory getSessionFactory() {
        
return sessionFactory;
    }


}



package ch5.example2IOC;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.opensymphony.xwork.interceptor.component.Disposable;
import com.opensymphony.xwork.interceptor.component.Initializable;

public class PersistenceManagerImpl implements PersistenceManager,HibernateSessionFactoryAware,Initializable,Disposable {

    
public void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory) {
        
this.hibernateSessionFactory=hibernateSessionFactory;
        
    }

    HibernateSessionFactory hibernateSessionFactory;
    SessionFactory sessionFactory;
    Session session;
    
public Session getSession() {
        
return session;
    }


    
public void testIOC() {
        System.out.println(
this.sessionFactory);
        System.out.println(
this.session);
    }

    
public void dispose() {
        
if(session!=null&&session.isOpen()){
            session.close();
        }

     }


     
public void setSessionFactory(SessionFactory sessionFactory) {
         
this.sessionFactory=sessionFactory;
     }


     
public void init() {
        
try {
           session
=this.hibernateSessionFactory.getSessionFactory().openSession(); 
          System.out.println(session);
    }
 catch (Exception e) {
        e.printStackTrace();
    }

     }



}


 创建enabler接口(Aware接口)

package ch5.example2IOC;

public interface PersistenceManagerAware {
   
void setPersistenceManager(PersistenceManager persistenceManager);
}



package ch5.example2IOC;

import org.hibernate.SessionFactory;

public interface HibernateSessionFactoryAware {
    
void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory);
}



指明要注入HibernateSessionFactory

定义components.xml配置文件,放在classpath下
<?xml version="1.0" encoding="UTF-8"?>
<components>
<component>
  
<scope>session</scope>
  
<class>ch5.example2IOC.PersistenceManagerImpl</class>
  
<enabler>ch5.example2IOC.PersistenceManagerAware</enabler>
</component>

<component>
  
<scope>application</scope>
  
<class>ch5.example2IOC.HibernateSessionFactoryImpl</class>
  
<enabler>ch5.example2IOC.HibernateSessionFactoryAware</enabler>
</component>
</components>


Action:

 

package ch5.example2IOC;

import java.util.Map;

import com.opensymphony.webwork.interceptor.SessionAware;
import com.opensymphony.xwork.ActionSupport;

public class TestIOC extends ActionSupport implements HibernateSessionFactoryAware,PersistenceManagerAware {
    

    
public void setPersistenceManager(PersistenceManager persistenceManager) {
        
this.s1=persistenceManager;
        
    }




    
public void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory) {
        
this.s=hibernateSessionFactory;
        
    }



    HibernateSessionFactory s
=null;
    PersistenceManager s1
=null;


    
public String execute() throws Exception {
         
        s1.setHibernateSessionFactory(s);
        System.out.println(s1);
        
        System.out.println(s);
         
return NONE;
    }

    
}


运行action可以看到,HibernateSessionFactory已经注入了

后记:Webwork只提供了接口注入,而Sprin框架还提供了set注入和构造注入,希望webwork以后会改进

          Webwork2.4似乎在ioc方面有很很大的变动,我在2.4上没有调试通过,我发现lifecycle包有了变动,至于2.4

          如何,我也没有继续研究,没有必要,现在ioc基本都是spring的天下,如果有朋友在2.4上有了进展,请通知

         我啊 ,谢谢了