6 单例注入多例之注入ApplicationContext
Spring bean
容器中的bean
有单例bean
,也有多例bean
。当我们需要给一个单例beanA
注入一个单例beanB
,或者给一个多例beanA
注入一个多例或单例beanB
时,都可以通过配置让Spring
的bean
容器帮我们完成。但如果我们需要给一个单例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()
方法,对于实现了该接口的bean
,Spring
将通过调度对应的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所写)