-
扩展点简述
Factory hook that allows for custom modification of new bean instances — for example, checking for marker interfaces or wrapping beans with proxies. Typically, post-processors that populate beans via marker interfaces or the like will implement {@link #postProcessBeforeInitialization}, while post-processors that wrap beans with proxies will normally implement {@link #postProcessAfterInitialization}.
-
扩展点的生命周期及扩展点的执行时机
属于Bean的实例化阶段扩展,针对于任何Bean的实例化。
执行时机分别位于InitializingBean's afterPropertiesSet方法或者init-method之前和之后,
此时Bean以及实例化完成,对象属性已经注入。
-
扩展点的作用
对实例化Bean做进一步的处理,在扩展时机前后调用,把控好时机扩展就好。
比如做一些注解配置的处理等,其他的博主暂时想不到有好的玩法/(ㄒoㄒ)/~~
-
扩展点实战
/**
* BeanPostProcessor接口默认实现了postProcessBeforeInitialization和postProcessAfterInitialization两个方法,
* 作用范围:任何Bean实例化对象
* 方法执行时机:参照各方法注释
*/
@Component
public class TestBeanPostProcess implements BeanPostProcessor {
/**
* Apply this {@code BeanPostProcessor} to the given new bean instance <i>before</i> any bean
* initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
* or a custom init-method).
*
* 执行时机:InitializingBean's afterPropertiesSet方法或者init-method之前执行。
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor-Before: " + beanName);
return bean;
}
/**
* Apply this {@code BeanPostProcessor} to the given new bean instance <i>after</i> any bean
* initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
* or a custom init-method).
* <p>In case of a FactoryBean, this callback will be invoked for both the FactoryBean
* instance and the objects created by the FactoryBean (as of Spring 2.0).
*
* 执行时机:InitializingBean's afterPropertiesSet方法或者init-method之后。
*
* 注意:Spring2.0后,FactoryBean也要走这个方法。
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor-After: " + beanName);
return bean;
}
}
-
BeanPostProcessor的扩展资料
不仅可以实现BeanPostProcessor扩展,Spring还有一些他的子类也提供了扩展:
-
DestructionAwareBeanPostProcessor
在销毁该BeanPostProcessor之前,将其应用于给定的bean实例。
例如,调用自定义销毁回调。像DisposableBean的destroy和自定义destroy方法一样,
此回调仅适用于生命周期完全被容器管理的Bean。 单例和作用域bean通常是这种情况。 -
InstantiationAwareBeanPostProcessor
添加了实例化之前的回调,以及在实例化之后但设置了显式属性或发生自动装配之前的回调。
通常用于抑制特定目标Bean的默认实例化,例如创建具有特殊TargetSource的代理(池目标,延迟初始化目标等),或实现其他注入策略,例如字段注入。
但官方说这个一般应用于内部代码,所以扩展须掌握会具体影响到哪些Bean。
更多Spring扩展请查看专题Spring开发笔记。
网友评论