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; 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 资源加载器