一个 bean 的创建过程我想用下面的图来表示:
BeanPostProcessor 的子接口,添加了 实例化前的回调,实例化后、但显式设置属性或自动注入前的回调。
通常用于抑制默认的对特定目标 bean 的初始化,例如给特定的 TargetSources(池化、延迟初始化的目标等)创建代理,或者用于实现额外的注入策略、例如字段注入。
(AnnotationAwareAspectJAutoProxyCreator 实现了该接口避免给特定的 bean 创建代理;AutowiredAnnotationBeanPostProcessor 实现了该接口用于实现 @Autowired/@Value 的字段/方法 注入)
注意:这个接口是个特殊目的的接口,主要用于框架内部。建议尽可能采用实现普通的 BeanPostProcessor 接口,或者继承自 InstantiationAwareBeanPostProcessorAdapter 以绕开对这个接口的扩展。
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { /** * 在 bean 被实例化之前应用。返回的对象可能是个代理而不是目标 bean,有效 隐瞒了目标 bean 的默认创建。 * 如果这个方法返回的是一个非 null 对象,bean的后续创建过程将被短路,只有 BeanPostProcessor.postProcessAfterInitialization 被应用。 */ Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException; /** * 在 bean 被实例化(通过 构造器、工厂方法)后、Spring 设置属性之前执行一些操作。 * 这是在 Spring 自动注入接入之前对给定 bean 实例执行定制的字段注入的理想回调钩子。 */ boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException; /** * 后置处理给定的属性值,在 bean 工厂把它们应用到给定 bean 之前。允许检查所有的依赖是否都满足了。 * 同时也允许替换要应用的属性值,通常是通过基于原始 PropertyValues 创建一个新的 MutablePropertyValues 实例,添加或移除特定的值。 */ PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException; }
InstantiationAwareBeanPostProcessor 接口的扩展,添加了一个回调用于预测处理的 Bean 的最终类型。
注意:这是个特殊目的的接口,主要用于框架内部。通常,应用提供的后置处理器应当简单实现普通的 BeanPostProcessor 接口或继承自 InstantiationAwareBeanPostProcessorAdapter 类。新的方法可能添加到这个接口。
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor { /** * 预测给定 beanName 的最终 Bean 类型 */ Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException; /** * 确定给定 bean 的候选构造器 */ Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException; Object getEarlyBeanReference(Object bean, String beanName) throws BeansException; }
merged bean definition,合并的 bean 定义,是原始 bean 定义的一个拷贝,Spring BeanFacotry 用来创建 bean 实例。
该接口是用于 合并的 bean 定义的 后置处理器接口。BeanPostProcessor 实现可能实现这个子接口以便 后置处理 合并的 bean 定义。
postProcessMergedBeanDefinition 方法可 内省(introspect) bean 定义以便在后置处理实际的 bean 实例之前准备一些元数据缓存。
创建代理;AutowiredAnnotationBeanPostProcessor 实现了该接口用于收集带有 @Autowired/@Value 注解的字符、方法,封装成注入元数据 InjectionMetadata 。
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor { void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName); }
欢迎关注我的微信公众号: coderbee笔记 。