Spring容器扩展BeanPostProcessor、BeanFactoryPostProcessor
一、BeanPostProcessor、BeanFactoryPostProcessor定义
BeanPostProcessor:官方文档定义: BeanPostProcessor接口定义了回调方法,您可以实施这些回调方法以提供自己的(或覆盖容器的默认值)实例化逻辑,依赖关系解析逻辑等。如果您想在 Spring 容器完成实例化,配置和初始化 bean 之后实现一些自定义逻辑,则可以插入一个或多个BeanPostProcessor实现。
本人理解就是创建实例对象,初始化前后封装自己相应的逻辑代码。
public interface BeanPostProcessor { //初始化之前调用 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; //初始化之后调用 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
BeanFactoryPostProcessor:对bean定义进行修改,实例化之前。
public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; }
二、Demo测试
BeanPostProcessor测试
(1)编写一个TestBean 实现InitializingBeanj接口(该接口定义初始化逻辑代码、和xml中init-method一样)
@Data @Component public class TestBean implements InitializingBean{ private String name; @Override public void afterPropertiesSet() throws Exception { name="测试"; System.out.println("初始化name=="+name); } }
(2)创建BeanPostProcessor接口的实现类
@Component public class TestBeanPostProcessor implements BeanPostProcessor{ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化之前调用: "+beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化之后调用: "+beanName); return bean; } }
(3)启动springboot启动类测试结果如下

BeanFactoryPostProcessor测试
(1)TestBean实例同上,去掉afterPropertiesSet方法。
(2)实现BeanFactoryPostProcessor接口,TestBeanFactoryPostProcessor
@Component public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { String[] names=beanFactory.getBeanDefinitionNames(); for(String name:names) { if("testBean".equals(name)) { BeanDefinition beanDefinition=beanFactory.getBeanDefinition(name); MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); propertyValues.addPropertyValue("name", "Jack"); System.out.println("修改了name"); } } } }
(3)让TestBeanPostProcessor当测试类(此类已实例化)


浙公网安备 33010602011771号