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

 之前介绍了通过方法注入实现单例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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值