Spring中Bean实例化之后做的增强 InstantiationAwareBeanPostProcessor

package sping.analysis.postprocessor;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.stereotype.Component;

/**
 * Bean实例化之后做的增强
 * 
 * @author slHuang
 * @since 2019-02-12
 */
@Component
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
	
	@Override
	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		System.out.println(this.getClass().getName() + ".postProcessBeforeInstantiation()被调用 了...");
		return super.postProcessBeforeInstantiation(beanClass, beanName);
	}
	
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println(this.getClass().getName() + ".postProcessAfterInitialization()被调用 了...");
		return super.postProcessAfterInitialization(bean, beanName);
	}
	
	@Override
	public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
			throws BeansException {
		System.out.println(this.getClass().getName() + ".postProcessProperties()被调用 了...");
		return super.postProcessProperties(pvs, bean, beanName);
	}
	
	@Override
	public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
			String beanName) throws BeansException {
		System.out.println(this.getClass().getName() + ".postProcessPropertyValues()被调用 了...");
		return super.postProcessPropertyValues(pvs, pds, bean, beanName);
	}
}

### Spring 框架中的 Bean 实例化过程 #### 1. 加载配置元数据 Spring 容器通过读取 XML 文件、注解或 Java 配置类来加载关于应用程序对象(即 beans)的定义信息。这些元数据包含了创建和组装应用程序所需的全部必要信息。 #### 2. 注册 BeanDefinition 容器解析并注册每一个 bean 的定义到内部的数据结构中,通常是一个 `BeanFactory` 或者更高级别的 `ApplicationContext` 中。这一步骤会涉及到对各种自定义作用域的支持处理[^1]。 #### 3. 创建 Bean 实例前准备 当请求某个特定类型的 bean 时,在实际创建该对象之前可能会触发一些前置处理器的工作,比如实现了接口 `InstantiationAwareBeanPostProcessor` 和 `MergedBeanDefinitionPostProcessor` 的组件可以在此阶段介入以修改即将被实例化bean 属性或其他特性。 #### 4. 构造函数调用与依赖注入 一旦所有的准备工作完成,则会按照指定的方式——通常是默认无参构造方法或者是带有参数列表的形式去真正构建目标对象;与此同时还会执行设值注入操作给定属性赋初值,并且满足其对外部协作伙伴的需求关系。 ```java // 假设有如下简单的JavaBean public class MyService { private AnotherService anotherService; public void setAnotherService(AnotherService anotherService){ this.anotherService = anotherService; } } ``` 在这个例子中,如果 `MyService` 是由 Spring 管理的一个 bean ,那么它将会经历上述提到的过程,包括但不限于设置它的 `anotherService` 属性。 #### 5. 初始化前后回调机制 对于那些实现了一些特殊生命周期接口的对象来说,它们可以在完全初始化之后得到通知以便一些额外的任务。例如: - 如果一个 bean 实现了 `InitializingBean` 接口的话,那么在其所有属性都被设置了以后就会自动调用 `afterPropertiesSet()` 方法; - 可以为任意 bean 显式地声明 `<bean init-method="methodName"/>` 来指明希望在初始化完成后运行的方法名称; - 同样也存在允许其他监听者参与到这个事件链路里的可能性,如 `ApplicationListener<ContextRefreshedEvent>` 类型的服务会在上下文刷新完毕后收到消息提示。 #### 6. 解决单例模式下的循环依赖问题 针对可能出现的单例模式下 A -> B -> C 这样的环形引用情况,Spring 提供了一个三级缓存方案用于管理正在创建但还未最终装配好的 singleton 对象们。具体而言就是先放入 early 单例对象缓存 (singletonObjects),再逐步完善直至移至正常使用的 final 缓存 (finishedBeans)。 #### 7. 销毁资源释放工作 最后需要注意的是,即使是在应用关闭期间也需要妥善清理不再需要的资源。为此目的而设计有相应的销毁钩子函数可供开发者利用,像 `DisposableBean#destroy()`, 自定义 destroy method, 或者是基于事件驱动模型的通知方式等都可以帮助确保优雅退出而不留下任何垃圾残留物。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值