使用Webwork实现IOC

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上有了进展,请通知

         我啊 ,谢谢了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值