Spring中很多接口带有Aware后缀,具体什么含义呢?
Aware本身就是一个接口:
public interface Aware {}
字面意思是通知,本身其实是回调接口,也带有标记接口的意味。Spring会把检测实现了Aware接口的bean,然后调用其接口方法。接口方法一般是设置某一个变量的回调,也就是spring回调实现方的aware方法,将某一个变量回传。
比如说ApplicationContextAware接口:
public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext applicationContext) throws BeansException;}
spring会把当前的application容器传进来,这样实现方就可以拿到容器引用了。
所以xxxAware的含义就是,spring会通过回调把xxx传给实现方。
再看BeanNameAware接口:
public interface BeanNameAware extends Aware {void setBeanName(String name);}
将bean的name传回来。
那么,aware接口是在哪里被回调的呢?
首先,肯定是在bean实例化时回调的,因为是想给bean设置某一种属性。另外,不同的aware可能在不同的地方调用,比如说BeanNameAware,这个可以是高级容器也可以是低级容器,而ApplicationContextAware肯定是针对高级容器的。
对于高级容器相关特性的Aware回调是在ApplicationContextAwareProcessor类中的:
private void invokeAwareInterfaces(Object bean) {if (bean instanceof Aware) {if (bean instanceof EnvironmentAware) {((EnvironmentAware) bean).setEnvironment(Environment());}if (bean instanceof EmbeddedValueResolverAware) {((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(new EmbeddedValueResolver(BeanFactory()));}if (bean instanceof ResourceLoaderAware) {((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);}if (bean instanceof ApplicationEventPublisherAware) {((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware) {((MessageSourceAware) bean).setMessageSource(this.applicationContext);}if (bean instanceof ApplicationContextAware) {((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);}}}
该类本身是一个BeanPostProcessor,上面的方法是在postProcessBeforeInitialization中实现的。
而对于低级容器相关特性的Aware,是在低级容器的抽象类AbstractAutowireCapableBeanFactory中实现的,
在其initializeBean方法中,有一段代码:
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) {((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}}
最后再看一个例子:
public class MyAware implements ApplicationContextAware, BeanNameAware {private ApplicationContext applicationContext;private String name;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public ApplicationContext getApplicationContext() {return applicationContext;}@Overridepublic void setBeanName(String name) {this.name = name;}public String getName() {return name;}
}
这是Aware实现类,下面是bean定义:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi=""xsi:schemaLocation=" .xsd"><bean class="com.liyao.MyAware"/>
</beans>
main:
public static void main(String args[]) {ApplicationContext c1 = new ClassPathXmlApplicationContext(l");MyAware myAware = (MyAware) c1.getBean(MyAware.class);System.out.ApplicationContext().getBean(MyAware.class).getName());}
输出:
com.liyao.MyAware#0
Process finished with exit code 0
本文发布于:2024-02-05 07:56:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170727824964732.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |