`
angie_hawk7
  • 浏览: 46985 次
  • 性别: Icon_minigender_1
  • 来自: 乌托邦
社区版块
存档分类
最新评论

Lookup Method Injection

阅读更多
今天看到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,拦截机制的本质也是导致性能下降的原因。
分享到:
评论
1 楼 Sartner 2012-05-15  
well play

相关推荐

    spring-framework-reference4.1.4

    Dependency injection ....................................................................................... 32 Constructor-based dependency injection ....................................................

    spring-framework-reference-4.1.2

    Dependency injection ....................................................................................... 32 Constructor-based dependency injection ....................................................

    【含源码和addin】RevitLookup 2020

    【亲测可用】Revit 2020 Lookup Tables是Revit表格查找工具,是revit开发必不可少的一个组件,需要的朋友可以下载! 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2019下...

    RevitLookup-2021.0.0.13

    RevitLookup-2021.0.0.13,供各位做REVIT二次开发的同仁们下载、学习、研究。

    vc错误查看工具lookup

    vc错误查看工具lookup vc错误查看工具lookup

    requestUtils lookup方法简介

    requestUtils lookup方法简介

    RevitLookup-2019.0.0.3.rar

    Revit二次开发必助插件revit lookup,辅助开发人员查看revit内部结构。方便开和学习内部结构

    RevitLookup2018

    Revit2018的Lookup

    RevitLookup-2016.0.0.6 已编译 直接使用

    revit开发必备工具 本包中是已经编译过的文件,可以直接使用 ...编辑其中RevitLookup.dll 路径为编译路径 C:\RevitLookup-2016.0.0.6\CS\bin\Debug\RevitLookup.dll 重启revit: 即可在菜单栏看到工具

    informatica lookup 组件使用案例

    informatica lookup 组件使用案例

    Revit2018 Lookup

    Revit 2018 Lookup Tables顾名思义就是Revit表格查找工具,revit二次开发是离不开这个按钮的,由于revit中管件和线管配件族的尺寸参数会随着公称直径的变化而变化,revit可以通过这个按钮来实现这个功能,是revit...

    lookup滤镜详解.docx

    详解lookup滤镜原理及用法,Lookup是基于图片颜色映射的一种滤镜,它可以实现各种各样的效果。

    RevitLookup-2020.0.0.4.zip

    revit lookup 2020安装包,编译好的安装包msi文件,一键安装即可方便快捷,安装之后打开Revit选择总是加载即可永久使用此插件。

    lookup函数的使用

    excel 函数教程 lookup函数的经典查找使用方式

    LOOKUP函数处理内存数组

    LOOKUP函数处理内存数组,LOOKUP高级应用.

    NetBeans lookup的例子

    用NetBeans8.0做的的一个lookup查询的例子

    RevitLookup-2017.0.0.5

    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字段,讲解ofbiz辅助输入,包括文本,选择框,日期,时间,主从文本框。后面还介绍一下自定义修改的Lookup

    RevitLookup - 2016

    RevitLookup - 2016 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2016下即可

    RevitLookup - 2017

    RevitLookup - 2017 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2017下即可

Global site tag (gtag.js) - Google Analytics