Aware 接口:
Aware 接口 表示bean可以通过回调方法从Spring容器接收特定框架对象的通知。
public interface Aware {}
Spring提供了大量以 Aware 命名的接口,如BeanNameAware、BeanFactoryAware、ApplicationContextAware等。
这些接口定义了回调方法,通过这些回调方法,Spring容器可以将容器中的一些资源、状态、环境信息注入到Bean中。
Aware示例:
可以参阅 org.springframework.context.support.ApplicationContextAwareProcessor 和org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
这些代码中用于处理Aware接口回调的示例。
- ApplicationContextAwareProcessor 的 Aware 使用示例:
代码:org.springframework.context.support.ApplicationContextAwareProcessor#invokeAwareInterfaces
首先会判断对象是否属于 Aware接口类型,接着根据不同的Aware接口实现类,调用不同的实现类的逻辑。
private void invokeAwareInterfaces(Object bean) {//首先会判断对象是否属于 Aware接口类型if (bean instanceof Aware) {//根据不同的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) {//设置EventPublisher((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware) {((MessageSourceAware) bean).setMessageSource(this.applicationContext);}if (bean instanceof ApplicationContextAware) {((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);}}}
- AbstractAutowireCapableBeanFactory 的 Aware 示例:
代码: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods
也是同样的判断对象是否属于 对应的Aware接口类型。
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);}}}