Aware接口扩展点的分析
aware字面上的意思为感知,在spring中就是感知容器、bean的时机并进行自定义扩展的
使用

常用的Aware
| 类名 | 作用 |
|---|---|
| LoadTimeWeaverAware | 加载Spring Bean时织入第三方模块,如AspectJ |
| BeanClassLoaderAware | 加载Spring Bean的类加载器 |
| BootstrapContextAware | 资源适配器BootstrapContext,如JCA,CCI |
| ResourceLoaderAware | 底层访问资源的加载器 |
| BeanFactoryAware | 声明BeanFactory |
| PortletConfigAware | PortletConfig |
| PortletContextAware | PortletContext |
| ServletConfigAware | ServletConfig |
| ServletContextAware | ServletContext |
| MessageSourceAware | 国际化 |
| ApplicationEventPublisherAware | 应用事件 |
| NotificationPublisherAware | JMX通知 |
| BeanNameAware | 声明Spring Bean的名字 |
如何实现
- AbstractAutowireCapableBeanFactory
private void invokeAwareMethods(final String beanName, final Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
*/
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}
}
在初始化bean的时候判断bean是否是aware子类本进行回调。对于其他aware子类也应该一样是在设定的业务回调点进行回调。