Spring中单例bean访问非单例bean的第一种方式:方法注入(转http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760473.aspx)

来源:互联网 发布:acm大学生软件大赛 编辑:程序博客网 时间:2024/06/16 03:31

方法注入在Spring中是很少用的,主要应用是, 对象中可能定义了一个受保护的抽象方法,而容器可能在运行时实现他以返回由容器查询得到的对象。

方法注入的最好用途之一就是处理单态、无状态对象需要调用非单态、有状态或者非线程安全对象的情况。

以前刚接触Spring时,如果在单例bean中调用非单例bean,只要把那个非单例bean 的singleton设置为false就可以了。其实不然,大家想,我们创建了一个单例对象,在此单例对象中所用到的其它bean也只会创建一次——(大多数情况是这样的,当然我们要解决的就是这个问题)。所以说,单纯的把非单例bean的属性singleton设为false是解决不了的。此时就是方法注入大显身手的时候了。

下面的例子是单例调用单例的情况:我们在service层调用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;
    }

}
为了查看效果,我们在DAO中声明了一个成员变量(变成有状态bean)

下面是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);
    }

}

 

这是最基本的形式了,单例调用单例,每次程序运行时,DAO里的i都会+1, Spring的配置文件如下:

    <!--==================== DAO======================= -->
    <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>

 

那么我们简单的把userLoginDao中添加属性singleton="false",如下:

    <bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao" singleton="false">
        <property name="sessionFactory">
            <ref local="mySessionFactory"/>
        </property>
    </bean>

 

我们再运行,i打印出来的还是每被访问一次就+1,也就是说只靠singleton="false"是不行的,下面我们进行正题:

我们选修改一下 Service:

/**
 * @author zhu国辉
 */
package com.zgh.spring.service;

import java.util.List;
import com.zgh.spring.dao.IUserLoginDao;;

public abstract class UserLoginService implements IUserLoginService {
    protected abstract IUserLoginDao getUserLoginDao();

    public List getUser(String username, String password) {
        
        return getUserLoginDao().getUser(username, password);
    }

}

 

看看我们都做了什么事:把类声明成abstract,定义一个抽象方法:getUserLoginDao();在使用IUserLoginDao的地方直接使用getUserLoginDao()方法。DAO层没有什么变化,下面看一下XML配置文件:

    <!--==================== 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">
        <lookup-method name="getUserLoginDao" bean="userLoginDao"/>
    </bean>

 

大功告成:运行结果看看,第次i打印的结果都是1,也就是说每次都生成了新的UserLoginDao实例。在最后的这个XML中,我们先把DAO的属性singleton设置为false,然后在Service中用<lookup-method>配置他的依赖,name指定类中的抽象方法,bean指定要注入的类。如此而以。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760473.aspx

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 儿童轻轻泥干了怎么办 5d轻轻泥干了怎么办 手机炉石一直闪退怎么办 鸟之羽任务失败怎么办 巫师3没血没药怎么办 荣威rx5灯光不亮怎么办 点滴打没了回血怎么办 加了低标号的油怎么办 别克车钥匙丢了怎么办 霜子哀伤断了怎么办 侧车窗外有雨水怎么办 昂科威15t变速箱异响怎么办 别克昂科拉一公里9毛怎么办? 雷诺科雷傲车钥匙丢了怎么办 奥迪a6l烧机油了怎么办 卡地亚手镯刮花怎么办 卡地亚戒指花了怎么办 手表摔了不走了怎么办 ck手表表扣很难打开怎么办 小天才泡了水怎么办 小天才手表掉水里了怎么办 小天才电话手表进水了怎么办 小天才手表进水了怎么办 小天才电话手表丢了怎么办 小天才电话手表黑屏怎么办 安全守护注册码忘记了怎么办 儿童安全锁的门打不开怎么办 守护宝老年机打不开了怎么办 小米电话手表坏了怎么办 小米手表带坏了怎么办 小米电话手表屏幕坏了怎么办 雷诺梅甘娜06款系统错乱怎么办 轿车碰了一个坑怎么办 车子卖了没过户怎么办 9岁儿童肠胃痉挛怎么办 鹿角胶水放多了怎么办 打胰岛素血糖还是高怎么办 血糖高打胰岛素降不下去怎么办 儿童低烧37度1怎么办 小孩发烧一会冷一会热怎么办 月子里得的风湿怎么办