spring Aware接口

14 Aware 实现分析

通过前面深入理解spring生命周期与BeanPostProcessor的实现原理分析,我们知道Aware的实现是通过BeanPostProcessor
实现的,我们以ApplicationContextAware做分析,实现接口是使用ApplicationContextAwareProcessor接口完成Aware注入,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class ApplicationContextAwareProcessor implements BeanPostProcessor {

private final ConfigurableApplicationContext applicationContext;

private final StringValueResolver embeddedValueResolver;


/**
* Create a new ApplicationContextAwareProcessor for the given context.
*/
public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {
this.applicationContext = applicationContext;
this.embeddedValueResolver = new EmbeddedValueResolver(applicationContext.getBeanFactory());
}


@Override
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
AccessControlContext acc = null;

if (System.getSecurityManager() != null &&
(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
acc = this.applicationContext.getBeanFactory().getAccessControlContext();
}

if (acc != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
invokeAwareInterfaces(bean);
return null;
}
}, acc);
}
else {
invokeAwareInterfaces(bean);
}

return bean;
}

private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
}
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}

}

在上述代码invokeAwareInterfaces中我们可以看的,每一个初始化的bean 是否实现其中的Aware接口,并回调注入参数属性,类似函数回调方式

要想实现自己的组件,我们也可以安装spring的实现方式,提供一个BeanPostProcessor接口,并在初始化时判断bean是否实现自定义的Aware接口,如果实现时,通过回调方式调用接口方法

Aware常用的实现类

  • ApplicationContextAware 自动注入IOC容器
  • ApplicationEventPublisherAware 注入事件派发器
  • BeanClassLoaderAware 类加载器
  • BeanFactoryAware Bean工厂
  • BeanNameAware Bean名字
  • EmbeddedValueResolverAware Embedded值解析器
  • EnvironmentAware 环境
  • ImportAware 导入相关的
  • LoadTimeWeaverAware 导入相关的
  • MessageSourceAware 国际化
  • NotificationPublisherAware 发送通知的支持
  • ResourceLoaderAware 资源加载器