spring之注入不同作用域之间的bean
2016-10-02 16:01
197 查看
在配置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;
}
@Override
public MyHelper getHelper() {
// TODO Auto-generated method stub
return myhelper;
}
@Override
public void someOperation() {
// TODO Auto-gen erated method stub
myhelper.doSomethingHelper();
}
}
定义一个抽象类 并将getHelper方法定义为一个抽象方法 该方法的返回值为被依赖的bean为myhelper 同样实现接口
package com.kevinswift.helper;
public abstract class abstractLookUpDemo implements DemoBean {
//定义抽象方法 该方法由spring来实现
public abstract MyHelper getMyHelper();
@Override
public MyHelper getHelper() {
// TODO Auto-generated method stub
return getMyHelper();
}
@Override
public 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建出来数不同的
首先定义一个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;
}
@Override
public MyHelper getHelper() {
// TODO Auto-generated method stub
return myhelper;
}
@Override
public void someOperation() {
// TODO Auto-gen erated method stub
myhelper.doSomethingHelper();
}
}
定义一个抽象类 并将getHelper方法定义为一个抽象方法 该方法的返回值为被依赖的bean为myhelper 同样实现接口
package com.kevinswift.helper;
public abstract class abstractLookUpDemo implements DemoBean {
//定义抽象方法 该方法由spring来实现
public abstract MyHelper getMyHelper();
@Override
public MyHelper getHelper() {
// TODO Auto-generated method stub
return getMyHelper();
}
@Override
public 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建出来数不同的
相关文章推荐
- 不同作用域(scope)的Spring Bean之间的依赖关系的动态代理注入
- spring 第5天不同作用域的bean,注入Field,方法返回值
- Spring 依赖注入与Bean作用域
- spring boot: 一般注入说明(五) @Component, application event事件为Bean与Bean之间通信提供了支持
- Spring中协调作用域不同的Bean
- Spring注入非单例bean以及scope的作用范围
- 使用方法注入—协调不同作用域(singleton、prototype)的bean
- Spring (二)依赖注入原理 , bean 作用域, 其他配置
- spring 当中session或者request作用域注入单例bean的问题
- Spring注入不同的属性以及BEAN的作用域
- Spring注入非单例bean以及scope的作用范围
- Spring4之Bean之间的关系(继承、依赖、引用)Bean的作用范围
- J2EE系列之Spring4学习笔记(六)--IOC详解(bean之间的关系,bean的作用范围)
- spring注入非单例bean及scope的作用范围
- Spring注入非单例bean以及scope的作用范围
- Spring 注入不同作用域对象
- Spring全家桶(二)Bean之间的关系、自动装配、作用域和使用外部文件
- 用spring的注解建立bean与bean之间的关系组件装配及自动注入依赖对象
- spring(bean初始化、销毁、注入,作用域)
- 通过spring在filter注入bean(DelegatingFilterProxy与servlet filter)