`
cyril0513
  • 浏览: 15555 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring ApplicationContext下的一系列aware接口的调用

 
阅读更多
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-aware接口实现与bean作用域(spring多容器层面)

    在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext)进行交互,从而获取或操作由Spring管理的Bean。`ApplicationContextAware`是其中的一个典型接口,当...

    Spring特性——Aware感知特性

    在Spring框架中,Aware接口系列是其核心特性之一,它为Spring容器提供了向bean注入上下文信息的能力。这些接口让bean能够感知到Spring容器的存在,从而获取必要的服务或配置信息。下面我们将深入探讨Spring的Aware...

    第二十章 Spring 应用上下文生命周期(ApplicationContext Lifecycle)1

    同时,注册实现特定Aware接口的BeanPostProcessor,如ApplicationContextAwareProcessor,确保ApplicationContext可以被其他Bean感知。还注册了ResolvableDependency对象,以便于依赖注入。 4. **BeanFactory 后置...

    spring讲义4.txt

    1. **原理概述**:SpringActionSupport继承自Struts框架中的Action基类,同时它又实现了Spring的Aware接口,这意味着它能够感知到Spring容器的存在,从而可以访问Spring管理的bean。 2. **配置说明**: - 首先,...

    Spring Reference - Core Technologies.pdf

    Spring提供了多个Aware接口,如ResourceLoaderAware、BeanClassLoaderAware等,用于让Bean感知到Spring容器的各种资源。 1.7 Bean定义继承 Bean定义可以继承自父定义,使得子定义可以继承父定义的配置属性。 1.8 ...

    Spring_IOC(下)笔记

    此外,Spring提供了一系列的`Aware`接口,让Bean在特定时刻可以获取到Spring容器的相关信息或服务。比如: 1. `BeanNameAware`接口允许Bean在初始化之前知道自己的名字。当Bean被实例化时,Spring会调用`...

    spring其他标签

    在Spring框架中,除了常见的基于XML或注解的配置方式外,还存在一些较为少见但非常实用的标签和接口,这些内容往往能在特定场景下发挥关键作用。本文将详细介绍这些不常见的标签及其应用场景。 #### 二、对象的声明...

    Spring Reference Core Technologies

    Spring还提供了一系列其他Aware接口,可以帮助Bean更好地融入Spring环境。 #### 六、Bean定义继承 通过继承Bean定义,可以复用现有的Bean配置,减少冗余代码。这种方式在配置复杂的应用时非常有用。 总结起来,...

    spring core官方文档.pdf

    - Spring还提供了一系列其他Aware接口,用于让Bean获取更多的上下文信息。 #### 六、Bean定义继承 - **Bean定义继承**:Bean可以继承另一个Bean的定义,从而重用属性和配置信息。这种机制可以减少重复配置,并使...

    Spring笔记(第五次)1

    接下来,我们讨论`Aware`接口系列,这是Spring提供的一组接口,允许自定义组件访问Spring容器的底层组件。例如,`ApplicationContextAware`接口使得我们的bean能够获得`ApplicationContext`的引用,从而可以直接访问...

    spring常见的一些面试题

    **调用Aware接口的方法**:如果Bean实现了`BeanNameAware`或`BeanFactoryAware`等Aware接口,则会调用相应的方法。 4. **调用`BeanPostProcessor`的`postProcessBeforeInitialization`方法**:如果存在Bean后...

    spring相关面试问题.docx

    3. **Aware 接口处理**:Spring 会检查 Bean 是否实现了特定的 xxxAware 接口,例如 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,然后注入相应的上下文信息。 4. **BeanPostProcessor**:如果 ...

    spring-core.pdf

    - **1.6.3 其他Aware接口**: Spring还提供了其他的一些Aware接口,如`EnvironmentAware`等,使得Bean能够获取更多的上下文信息。 以上是对《spring-core.pdf》文档中关于Spring IoC容器的核心内容的总结。通过理解...

    Spring-quartz.zip

    在`src/main/java`下,你可能会找到定义静态任务和动态任务的Java类,而在`src/main/resources`下可能有Spring的配置文件(如`applicationContext.xml`),以及Quartz的配置。 总的来说,这个项目演示了如何在...

    spring guide

    - **Type1接口注入**:通过实现特定的接口(如Aware接口),容器会在实例化对象时调用相应的setter方法来注入依赖。 - **Type2设值注入**:这是最常见的依赖注入方式,通过setter方法注入依赖。 - **Type3构造子注入...

    开源框架面试专题及答案.pdf

    在bean实例化时,会调用一系列初始化方法,使其达到可用状态,而在不再需要时执行析构操作并从容器中移除。Spring提供了多种管理bean生命周期的方法,包括InitializingBean和DisposableBean接口的回调方法,其他...

    DWR+Spring整合案例

    - **集成 DWR-Spring**: 使用 `dwr-spring` 模块,它提供了 Spring-aware 的 `DWRContext` 实现,使得 DWR 可以识别和利用 Spring 容器中的 Bean。 - **配置 Servlet 容器**: 在 `web.xml` 文件中配置 DWR 的 `...

    互联网大厂Java中级面试真题

    在bean实例化时,Spring会调用一系列初始化方法,使bean达到可使用的状态。当bean不再被引用时,会执行相应的析构操作。Spring提供了多种管理bean生命周期的方法,包括: 1. 实现InitializingBean和DisposableBean...

    Java中级面试题 Spring和Netty相关问题

    - **Aware 接口**:用于为 Bean 提供额外的信息感知能力。 - **配置文件中的方法**:在 Bean 的配置文件中声明 `init-method` 和 `destroy-method`。 - **注解方式**:利用 `@PostConstruct` 和 `@PreDestroy` ...

    Spring入门

    - **定义**:Aware接口是一组接口的总称,用于让bean能够意识到Spring容器的存在。 - **作用**:允许bean获取到自身的一些元数据(如ApplicationContext、BeanName等)。 - **示例**:实现`ApplicationContextAware`...

Global site tag (gtag.js) - Google Analytics