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子类也应该一样是在设定的业务回调点进行回调。