今天看到method injection这块,网上查了下,又了看了下reference,作个总结加备份吧算是,以下实例来自网络,可以运行
Lookup method injection使Spring克服当一个bean依赖其他不同生命周期的bean的情况,比如当一个单例bean依赖一个非单例对象的时候。在这种情况下,无论是使用setter注入还是constructor注入都只是在单例对象中维护一个非单例bean的一个单例(也就是一个相同的实例)。但是有些情况下,你将希望你的bean每次请求一个非单例bean的实例时都能够获得一个新的实例。
下面的例子中创建了两个单例bean和一个非单例bean;所有的单例bean实现相同的接口。一个单例bean使用setter注入获得非单例bean的实例,另外一个使用method injection。
public class MyHelper {
public void doSomethingHelpful() {
}
}
public interface DemoBean {
MyHelper getMyHelper();
void someOperation();
}
public class StandardLookupDemoBean implements DemoBean {
private MyHelper helper;
public void setMyHelper(MyHelper helper) {
this.helper = helper;
}
public MyHelper getMyHelper() {
return this.helper;
}
public void someOperation() {
helper.doSomethingHelpful();
}
}
public abstract class AbstractLookupDemoBean implements DemoBean {
public abstract MyHelper getMyHelper();
public void someOperation() {
getMyHelper().doSomethingHelpful();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helper" class="com.inspur.methodInjection.MyHelper" scope="prototype" />
<bean id="abstractLookupBean" class="com.inspur.methodInjection.AbstractLookupDemoBean">
<lookup-method name="getMyHelper" bean="helper" />
</bean>
<bean id="standardLookupBean" class="com.inspur.methodInjection.StandardLookupDemoBean">
<property name="myHelper" ref="helper" />
</bean>
</beans>
引用
注意上面的配置文件,使用<lookup-method>配置abstractLookupBean的lookup method。<lookup-method>元素的name属性用于告诉Spring重载bean的那个方法。这个方法不能有任何参数,并且返回值应该是你希望使用得到的那个bean类型。bean属性告诉Spring,lookup method应该返回那个bean
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("bean4.xml"));
stressTest(factory, "abstractLookupBean");
stressTest(factory, "standardLookupBean");
}
private static void stressTest(XmlBeanFactory factory, String beanName) {
DemoBean bean = (DemoBean) factory.getBean(beanName);
MyHelper helper1 = bean.getMyHelper();
MyHelper helper2 = bean.getMyHelper();
System.out.println("Testing " + beanName);
System.out.println("Helper Instances the Same?: "+ (helper1 == helper2));
StopWatch stopWatch = new StopWatch();
stopWatch.start("lookupDemo");
for (int i = 0; i < 100000; i++) {
MyHelper helper = bean.getMyHelper();
helper.doSomethingHelpful();
}
stopWatch.stop();
System.out.println("100000 gets took " + stopWatch.getTotalTimeMillis()+ " ms");
}
Testing abstractLookupBean
Helper Instances the Same?: false
100000 gets took 391 ms
Testing standardLookupBean
Helper Instances the Same?: true
100000 gets took 15 ms
引用
使用standardLookupBean获得的对象是相同的,使用abstractLookupBean得到的对象不同。当然,性能差别也是显而易见的。产生性能差别的主要原因是因为我们设置helper bean的范围是prototype,这将导致每次在abstractDemoBean中调用abstractLookupBean的getMyHelper()方法都产生一个helper bean的新实例;第二个原因是因为abstractLookupBean实际上是AbstractLookupDemoBean类的一个CGLIB代理,代理拦截对getMyHelper()方法的所有调用并且返回helper bean,拦截机制的本质也是导致性能下降的原因。
分享到:
相关推荐
Dependency injection ....................................................................................... 32 Constructor-based dependency injection ....................................................
Dependency injection ....................................................................................... 32 Constructor-based dependency injection ....................................................
【亲测可用】Revit 2020 Lookup Tables是Revit表格查找工具,是revit开发必不可少的一个组件,需要的朋友可以下载! 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2019下...
RevitLookup-2021.0.0.13,供各位做REVIT二次开发的同仁们下载、学习、研究。
vc错误查看工具lookup vc错误查看工具lookup
requestUtils lookup方法简介
Revit二次开发必助插件revit lookup,辅助开发人员查看revit内部结构。方便开和学习内部结构
Revit2018的Lookup
revit开发必备工具 本包中是已经编译过的文件,可以直接使用 ...编辑其中RevitLookup.dll 路径为编译路径 C:\RevitLookup-2016.0.0.6\CS\bin\Debug\RevitLookup.dll 重启revit: 即可在菜单栏看到工具
informatica lookup 组件使用案例
Revit 2018 Lookup Tables顾名思义就是Revit表格查找工具,revit二次开发是离不开这个按钮的,由于revit中管件和线管配件族的尺寸参数会随着公称直径的变化而变化,revit可以通过这个按钮来实现这个功能,是revit...
详解lookup滤镜原理及用法,Lookup是基于图片颜色映射的一种滤镜,它可以实现各种各样的效果。
revit lookup 2020安装包,编译好的安装包msi文件,一键安装即可方便快捷,安装之后打开Revit选择总是加载即可永久使用此插件。
excel 函数教程 lookup函数的经典查找使用方式
LOOKUP函数处理内存数组,LOOKUP高级应用.
用NetBeans8.0做的的一个lookup查询的例子
RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5
Ofbiz的Lookup字段,讲解ofbiz辅助输入,包括文本,选择框,日期,时间,主从文本框。后面还介绍一下自定义修改的Lookup
RevitLookup - 2016 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2016下即可
RevitLookup - 2017 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2017下即可