之前介绍了通过方法注入实现单例bean访问非单例bean 。现在介绍第二种方式,通过实现ApplicationContextAware接口。我们修改一下之前的例子,我们还是修改Service层,我们还是看一下单例调用单例的最基本方式:
/**
* @author zhu国辉
*/
package com.zgh.spring.service;
import java.util.List;
import com.zgh.spring.dao.IUserLoginDao;;
public class UserLoginService implements IUserLoginService {
private IUserLoginDao userLoginDao;
public void setUserLoginDao(IUserLoginDao userLoginDao) {
this.userLoginDao = userLoginDao;
}
public List getUser(String username, String password) {
return userLoginDao.getUser(username, password);
}
}
配置文件如下:
<bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
<!--====================Service======================= -->
<bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
<property name="userLoginDao">
<ref local="userLoginDao"/>
</property>
</bean>
下面我们修改UserLoginService类,原理是在Service类中得到ApplicationContext的引用,每次在Service中调用DAO时,通过applicationContext.getBean("userLoginDao");都产生一个新的对象。如下:
/**
* @author zhu国辉
*/
package com.zgh.spring.service;
import java.util.List;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import com.zgh.spring.dao.IUserLoginDao;
public class UserLoginService implements IUserLoginService,ApplicationContextAware {
private ApplicationContext app;
public List getUser(String username, String password) {
return ((IUserLoginDao)app.getBean("userLoginDao")).getUser(username, password);
}
public void setApplicationContext(ApplicationContext app)
throws BeansException {
this.app = app;
}
}
配置文件修改一下:
<!--==================== DAO======================= -->
<bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao" singleton="false">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
<!--====================Service======================= -->
<bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
</bean>
我们在DAO里设置singleton="false",然后把Service里的属性注入去掉。再运行一下程序,i每次运行都是1,结果可以看出,我们做的成功了。
DAO层代码如下:
/**
* @author zhu国辉
*/
package com.zgh.spring.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* 记住一定要引入org.springframework.orm.(hibernate3).support.HibernateDaoSupport
* 也就是此类的父类.
* @author zhu国辉
*
*/
public class UserLoginDao extends HibernateDaoSupport implements IUserLoginDao {
int i=0;
public List getUser(String username, String password) {
System.out.println("i="+(++i));
System.out.println(username+":"+password);
List users=getHibernateTemplate().find("from User u where username=? and password=?",new Object[]{username,password});
return users;
}
}
顺便说一下ApplicationContextAware接口,此接口定义了一个方法setApplicationContext()方法,此方法在Spring初始化类以后,调用实现了ApplicationContextAware接口的类的setApplicationContext()方法,将自身的一个引用传递给此实例。
我们将这两种单例调用非单例的例子对比一下,不难看出,第一种方式:方法注入要好于第二种方式:实现接口。原因是,第二种方式与Spring绑定了。而第一种方式则没有这种情况,在Service中,我们根本看不出Spring的影子。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760659.aspx