Spring容器被设计成可扩展的,可以通过plugin各种集成接口实现来进行扩展。
用BeanPostPorcesser定制bean:
此接口中定义了几个回调方法,实现该接口可实现自定义的实例化逻辑、依赖解析逻辑等。如果配置了多个BeanPostProcesser,可以通过“order”属性控制BeanPostProcesser的执行次序(仅当BeanPostProcesser实现了Ordered接口时才可以设置此属性)。
注意:
BeanPostProcesser可以对bean的多个实例进行操作,也就是说,Spring IOC容器会为你实例化bean,然后使用BeanPostProcesser处理,BeanPostProcesser的作用域是容器级的,只和所在容器有关,如果你在容器中定义了BeanPostProcesser,那么只对此容器中的bean进行后置处理,不会对另外一个容器中的bean进行处理。
接口中有两个回调方法可以调用,当一个该类的实现类被注册为容器的后置处理器后,对于由此容器创建的每个bean实例在初始化调用前,后置处理器都会从容器获取一个回调,后置处理器可以随意对这个实例执行它所期望的动作,包括完全忽略此回调。通常用来检查标志接口,或者做一些将一个bean包装成一个proxy的事情,一些Spring AOP的底层处理也是通过bean后置处理器来执行代理包装逻辑。
重要的是,ApplicationContext和BeanFactory对待后置处理器稍有不同,ApplicationContext会自动检测在配置文件中实现了BeanPostProcesser接口的所有bean,并把它们注册为后置处理器。然后在容器创建bean的适当时候调用它,而使用BeanFactory的时候要显式地通过代码注册.
例如 :
ConfigurableBeanFactory factory = new XmlBeanFactory(...);
MyBeanPostProcesser postProcesser = new MyBeanPostProcesser();
factory.addPostProcesser(postProcesser);