1. 程式人生 > >Bean 後置處理器

Bean 後置處理器

IOC容器自動識別後置處理器InitBeforBean 改bean實現BeanFactoryPostProcessor 該介面,更改 BeanLife bean的屬性值和作用域
@Test
public void valueTest(){

    ApplicationContext context = new AnnotationConfigApplicationContext("com.huo.SprinBootDmeo");//獲取該資料夾下所有的工廠bean
    //ApplicationContext context = new AnnotationConfigApplicationContext(BeanLife.class);
    BeanLife beanLife = context.getBean(BeanLife.class);
  //  System.out.println(beanLife.getRemark());
    AbstractApplicationContext abstractApplicationContext = (AbstractApplicationContext) context;
    abstractApplicationContext.registerShutdownHook();

}


@Component
public class InitBeforBean implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("BeforeInitialization 初始化bean之前========================: " );
        BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("beanLife");
        MutablePropertyValues pv = bd.getPropertyValues();
        pv.addPropertyValue("remark","屬性值改一下");
        //bean的作用域也該一下
        bd.setScope(BeanDefinition.SCOPE_SINGLETON);

    }


}

@Component
public class BeanLife {

   private String remark;


    public BeanLife(){
        System.out.println("建構函式");
    }

    @PostConstruct
    public void init(){
        System.out.println("初始化bean後呼叫");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("銷燬bean之前呼叫");
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}
執行結果:BeforeInitialization 初始化bean之前========================: 建構函式初始化bean後呼叫bean銷燬後呼叫