`
angie_hawk7
  • 浏览: 48230 次
  • 性别: 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 ....................................................

    spring学习笔记

    2. 使用方法注入(lookup-method),让容器在运行时重写bean的方法,返回其他bean的新实例。 Spring还提供了定制bean生命周期行为的机制。例如,可以在bean初始化完成后执行特定操作: 1. 使用`init-method`属性,...

    spring 静态实例化

    例如,在提供的代码示例中,我们看到了一个名为`useType`的Bean实例被定义,并且通过`&lt;lookup-method&gt;`指定了一个名为`getMyType`的方法,该方法返回另一个名为`test.sat.type.MyType.TypeOne`的Bean实例。...

    zope.interface官方文档教程

    `zope.interface`是Python中用于实现接口(Interface)和依赖注入(Dependency Injection)的一个强大工具,尤其在面向切面编程(Aspect-Oriented Programming, AOP)和构建可扩展的组件系统中发挥着重要作用。...

    EurekaLog_7.5.0.0_Enterprise

    6)....Added: Use ShellExecute option for mailto send method 7)....Added: "Mandatory e-mail only when sending" option 8)....Added: Exception line highlighting in disassember view in EurekaLog exception...

    pro spring 中文版

    - Spring提供了对Bean生命周期的精细控制,如初始化方法(init-method)和销毁方法(destroy-method)。 4. **自动装配(Autowiring)** - 自动装配是Spring框架的一个特性,允许容器自动将依赖项匹配到相应的...

    Spring 配置文件 和详细笔记

    Spring 框架是Java开发中的一个核心组件,它提供了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等特性,极大地简化了企业级应用的开发工作。Spring配置文件是Spring...

    各种EJB之间的调用示例.zip

    - Spring框架更轻量级,提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),简化了企业级应用开发。 6. **示例代码分析**: - 无状态会话bean示例可能包含一个无参...

    spring+rmi实现非本地部署

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而RMI(Remote Method Invocation)则是Java提供的一种远程方法调用机制,用于构建分布式应用程序。将Spring与RMI结合,可以实现非本地部署的服务,...

    java Spring+RMI入门程序源代码

    Java Spring 框架与 Remote Method Invocation (RMI) 的结合使用是构建分布式应用程序的一种常见方式。本项目提供了一个入门级的源代码示例,帮助开发者理解如何在 Spring 环境下集成 RMI 技术。以下是关于这两个...

    spring学习笔记(有代码有注解解释)

    - **Spring的依赖**:可以使用`lookup-method`和`replaced-method`对方法进行替换或动态查找。 - **Spring的p命名空间**:提供了一种更简洁的方式来配置bean属性。例如: ```xml 张三" p:age="22"/&gt; ``` - **...

    对于Spring初学者的学习建议

    - **面向对象的基础**:熟练掌握面向对象的思想,这对于理解Spring中的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)至关重要。 - **设计模式**:虽然不需要学习所有...

    xUnit Test Patterns Refactoring Test

    Dependency Injection (依赖注入)** - **定义**: 客户端向系统提供依赖的对象。 - **目的**: 解耦,提高代码的可测试性和可维护性。 - **应用场景**: 在面向对象编程中广泛使用。 **15. Dependency Lookup (依赖...

    XUNIT测试模式--测试码重构(英文版)

    Dependency Injection (依赖注入) - **定义**:客户端向被测系统提供所依赖的对象。 - **作用**:解耦被测系统与其依赖之间的关系,便于替换和模拟依赖组件。 ##### 15. Dependency Lookup (依赖查找) - **定义**:被...

    xUnit test patterns:测试代码重构

    14. **依赖注入 (Dependency Injection)** - **定义**:客户端向 SUT 提供所需的依赖对象。 - **作用**:降低组件间的耦合度,便于测试。 - **示例**:通过构造函数传递数据库连接到服务层。 15. **依赖查找 ...

    xUnit Test.Patterns Refactoring Test Code

    ##### Dependency Injection (依赖注入) - **定义**:客户端向被测系统提供其所依赖的对象。 - **作用**:降低了耦合度,提高了测试的灵活性和可扩展性。 - **应用场景**: - 在需要替换被测系统的某个组件时,依赖...

Global site tag (gtag.js) - Google Analytics