spring之注入不同作用域之间的bean
来源:互联网 发布:二线演员年收入知乎 编辑:程序博客网 时间:2024/05/29 13:47
在配置bean时 默认bean的作用域是单例的 也就是scope = “singleton” 的,也就是在项目中只存在一个的 但是有时候为了配置不同的属性 需要在singleton中加入prototype的bean 这时候就会出现Bug 所以 要设置动态代理功能 此时要加入一个包在spring的cglib包
首先定义一个MyHelper类
package com.kevinswift.helper;public class MyHelper {//操作的内容public void doSomethingHelper() {}}
在beans中 定义为一个prototype 的bean
新建一个java 接口
package com.kevinswift.helper;public interface DemoBean {MyHelper getHelper();void someOperation();}新建一个standlookupDemo 实现接口 配置为singleton bean 并且依赖于作用域是prototype的myhelper 的bean
package com.kevinswift.helper;public class standLookUpDemo implements DemoBean { private MyHelper myhelper;public MyHelper getMyhelper() {return myhelper;}public void setMyhelper(MyHelper myhelper) {this.myhelper = myhelper;}@Overridepublic MyHelper getHelper() {// TODO Auto-generated method stubreturn myhelper;}@Overridepublic void someOperation() {// TODO Auto-gen erated method stubmyhelper.doSomethingHelper();}}
定义一个抽象类 并将getHelper方法定义为一个抽象方法 该方法的返回值为被依赖的bean为myhelper 同样实现接口
package com.kevinswift.helper;public abstract class abstractLookUpDemo implements DemoBean { //定义抽象方法 该方法由spring来实现public abstract MyHelper getMyHelper();@Overridepublic MyHelper getHelper() {// TODO Auto-generated method stubreturn getMyHelper();}@Overridepublic void someOperation() {// TODO Auto-generated method stub getMyHelper().doSomethingHelper();}}随后详细来看bean的配置文件
<bean id = "helper" scope="prototype" class = "com.kevinswift.helper.MyHelper"> </bean> <!-- 配置standLookUpHelper实例 --> <bean id = "standLookUpBean" class = "com.kevinswift.helper.standLookUpDemo"> <property name="myhelper" ref = "helper"></property> </bean> <!-- 配置abstractlookupdemo 指定myHelper的方法返回helper实例 --> <bean id = "abstractLookUpBean" class = "com.kevinswift.helper.abstractLookUpDemo"> <lookup-method name = "getMyHelper" bean="helper"/> </bean>这样即可完成将prototype类 注入到 singleton中
新建一个test 来进行判断
package com.kevinswift.helper;import org.springframework.*;import org.springframework.context.ApplicationContext;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import org.springframework.util.StopWatch;public class test {public static void main(String[] args) {// TODO Auto-generated method stub //创建容器ApplicationContext ctx = new FileSystemXmlApplicationContext("src/beans.xml");test.stressTest(ctx, "abstractLookUpBean");test.stressTest(ctx, "standLookUpBean");}//获取两次的bean的实例 并比较是否为同一实例public static void stressTest(ApplicationContext ctx,String beanName){DemoBean bean = (DemoBean)ctx.getBean(beanName);MyHelper helper1 = bean.getHelper();MyHelper helper2 = bean.getHelper();System.out.println("测试" + beanName);System.out.println("helper是否相同" + (helper1 == helper2));//StopWatch stopWatch = new StopWatch();////循环获取一万次bean的实例 并且调用bean的dosomethingHelperful的方法//for(int i = 0 ; i < 10000; i++) {//MyHelper helper = bean.getHelper();//helper.doSomethingHelper();////}//stopWatch.stop();////计算获取10000次bean实例花费的执行时间//System.out.println("获取10000次时间花费了 " + stopWatch.getLastTaskTimeMillis());}}可以看出stand建出来是同一个的 而abstract建出来数不同的
0 0
- spring之注入不同作用域之间的bean
- 不同作用域(scope)的Spring Bean之间的依赖关系的动态代理注入
- spring(bean初始化、销毁、注入,作用域)
- Spring中协调作用域不同的Bean
- spring之bean的作用域scope
- Spring之Bean的作用域
- Spring IOC 之Bean的作用域
- Spring Bean的作用域之间有什么区别?
- Spring -- Bean自动装配&Bean之间关系&Bean的作用域
- Spring 注入不同作用域对象
- 使用方法注入—协调不同作用域(singleton、prototype)的bean
- 【spring教程之四】spring中bean的作用域
- Spring之旅--Spring管理bean的作用域
- Spring 之 Bean的属性注入
- spring bean的作用域
- spring bean的作用域
- Spring---->Bean的作用域
- spring bean的作用域
- MySQL配置文件my.cnf参数优化和中文详解
- Django拦截爬虫请求
- Codeforces Round #352 (Div. 1) A. Recycling Bottles 暴力
- Oracle分页SQL原理与使用(高效)
- mysql 解除正在死锁的状态
- spring之注入不同作用域之间的bean
- Java框架相关笔记整理
- 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
- 八大排序算法
- Crixalis's Equipment
- 【自考】网络经济与企业管理--企业组织结构
- vim的使用
- Android多媒体开发:录音机
- 根据两种遍历顺序确定树结构