今天看到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 ....................................................
2. 使用方法注入(lookup-method),让容器在运行时重写bean的方法,返回其他bean的新实例。 Spring还提供了定制bean生命周期行为的机制。例如,可以在bean初始化完成后执行特定操作: 1. 使用`init-method`属性,...
例如,在提供的代码示例中,我们看到了一个名为`useType`的Bean实例被定义,并且通过`<lookup-method>`指定了一个名为`getMyType`的方法,该方法返回另一个名为`test.sat.type.MyType.TypeOne`的Bean实例。...
`zope.interface`是Python中用于实现接口(Interface)和依赖注入(Dependency Injection)的一个强大工具,尤其在面向切面编程(Aspect-Oriented Programming, AOP)和构建可扩展的组件系统中发挥着重要作用。...
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...
- Spring提供了对Bean生命周期的精细控制,如初始化方法(init-method)和销毁方法(destroy-method)。 4. **自动装配(Autowiring)** - 自动装配是Spring框架的一个特性,允许容器自动将依赖项匹配到相应的...
Spring 框架是Java开发中的一个核心组件,它提供了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等特性,极大地简化了企业级应用的开发工作。Spring配置文件是Spring...
- Spring框架更轻量级,提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),简化了企业级应用开发。 6. **示例代码分析**: - 无状态会话bean示例可能包含一个无参...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而RMI(Remote Method Invocation)则是Java提供的一种远程方法调用机制,用于构建分布式应用程序。将Spring与RMI结合,可以实现非本地部署的服务,...
Java Spring 框架与 Remote Method Invocation (RMI) 的结合使用是构建分布式应用程序的一种常见方式。本项目提供了一个入门级的源代码示例,帮助开发者理解如何在 Spring 环境下集成 RMI 技术。以下是关于这两个...
- **Spring的依赖**:可以使用`lookup-method`和`replaced-method`对方法进行替换或动态查找。 - **Spring的p命名空间**:提供了一种更简洁的方式来配置bean属性。例如: ```xml 张三" p:age="22"/> ``` - **...
- **面向对象的基础**:熟练掌握面向对象的思想,这对于理解Spring中的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)至关重要。 - **设计模式**:虽然不需要学习所有...
Dependency Injection (依赖注入)** - **定义**: 客户端向系统提供依赖的对象。 - **目的**: 解耦,提高代码的可测试性和可维护性。 - **应用场景**: 在面向对象编程中广泛使用。 **15. Dependency Lookup (依赖...
Dependency Injection (依赖注入) - **定义**:客户端向被测系统提供所依赖的对象。 - **作用**:解耦被测系统与其依赖之间的关系,便于替换和模拟依赖组件。 ##### 15. Dependency Lookup (依赖查找) - **定义**:被...
14. **依赖注入 (Dependency Injection)** - **定义**:客户端向 SUT 提供所需的依赖对象。 - **作用**:降低组件间的耦合度,便于测试。 - **示例**:通过构造函数传递数据库连接到服务层。 15. **依赖查找 ...
##### Dependency Injection (依赖注入) - **定义**:客户端向被测系统提供其所依赖的对象。 - **作用**:降低了耦合度,提高了测试的灵活性和可扩展性。 - **应用场景**: - 在需要替换被测系统的某个组件时,依赖...