方法注入在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
分享到:
相关推荐
Java多线程编程环境中单例模式的实现
主要介绍了Java中单例模式详解,单例模式包括了懒汉式单例、饿汉式单例、登记式单例三种,想要了解的朋友可以了解一下。
c++中单例模式对象的释放控制,txt文件格式的,哈哈哈
一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。
浅谈Java中单例设计模式之构造方法私有化.pdf
在spring中最核心的就是IOC容器,默认采用的是通过单例的模式来进行管理我们注入到Ioc中的bean(当然我们也是可以修改成其他的模式,暂且不讨论),在spring中单例模式是采用注册的方式来实现的单例模式,所以我也是...
通过instanceof操作符可以检测到此类是否已经被实例化] 注:需要创建__clone()方法防治对象被复制作用: 1.php的应用主要用于数据库,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量new操作...
首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述
主要给大家介绍了关于Swift中单例模式替换的相关资料,然后又跟大家分享了关于Swift3.0 单例模式实现的几种方法-Dispatch_Once的内容,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
Android应用正确的退出方式(单例模式)
主要介绍了C#中单例的实现方法,以实例形式分析了C#中单例的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
Spring中单例的概念限于Spring上下文中,遵守约定 内部bean适用于setter注入和构造器注入,内部bean不能被复用 SpEL表达式 3. 高级装配 4 种自动装配 byName, byType, contructor, autodetect 可以在一个应用上下...
android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);
Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在...
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
Python 的模块就是天然的单例模式,下面这篇文章主要给大家介绍了关于python中单例常用的几种实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用python单例具有一定的参考学习价值,需要的朋友们一起来...
下面小编就为大家分享一篇基于Python中单例模式的几种实现方式及优化详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def __new__(cls, *args): if not isinstance(cls._instance, cls): cls._instance = super(Singleton, cls).__new__...