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