Elim的博客

用来记录一些原创性的总结


Elim

6 单例注入多例之注入ApplicationContext

Spring bean容器中的bean有单例bean,也有多例bean。当我们需要给一个单例beanA注入一个单例beanB,或者给一个多例beanA注入一个多例或单例beanB时,都可以通过配置让Springbean容器帮我们完成。但如果我们需要给一个单例beanA注入一个多例beanB时,仅仅通过配置Spring是无法帮我们的单例beanA注入一个多例beanB的,即无法让我们每次使用beanB时都使用的是一个全新的beanB。因为beanA只初始化一次,相对应的Spring只会给beanA注入一个beanB。解决办法是给beanA注入一个ApplicationContext,这样我们就可以在每次需要使用beanB时都从ApplicationContext中获取一个新的beanB
注入ApplicationContext有两种方式,实现ApplicationContextAware接口和通过@Autowired@Resource注解标注让Spring进行自动注入。

6.1 实现ApplicationContextAware接口

ApplicationContextAware接口中定义了一个setApplicationContext()方法,对于实现了该接口的beanSpring将通过调度对应的setApplicationContext()方法将当前ApplicationContext传递过去。

public class Hello implements ApplicationContextAware {
	
	private ApplicationContext applicationContext;

	/**
	 * Spring将通过该方法给我们的bean注入当前的ApplicationContext
	 */
	public void setApplicationContext(ApplicationContext applicationContext) {
		this.applicationContext = applicationContext;
	}
	
}

6.2 通过注解标注

我们知道在使用注解进行配置时,我们也可以通过注解来告诉Spring要为当前的bean注入哪些内容。对于ApplicationContext也是一样的,我们可以通过对应的注解来告诉Spring将为我们注入对应的ApplicationContext。自动注入的注解可以是@Resource,也可以是@Autowired

public class Hello {
	
	private ApplicationContext applicationContext;

	@Resource
	public void setApplicationContext(ApplicationContext applicationContext) {
		this.applicationContext = applicationContext;
	}
	
}

(注:本文是基于Spring4.1.0所写)