init-method,afterPropertiesSet和BeanPostProcessor的作用都是能使用户在spring bean初始化时完成自定义的方法,但实现的方式各有不同,顺序从先到后依次是:BeanPostProcessor的postProcessBeforeInitialization > afterPropertiesSet > init-method > BeanPostProcessor的postProcessAfterInitialization
-
BeanPostProcessor:
-
概念:BeanPostProcessor允许自定义修改SpringBeanFactory创建的新的bean实例。BeanPostProcessor接口由两个回调方法组成,分别是postProcessBeforeInitialization 和postProcessAfterInitialization。对于由容器创建的每个bean实例,BeanPostProcessor都会在调用容器初始化方法之前和之后从容器中回调这个bean。一些spring AOP的类(如:AbstractAdvisingBeanPostProcessor)就实现了BeanPostProcessor来提供代理包装逻辑。
-
如何创建一个BeanPostProcessor
-
实现BeanPostProcessor接口;
-
实现两个回调方法。
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class CustomBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Called postProcessBeforeInitialization() for :" + beanName); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Called postProcessAfterInitialization() for :" + beanName); return bean; } }
-
-
如何注册BeanPostProcessor:在配置文档applicationContext.xml中配置一个BeanPostProcessor之后,ApplicationContext会自动检测(实现BeanPostProcessor接口的配置元数据中定义的)所有bean,并将这些bean注册为BeanPostProcessor。然后spring将在初始化回调方法之前和之后将每个bean传递给这两个方法,在这两个方法中我们可以实现自己的处理逻辑。需要注意,BeanPostProcessor针对的是spring上下文中的所有bean。
参考文章: