`
newleague
  • 浏览: 1513844 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Spring中单例bean访问非单例bean的第一种方式:方法注入

阅读更多

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

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

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

  下面的例子是单例调用单例的情况:我们在service层调用DAO层

/**
*@authorzhu国辉
*/
package com.zgh.spring.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
*记住一定要引入org.springframework.orm.(hibernate3).support.HibernateDaoSupport
*也就是此类的父类.
*@authorzhu国辉
*
*/
public class UserLoginDao extends HibernateDaoSupport implements IUserLoginDao{
  inti=0;
  public List getUser(Stringusername,Stringpassword){
    System.out.println("i="+(++i));
    System.out.println(username+":"+password);
    List users=getHibernateTemplate().find("from User u where username=? and password=?",newObject[]{username,password});
    return users;
  }
}

 

 

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

  下面是Service层:

/**
*@authorzhu国辉
*/
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:

/**
*@authorzhu国辉
*/
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指定要注入的类。如此而以。

 

分享到:
评论

相关推荐

    学习SSM源码分析的一次实践,自己实现SSM框架

    在spring中最核心的就是IOC容器,默认采用的是通过单例的模式来进行管理我们注入到Ioc中的bean(当然我们也是可以修改成其他的模式,暂且不讨论),在spring中单例模式是采用注册的方式来实现的单例模式,所以我也是...

    spring mvc 自學筆記

    这里提到的“验证单例多用构造方法”可能是指 Spring MVC 中单例 Bean 的生命周期问题。Spring 管理的 Bean 默认是单例模式,即在整个应用中只有一个实例。当 Bean 采用构造方法初始化时,无论多少次请求,构造函数...

    xmljava系统源码-SpringInAction4:《SpringInAction4th》学习笔记

    Spring中单例的概念限于Spring上下文中,遵守约定 内部bean适用于setter注入和构造器注入,内部bean不能被复用 SpEL表达式 3. 高级装配 4 种自动装配 byName, byType, contructor, autodetect 可以在一个应用上下...

    Java笔试题库①.pdf

    Spring 中单例作用范围 - **知识点**: `Spring`中`Singleton`作用范围的概念。 - **选项解析**: - **A**. `Context`: 正确。在`Spring`的上下文中,`Singleton`作用范围意味着每个`ApplicationContext`只有一个...

    2023年最新java面试大全

    【02期】你能说说Spring框架中Bean的生命周期吗? 【03期】如何决定使用 HashMap 还是 TreeMap? 【04期】分库分表之后,id 主键如何处理? 【05期】消息队列中,如何保证消息的顺序性? 【06期】单例模式有几种...

    SpringMVC之表单提交===②===单文件上传表单

    在Spring MVC中,我们需要创建一个处理器方法来处理文件上传。创建一个名为`UploadController`的控制器类,并添加一个`@RequestMapping`注解的方法: ```java import org.springframework.stereotype.Controller; ...

    spring+spring mvc +mybatis框架(maven项目)

    标题 "spring+spring mvc +mybatis框架(maven项目)" 描述的是一个基于Java的Web开发项目,它整合了三个主流的开源框架:Spring、Spring MVC和MyBatis。这样的组合在企业级应用中非常常见,因为它提供了完整的控制...

Global site tag (gtag.js) - Google Analytics