方法注入在Spring中是很少用的,主要应用是, 对象中可能定义了一个受保 护的抽象方法,而容器可能在运行时实现他以返回由容器查询得到的对象。
方法注入的最好用途之一就是处理单态、无状态对象需要调用非单态、有状 态或者非线程安全对象的情况。
以前刚接触Spring时,如果在单例bean中调用非单例bean,只要把那个非单 例bean 的singleton设置为false就可以了。其实不然,大家想,我们创建了一 个单例对象,在此单例对象中所用到的其它bean也只会创建一次——(大多数情 况是这样的,当然我们要解决的就是这个问题)。所以说,单纯的把非单例bean 的属性singleton设为false是解决不了的。此时就是方法注入大显身手的时候了 。
下面的例子是单例调用单例的情况:我们在service层调用DAO层
/**
*@authorzhu国辉
*/
packagecom.zgh.spring.dao;
importjava.util.List;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;< BR> /**
*记住一定要引入org.springframework.orm. (hibernate3).support.HibernateDaoSupport
*也就是此类的父类.
*@authorzhu国辉
*
*/
publicclassUserLoginDaoextendsHibernateDaoSupportimplementsIUserLoginD ao{
inti=0;
publicListgetUser(Stringusername,Stringpassword){
System.out.println("i="+(++i));
System.out.println(username+":"+password);
Listusers=getHibernateTemplate().find ("fromUseruwhereusername=?andpassword=?",newObject[] {username,password});
returnusers;
}
}
为了查看效果,我们在DAO中声明了一个成员变量(变成有状态bean)
下面是Service层:
/**
*@authorzhu国辉
*/
packagecom.zgh.spring.service;
importjava.util.List;
importcom.zgh.spring.dao.IUserLoginDao;;
publicclassUserLoginServiceimplementsIUserLoginService{
privateIUserLoginDaouserLoginDao;
publicvoidsetUserLoginDao(IUserLoginDaouserLoginDao){
this.userLoginDao=userLoginDao;
}
publicListgetUser(Stringusername,Stringpassword){
returnuserLoginDao.getUser(username,password);
}
}