Spring中单例bean访问非单例bean的第二种方式:ApplicationContextAware

 之前介绍了通过方法注入实现单例bean访问非单例bean 。现在介绍第二种方式,通过实现ApplicationContextAware接口。我们修改一下之前的例子,我们还是修改Service层,我们还是看一下单例调用单例的最基本方式:

  1. /**
  2.  * @author zhu国辉
  3.  */
  4. package com.zgh.spring.service;
  5. import java.util.List;
  6. import com.zgh.spring.dao.IUserLoginDao;;
  7. public class UserLoginService implements IUserLoginService {
  8.     private IUserLoginDao userLoginDao;
  9.     
  10.     public void setUserLoginDao(IUserLoginDao userLoginDao) {
  11.         this.userLoginDao = userLoginDao;
  12.     }
  13.     public List getUser(String username, String password) {
  14.         
  15.         return userLoginDao.getUser(username, password);
  16.     }
  17. }

 

配置文件如下:

  1.     <bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao">
  2.         <property name="sessionFactory">
  3.             <ref local="mySessionFactory"/>
  4.         </property>
  5.     </bean>
  6.     
  7.     <!--====================Service======================= -->
  8.     <bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
  9.         <property name="userLoginDao">
  10.             <ref local="userLoginDao"/>
  11.         </property>
  12.     </bean>

下面我们修改UserLoginService类,原理是在Service类中得到ApplicationContext的引用,每次在Service中调用DAO时,通过applicationContext.getBean("userLoginDao");都产生一个新的对象。如下:

  1. /**
  2.  * @author zhu国辉
  3.  */
  4. package com.zgh.spring.service;
  5. import java.util.List;
  6. import org.springframework.beans.BeansException;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.ApplicationContextAware;
  9. import com.zgh.spring.dao.IUserLoginDao;
  10. public class UserLoginService implements IUserLoginService,ApplicationContextAware {
  11.     private ApplicationContext app;
  12.     public List getUser(String username, String password) {
  13.         
  14.         return ((IUserLoginDao)app.getBean("userLoginDao")).getUser(username, password);
  15.     }
  16.     public void setApplicationContext(ApplicationContext app)
  17.             throws BeansException {
  18.         this.app = app;
  19.         
  20.     }
  21. }

配置文件修改一下:

  1.     <!--==================== DAO======================= -->
  2.     <bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao" singleton="false">
  3.         <property name="sessionFactory">
  4.             <ref local="mySessionFactory"/>
  5.         </property>
  6.     </bean>
  7.     
  8.     <!--====================Service======================= -->
  9.     <bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
  10.     </bean>

 

我们在DAO里设置singleton="false",然后把Service里的属性注入去掉。再运行一下程序,i每次运行都是1,结果可以看出,我们做的成功了。

DAO层代码如下:

  1. /**
  2.  * @author zhu国辉
  3.  */
  4. package com.zgh.spring.dao;
  5. import java.util.List;
  6. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  7. /**
  8.  * 记住一定要引入org.springframework.orm.(hibernate3).support.HibernateDaoSupport
  9.  * 也就是此类的父类.
  10.  * @author zhu国辉
  11.  *
  12.  */
  13. public class UserLoginDao extends HibernateDaoSupport implements IUserLoginDao {
  14.     int i=0;
  15.     public List getUser(String username, String password) {
  16.         System.out.println("i="+(++i));
  17.         System.out.println(username+":"+password);
  18.         List users=getHibernateTemplate().find("from User u where username=? and password=?",new Object[]{username,password});
  19.         return users;
  20.     }
  21. }

顺便说一下ApplicationContextAware接口,此接口定义了一个方法setApplicationContext()方法,此方法在Spring初始化类以后,调用实现了ApplicationContextAware接口的类的setApplicationContext()方法,将自身的一个引用传递给此实例。

我们将这两种单例调用非单例的例子对比一下,不难看出,第一种方式:方法注入要好于第二种方式:实现接口。原因是,第二种方式与Spring绑定了。而第一种方式则没有这种情况,在Service中,我们根本看不出Spring的影子。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值