`
ponlya
  • 浏览: 164645 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring3之 bean Method injection

阅读更多

Method injection(方法注入

bean都是singleton类型的。如果一个singleton bean要引用另外一个singleton bean,或者一个非singleton bean要引用另外一个非singleton bean时,通常情况下将一个bean定义为另一个bean的property值就可以了。不过对于具有不同生命周期的bean来说这样做就会有问题了,比如在调用一个singleton类型bean A的某个方法时,需要引用另一个非singleton(prototype)类型的bean B,对于bean A来说,容器只会创建一次,这样就没法在需要的时候每次让容器为bean A提供一个新的的bean B实例。

官方建议:You can make bean A aware of the container by implementing the ApplicationContextAware interface, and by making a getBean("B") call to the container ask for (a typically new) bean B instance every time bean A needs it.

http://blog.csdn.net/zml2004/archive/2006/04/15/664309.aspx例子

Lookup Method Injection 

 

 

<!--EndFragment-->

com.spring305.test.methodInjection.RandomT.java

public class RandomT{

    private int num = (int)(100*Math.random());
    public void printRandom(){
        System.out.println("随机数是"+num);
    }
}

 

com.spring305.test.methodInjection.HelloRandom.java

//一个代理接口
public interface HelloRandom {
	
	public RandomT getRandom();
	public abstract RandomT createRandom(); // 这个方法最为重要,是方法注入的关键
	
}

 

com.spring305.test.methodInjection.HelloAbstract.java

public abstract class HelloAbstract implements HelloRandom {

	private RandomT random;
	public void setRandom(RandomT random) {
		this.random = random;
	}

	public abstract RandomT createRandom();

	@Override
	public RandomT getRandom() {
		// TODO Auto-generated method stub
		return this.random;
	}
}

 

src/methodInjection.xml

 <!-- 方法注入-->
     <bean id="myRandom" class="com.spring305.test.methodInjection.RandomT"  scope="prototype" />
     <!--  scope="singleton" -->
     <bean id="helloRandom" class="com.spring305.test.methodInjection.HelloAbstract" >
           <lookup-method name="createRandom" bean="myRandom"/>
           <property name="random">
                   <ref local="myRandom" />    
           </property>
    </bean>

 Test

//@Test
public void testMethodInjection(){
        ApplicationContext context = new ClassPathXmlApplicationContext("methodInjection.xml");
         HelloRandom helloRandom1 = (HelloRandom)context.getBean("helloRandom");
         System.out.println("下面两个实例没有采用方法注入");
         RandomT r1 = helloRandom1.getRandom();
         RandomT r2 = helloRandom1.getRandom();
         System.out.println("Random 的两个实例是否指向同一个引用:" + (r1 == r2));
         r1.printRandom();
         r2.printRandom();
         System.out.println();
         System.out.println("下面两个实例采用方法注入");
         HelloRandom helloRandom = (HelloRandom)context.getBean("helloRandom");
         RandomT r3 = helloRandom.createRandom();
         RandomT r4 = helloRandom.createRandom();
         System.out.println("Random 的两个实例是否指向同一个引用:" + (r3 == r4));
         r3.printRandom();
         r4.printRandom();
}

 

另官方没有给这种Lookup方法注入而是提供了:Arbitrary method replacement方法替换:

com.spring305.test.methodInjection.MyValueCalculator.java

public class MyValueCalculator {

	public String computeValue(String input) {
		return input+"_"+(int)(100*Math.random());
	}

}

 

com.spring305.test.methodInjection.ReplacementComputeValue.java

public class ReplacementComputeValue implements MethodReplacer {

	@Override
	public Object reimplement(Object obj, Method method, Object[] args)
			throws Throwable {
		String input = (String) args[0];
		input += "123";
		
		return input;
	}
}

 xml中再加上:

  <bean id="myValueCalculator" class="com.spring305.test.methodInjection.MyValueCalculator">
	<!-- arbitrary method replacement -->
	<replaced-method name="computeValue" replacer="replacementComputeValue">
		<arg-type>String</arg-type> 
	</replaced-method>
	<!-- <replaced-method name="computeValue" replacer="helloReplacer"/> -->
</bean>
<bean id="replacementComputeValue" class="com.spring305.test.methodInjection.ReplacementComputeValue"/>

 

测试:

@Test
	public void testMethod(){
		 ApplicationContext context = new ClassPathXmlApplicationContext("methodInjection.xml");
		 ReplacementComputeValue reValue = context.getBean("replacementComputeValue",ReplacementComputeValue.class);
		 
		 MyValueCalculator myValueCalculator = context.getBean("myValueCalculator",MyValueCalculator.class);
		 System.out.println(myValueCalculator.computeValue("add"));;
		 
	}

 

 

分享到:
评论

相关推荐

    spring bean XML配置入门

    在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...

    spring IOC反射装载bean

    在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和管理Bean,并利用Java的反射机制来实例化这些Bean。 首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些...

    Spring 实例化Bean的三种方式

    其中,Bean的实例化是Spring框架的核心功能之一,它支持多种实例化Bean的方式,以适应不同的应用场景和需求。本文将深入探讨Spring中实例化Bean的三种主要方式:构造器注入、静态工厂方法注入以及实例工厂方法注入。...

    Spring--2.Spring 中的 Bean 配置-1

    5. **依赖注入**: Spring的核心特性之一就是依赖注入(Dependency Injection,DI)。它允许我们将对象的依赖关系从代码中解耦出来,使系统更易于测试和维护。Spring支持构造器注入、setter注入和接口注入等多种方式...

    spring装配bean实例代码

    在Spring框架中,Bean装配是核心功能之一,它负责初始化、配置和管理应用程序中的对象。本文将深入探讨Spring装配Bean的实例代码,帮助你更好地理解这一关键概念。 首先,Spring装配Bean主要有两种方式:XML配置和...

    Spring Bean生命周期&BeanDefinitions1

    3. **Bean接口回调**:如果Bean实现了特定的接口,如`BeanNameAware`、`BeanFactoryAware`或`ApplicationContextAware`,Spring会在适当的时候调用对应的回调方法。这些接口允许Bean获取其ID、BeanFactory引用或...

    Spring源码学习二:BeanDefinition解析1

    在Spring框架中,BeanDefinition是核心组件之一,它定义了bean的基本信息和元数据,包括bean的类、作用域、依赖关系、初始化方法等。在Spring容器启动时,配置文件或注解中的bean定义会被解析成BeanDefinition对象,...

    [web工程]集成spring3

    Spring 3是Java企业级应用开发的一个关键组件,它提供了强大的依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)以及全面的Web MVC支持。下面,我们将详细讲解集成过程中的...

    Spring学习笔记之bean的基础知识

    Spring通过依赖注入(Dependency Injection,简称DI)来管理Bean之间的关系。依赖注入有两种主要方式:设值注入(Setter Injection)和构造器注入(Constructor Injection)。 - **设值注入**:通过`&lt;property&gt;`...

    Spring DI原理.docx

    3. **初始化回调**:一旦所有依赖注入完成,Spring会调用Bean的`init-method`指定的方法,如果有的话,允许Bean在完全准备好使用之前进行进一步的初始化。 4. **AOP代理**:如果Bean配置了AOP代理,Spring会在Bean...

    Spring3 注解初级实例

    4. **方法注入(Method Injection)**:`@PostConstruct`和`@PreDestroy`注解分别标识初始化方法和清理方法,Spring会在bean初始化和销毁时调用它们。 5. **AOP注解**:`@Aspect`定义了一个切面,`@Before`、`@...

    Spring高级篇二.pdf

    &lt;bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"&gt; &lt;/bean&gt; ``` #### 四、Spring Bean的生命周期 - **初始化和销毁方法**: - 初始化方法可以通过`init-method`属性指定,而销毁方法...

    springioc的详细讲解

    Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,使得应用程序不再负责对象的生命周期,而是由Spring容器来负责。这种设计模式...

    spring3.x企业应用实战开发-源码

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,通过DI,我们可以将对象之间的耦合度降到最低,使得代码更易于测试和维护。在源码中,可以看到不同组件如何通过构造器、setter方法或接口实现DI...

    spring学习心得

    资源释放:&lt;bean destroy-method=""/&gt;仅对单例对象有效 (2)IoC概念 Inversion of Control 控制反转或控制转移 Don't Call Me,We will call you! 控制权:对象的创建和调用关系的控制. (3)DI概念 Dependecy ...

    Spring系列面试题129道(附答案解析)

    20、springbean容器的生命周期是什么样的? Spring Bean的生命周期包括以下几个主要阶段: - Bean的实例化。 - 对Bean进行属性赋值和依赖注入。 - 如果Bean实现了BeanNameAware、BeanFactoryAware等接口,会调用相应...

    Spring配置文件spring-context.zip

    3. `dependency injection (DI)`:通过`&lt;property&gt;`、`&lt;constructor-arg&gt;`等标签实现。例如,如果`ExampleClass`需要一个`Service`对象,可以这样设置依赖: ```xml &lt;bean id="exampleBean" class=...

    最新spring3开发包

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一是DI,它使得组件之间的耦合度降低,提高了代码的可测试性和可维护性。在Spring3中,DI可以通过XML配置、注解或基于Java的配置实现。 2. **AOP...

Global site tag (gtag.js) - Google Analytics