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当测试类(此类已实例化)

      

  

posted @ 2020-08-27 15:58  StrangerIt  阅读(227)  评论(0)    收藏  举报