spring學習之容器擴展

BeanPostProcessor

在Spring容器完成實例化、配置和初始化bean以後實現一些自定義的邏輯,好比對bean的處理,能夠實現org.springframework.beans.factory.config.BeanPostProcessor這個接口,再根據實際業務重寫postProcessBeforeInitializationpostProcessAfterInitialization這兩個方法或者其中一個方法。這個兩個方法的參數,一個是bean的對象,一個是bean的名稱。當須要多個BeanPostProcessor的時候,能夠實現order接口來排序。
MyBean
直接用spring學習之bean生命週期的管理的例子。
MyConfigspring

@Configuration
public class MyConfig {
    @Bean
    public MyBeanPostProcessor myBeanPostProcessor() {
        return new MyBeanPostProcessor();
    }

    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public MyBean myBean() {
        return new MyBean("張三");
    }
}

MyBeanPostProcessorsegmentfault

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + "初始化前調用");
        return null;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + "初始化後調用");
        return null;
    }
}

測試代碼app

@Test
public void test(){
    ApplicationContext app =  new AnnotationConfigApplicationContext(MyConfig.class);
    System.out.println("開始銷燬");
    ((AnnotationConfigApplicationContext) app).close();
}

image.png
能夠看出,在調用afterPropertiesSet、initMethod方法前,調用了postProcessBeforeInitialization方法,postConstruct這個沒有被調用。這兩個調用結束後,再調用postProcessAfterInitialization方法。ide

BeanFactoryPostProcessor

BeanPostProcessor是在對bean的處理,那對元數據的操縱呢,能夠經過實現org.springframework.beans.factory.config.BeanFactoryPostProcessor的接口來實現,而後實現postProcessBeanFactory方法,這個方法要傳遞的參數是configurableListableBeanFactory,他繼承了BeanFactory,能夠對bean進行一些額外的操做。與BeanPostProcessor同樣,若是有多個的話,能夠經過order接口來指定執行的順序。
MyBeanFactoryPostProcessorpost

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        Iterator<String> beanNamesIterator = configurableListableBeanFactory.getBeanNamesIterator();
        while (beanNamesIterator.hasNext()) {
            System.out.println("postProcessBeanFactory:" + beanNamesIterator.next());
        }
    }
}

MyConfig在上面的基礎上加入了MyBeanFactoryPostProcessor的注入。
測試代碼同上,運行結果以下:
image.png學習

相關文章
相關標籤/搜索