spring aware 的目的是为了让bean获取spring容器的服务。
常见的aware接口有:
BeanNameAware :可以获取容器中bean的名称
BeanFactoryAware:获取当前bean factory这也可以调用容器的服务
ApplicationContextAware: 当前的applicationContext, 这也可以调用容器的服务
MessageSourceAware:获得message source,这也可以获得文本信息
applicationEventPulisherAware:应用事件发布器,可以发布事件,
ResourceLoaderAware: 获得资源加载器,可以获得外部资源文件的内容;
在bean属性赋值之后,会有这么一层判断
private void invokeAwareMethods(final String beanName, final Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
// 如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法;
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
// 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来;
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
Aware注入Spring底层组件原理
把Spring底层的组件可以注入到自定义的bean中,ApplicationContextAware是利用ApplicationContextAwareProcessor来处理的, 其它XXXAware也类似, 都有相关的Processor来处理, XXXAware---->功能使用了XXXProcessor来处理的;
比如: ApplicaitonContextAware--->ApplicationContextProcessor后置处理器来处理的