Aware 接口:
Aware 接口是 Spring 提供的一组标记接口, 表示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);
}
}
}
标签:instanceof,applicationContext,Spring,接口,Aware,bean,源码
From: https://www.cnblogs.com/expiator/p/18326643