转载

spring学习之容器扩展

BeanPostProcessor

在Spring容器完成实例化、配置和初始化bean之后实现一些自定义的逻辑,比如对bean的处理,可以实现 org.springframework.beans.factory.config.BeanPostProcessor 这个接口,再根据实际业务重写 postProcessBeforeInitializationpostProcessAfterInitialization 这两个方法或者其中一个方法。这个两个方法的参数,一个是bean的对象,一个是bean的名称。当需要多个BeanPostProcessor的时候,可以实现 order 接口来排序。

MyBean

直接用 spring学习之bean生命周期的管理 的例子。

MyConfig

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

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

MyBeanPostProcessor

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;
    }
}

测试代码

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

spring学习之容器扩展

可以看出,在调用afterPropertiesSet、initMethod方法前,调用了postProcessBeforeInitialization方法,postConstruct这个没有被调用。这两个调用结束后,再调用postProcessAfterInitialization方法。

BeanFactoryPostProcessor

BeanPostProcessor是在对bean的处理,那对元数据的操纵呢,可以通过实现 org.springframework.beans.factory.config.BeanFactoryPostProcessor 的接口来实现,然后实现 postProcessBeanFactory 方法,这个方法要传递的参数是configurableListableBeanFactory,他继承了BeanFactory,可以对bean进行一些额外的操作。与BeanPostProcessor一样,如果有多个的话,可以通过order接口来指定执行的顺序。

MyBeanFactoryPostProcessor

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的注入。

测试代码同上,运行结果如下:

spring学习之容器扩展

原文  https://segmentfault.com/a/1190000020734511
正文到此结束
Loading...