ApplicationContext的一系列aware回调接口,是通过实现BeanPostProcessor来实现的,当bean工厂启动后实力化BEAN就会回调这一系列的aware接口
class ApplicationContextAwareProcessor implements BeanPostProcessor {
//当bean实例化之前,会调用此方法对bean进行处理
这是官方的解释:
Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code> * or a custom init-method)
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
AccessControlContext acc = null;
if (System.getSecurityManager() != null &&
(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
acc = this.applicationContext.getBeanFactory().getAccessControlContext();
}
if (acc != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
invokeAwareInterfaces(bean);
return null;
}
}, acc);
}
else {
invokeAwareInterfaces(bean);
}
return bean;
}
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(
new EmbeddedValueResolver(this.applicationContext.getBeanFactory()));
}
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);
}
}
}
}
可以看到所有的aware接口统统在此处回调,哪这个类到底在哪里会被调用呢?
在AbstractAutowireCapableBeanFactory里面
方法如下:
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}
这里是总的入口,但是ApplicationContextAwareProcessor的实例是什么时候到AbstractAutowireCapableBeanFactory的getBeanPostProcessors返回的集合里面的呢?
答案还得回到AbstractApplicationContext类里面
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
//此处就是调用的地方
prepareBeanFactory(beanFactory);
.....................................................
}
实现为:
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
.............省略其他的代码...........
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
.............省略其他的代码...........
}
在这里就将该实例该ApplicationContextAwareProcessor实例绑定到了beanFactory上了,所以当beanfactory回调beanPostProcess接口的时候,就可以执行这里面的postProcessBeforeInitialization方法了。
分享到:
相关推荐
在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext)进行交互,从而获取或操作由Spring管理的Bean。`ApplicationContextAware`是其中的一个典型接口,当...
在Spring框架中,Aware接口系列是其核心特性之一,它为Spring容器提供了向bean注入上下文信息的能力。这些接口让bean能够感知到Spring容器的存在,从而获取必要的服务或配置信息。下面我们将深入探讨Spring的Aware...
同时,注册实现特定Aware接口的BeanPostProcessor,如ApplicationContextAwareProcessor,确保ApplicationContext可以被其他Bean感知。还注册了ResolvableDependency对象,以便于依赖注入。 4. **BeanFactory 后置...
1. **原理概述**:SpringActionSupport继承自Struts框架中的Action基类,同时它又实现了Spring的Aware接口,这意味着它能够感知到Spring容器的存在,从而可以访问Spring管理的bean。 2. **配置说明**: - 首先,...
Spring提供了多个Aware接口,如ResourceLoaderAware、BeanClassLoaderAware等,用于让Bean感知到Spring容器的各种资源。 1.7 Bean定义继承 Bean定义可以继承自父定义,使得子定义可以继承父定义的配置属性。 1.8 ...
此外,Spring提供了一系列的`Aware`接口,让Bean在特定时刻可以获取到Spring容器的相关信息或服务。比如: 1. `BeanNameAware`接口允许Bean在初始化之前知道自己的名字。当Bean被实例化时,Spring会调用`...
在Spring框架中,除了常见的基于XML或注解的配置方式外,还存在一些较为少见但非常实用的标签和接口,这些内容往往能在特定场景下发挥关键作用。本文将详细介绍这些不常见的标签及其应用场景。 #### 二、对象的声明...
Spring还提供了一系列其他Aware接口,可以帮助Bean更好地融入Spring环境。 #### 六、Bean定义继承 通过继承Bean定义,可以复用现有的Bean配置,减少冗余代码。这种方式在配置复杂的应用时非常有用。 总结起来,...
- Spring还提供了一系列其他Aware接口,用于让Bean获取更多的上下文信息。 #### 六、Bean定义继承 - **Bean定义继承**:Bean可以继承另一个Bean的定义,从而重用属性和配置信息。这种机制可以减少重复配置,并使...
接下来,我们讨论`Aware`接口系列,这是Spring提供的一组接口,允许自定义组件访问Spring容器的底层组件。例如,`ApplicationContextAware`接口使得我们的bean能够获得`ApplicationContext`的引用,从而可以直接访问...
**调用Aware接口的方法**:如果Bean实现了`BeanNameAware`或`BeanFactoryAware`等Aware接口,则会调用相应的方法。 4. **调用`BeanPostProcessor`的`postProcessBeforeInitialization`方法**:如果存在Bean后...
3. **Aware 接口处理**:Spring 会检查 Bean 是否实现了特定的 xxxAware 接口,例如 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,然后注入相应的上下文信息。 4. **BeanPostProcessor**:如果 ...
- **1.6.3 其他Aware接口**: Spring还提供了其他的一些Aware接口,如`EnvironmentAware`等,使得Bean能够获取更多的上下文信息。 以上是对《spring-core.pdf》文档中关于Spring IoC容器的核心内容的总结。通过理解...
在`src/main/java`下,你可能会找到定义静态任务和动态任务的Java类,而在`src/main/resources`下可能有Spring的配置文件(如`applicationContext.xml`),以及Quartz的配置。 总的来说,这个项目演示了如何在...
- **Type1接口注入**:通过实现特定的接口(如Aware接口),容器会在实例化对象时调用相应的setter方法来注入依赖。 - **Type2设值注入**:这是最常见的依赖注入方式,通过setter方法注入依赖。 - **Type3构造子注入...
在bean实例化时,会调用一系列初始化方法,使其达到可用状态,而在不再需要时执行析构操作并从容器中移除。Spring提供了多种管理bean生命周期的方法,包括InitializingBean和DisposableBean接口的回调方法,其他...
- **集成 DWR-Spring**: 使用 `dwr-spring` 模块,它提供了 Spring-aware 的 `DWRContext` 实现,使得 DWR 可以识别和利用 Spring 容器中的 Bean。 - **配置 Servlet 容器**: 在 `web.xml` 文件中配置 DWR 的 `...
在bean实例化时,Spring会调用一系列初始化方法,使bean达到可使用的状态。当bean不再被引用时,会执行相应的析构操作。Spring提供了多种管理bean生命周期的方法,包括: 1. 实现InitializingBean和DisposableBean...
- **Aware 接口**:用于为 Bean 提供额外的信息感知能力。 - **配置文件中的方法**:在 Bean 的配置文件中声明 `init-method` 和 `destroy-method`。 - **注解方式**:利用 `@PostConstruct` 和 `@PreDestroy` ...
- **定义**:Aware接口是一组接口的总称,用于让bean能够意识到Spring容器的存在。 - **作用**:允许bean获取到自身的一些元数据(如ApplicationContext、BeanName等)。 - **示例**:实现`ApplicationContextAware`...