使用lookup-method解决singleton bean依赖prototype bean的问题
在Spring里面,当一个singleton bean依赖一个prototype bean,那么,因为singleton bean是单例的,因此prototype bean在singleton bean里面也会变成单例,例如:
public class Main{
private Man man;
//这里注入一个prototype的Man实例
public void setMan(Man man) { this.man= man; }
public Man getMan() { return man; }
}
配置文件:
<bean id="man" class="test.American" scope="prototype"/> <!-- 这里声明一个多例的bean -->
<bean id="main" class="test.Main"> <!-- 这里声明一个单例的bean --> <property name="man" ref="man"/> <!-- 这里依赖一个多例的bean --> </bean>
如果我为Main创建一个单例bean,那么当我注入Man实例的时候,man属性也会变成单例了,跟我预期的效果不一样。
解决方法1:放弃依赖注入,使用传统工厂思想,通过ApplicationContext的getBean方法获取Man的实例。但是缺点比较明显,跟Spring框架耦合了。
解决方法2:如果我仍然想得到依赖注入带来的好处,那么可以使用Spring提供的lookup-method来注入。
不过使用之前,我们需要下载多一个jar包,叫做cglib-full.jar,我使用的版本是cglib-full-2.0.1.jar。
现在我们只需要修改一下我们的配置文件就可以了,现在修改成:
<bean id="man" class="test.American" scope="prototype"/> <!-- 这里声明一个多例的bean -->
<bean id="main" class="test.Main"> <!-- 这里声明一个单例的bean --> <lookup-method name="getMan" bean="man"/> <!-- 这里依赖一个多例的bean --> </bean>
注意红色字体部分,我们不使用原来的property标签,改用looup-method标签。name属性表示当调用指定方法的时候重新注入一个实例,这个实例对应bean属性的值。
最后,请看如下测试代码:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); Main main = (Main) ctx.getBean("main");
Man man1 = main.getMan(); //这里通过Spring的注入,获取第1个Man实例
Man man2 = main.getMan(); //这里通过Spring的注入,获取第2个Man实例
super.assertFalse(man1 == man2);
//请注意,man1和man2现在已经指向两个不同的引用,因此它们的引用不相等。
使用lookup-method解决singleton bean依赖prototype bean的问题的更多相关文章
- 当singleton Bean依赖propotype Bean,可以使用在配置Bean添加look-method来解决
在Spring里面,当一个singleton bean依赖一个prototype bean,因为singleton bean是单例的,因此prototype bean在singleton bean里面 ...
- spring lookup method 注入
lookup method注入是spring动态改变bean里方法的实现.方法执行返回的对象,使用spring内原有的这类对象替换,通过改变方法返回值来动态改变方法.内部实现为使用cgl ...
- 解决Spring中singleton的Bean依赖于prototype的Bean的问题
在spring bean的配置的时候,可能会出现一个singleton的bean依赖一个prototype的bean.因为singleton的bean只有一次初始化的机会,所以他们的依赖关系页只有在初 ...
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Failed to introspect bean class [org.springframework.orm.hibernate5.LocalSessionFactoryBean] for lookup method metadata: could not find class that it depends on; nested exception is java.lang.NoClass
依赖引入 错误可能版本 不对 Failed to introspect bean class [org.springframework.orm.hibernate5.LocalSessionFact ...
- Spring -10 -<bean>的 scope 属性 -singleton 默认值/prototype 多例 /request /session /application /global session
1.<bean>的属性; 2.作用:控制对象有效范围(单例,多例等)3.<bean/>标签对应的对象默认是单例的. 3.1无论获取多少次,都是同一个对象 Teacher t1 ...
- SpringMVC“Ambiguous mapping found. Cannot map 'XXXController' bean method”解决方法
[转 :http://www.fanfanyu.cn/news/staticpagefile/2351.html] 最近在开发项目的过程中SpringMVC抛了个"Ambiguous map ...
- 1.spring.net Look-up Method 查找方法的注入(方法是抽象的需要spring.net注入)
.为什么需要查找方法的注入 当Object依赖另一个生命周期不同的Object,尤其是当singleton依赖一个non-singleton时,常会遇到不少问题,Lookup Method Injec ...
- Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...
随机推荐
- maven与gradle的对比
Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证了Maven的没落和Gradl ...
- oracle与mysql的group by语句
之所以去纠那么细节的问题,是因为之前有过一个这样的场景: 有个同学,给了一条数据库的语句给我,问,为啥这样子的语句在oracle语句下执行不了. 1 select * from xx where xx ...
- DSP投放进阶指南
- 本地上jar命令
1.上传到jd-release mvn deploy:deploy-file -DgroupId=com.jd.open.api -DartifactId=open-api-sdk -Dversion ...
- ubuntu12.04回归到经典的gnome界面
要想删除Unity恢复到经典Gnome桌面也很简单,几乎就是一条命令的事情--命令这种东西虽然不直观,但非常可靠和快捷,同时按住Ctrl+Alt+T三个键,调出系统终端,输入: sudoapt-get ...
- windows mysql 安装及启动
0.下载:
- nginx实时生成缩略图到硬盘上
现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + ...
- HDU2177取(2堆)石子游戏---(威佐夫博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=2177 取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) M ...
- [bzoj3597][scoi2014]方伯伯运椰子——分数规划,负环
题解 目标就是 \[Maximize\ \lambda = \frac{X-Y}{k}\] 按照分数规划的一般规律, 构造: \[g(\lambda) = \lambda k + Y - X\] 由于 ...
- Maven的默认中央仓库以及修改默认仓库&配置第三方jar包从私服下载
当构建一个Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,执行顺序如下: 1.从本地资源库中查找并获得依赖包,如果没有,执行第2步. 2.从Maven默认中央仓库中查找并获得依赖包 ...