spring中BeanPostProcessor和BeanDefinitionRegistryPostProcessor 接口

  • 摘要:BeanPostProcessor接口如果我们需要在spring容器完成Bean的实例化,配置和其他的初始化前后添加一些自己的逻辑处理,就可以使用BeanPostProcessor接口Bean的实例化过程@ComponentpublicclassUserimplementsApplicationContextAware,InitializingBean{privateApplicationContextctx;@OverridepublicvoidsetApplication


  • BeanPostProcessor 接口 

    如果我们需要在spring容器完成Bean的实例化,配置和其他的初始化前后添加一些自己的逻辑处理,就可以使用BeanPostProcessor接口


    Bean的实例化过程 
    @Component 
    public class User implements ApplicationContextAware ,InitializingBean { 
    private ApplicationContext ctx; 
    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
    System.out.println("setApplicationContext...."); 
    ctx = applicationContext; 

    public User(){ 
    System.out.println("User...."); 

    @Override 
    public void afterPropertiesSet() throws Exception { 
    System.out.println("afterPropertiesSet...."); 


    @Component 
    public class MyBeanPostProcessor implements BeanPostProcessor { 
    @Override 
    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { 
    System.out.println("postProcessBeforeInitialization...."); 
    return o; 

    @Override 
    public Object postProcessAfterInitialization(Object o, String s) throws BeansException { 
    System.out.println("postProcessAfterInitialization...."); 
    return o; 

    输出结果为:


    User.... 
    setApplicationContext.... 
    postProcessBeforeInitialization.... 
    afterPropertiesSet.... 
    postProcessAfterInitialization.... 

    总结:

     

    spring中BeanPostProcessor和BeanDefinitionRegistryPostProcessor 接口_Java

     

    图片出自:http://uule.iteye.com/blog/2094549

     

    注意:


    初始化每个bean的时候都会调用BeanPostProcessor接口 
    BeanPostProcessor接口中的方法不能返回null,否则bean对象就会获取不到 
    spring中BeanPostProcessor接口的作用 
    可以在BeanPostProcessor接口中对指定bean做处理,返回代理对象 

    spring中的 ApplicationContextAwareProcessor实现了BeanPostProcessor,这个类主要就是对Spring Aware 接口的实现.


    @Override 
    public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException { 
    //do something 
    invokeAwareInterfaces(bean); 
    return bean; 

    private void invokeAwareInterfaces(Object bean) { 
    if (bean instanceof Aware) { 
    if (bean instanceof EnvironmentAware) { 
    ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); 

    if (bean instanceof EmbeddedValueResolverAware) { 
    ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); 

    if (bean instanceof ResourceLoaderAware) { 
    ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); 

    if (bean instanceof ApplicationEventPublisherAware) { 
    ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); 

    if (bean instanceof MessageSourceAware) { 
    ((MessageSourceAware) bean).setMessageSource(this.applicationContext); 

    if (bean instanceof ApplicationContextAware) { 
    ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); 



    动态注入bean 
    BeanPostProcessor接口实现类会在每个bean初始化的时候被调用 
    BeanFactoryPostProcessor接口实现类会在spring容器初始化的时候被调用一次 
    BeanDefinitionRegistryPostProcessor接口 
    BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口 
    BeanDefinitionRegistryPostProcessor接口中可以获取可以BeanDefinitionRegistry,BeanDefinitionRegistry可以用来动态注入bean 
    要注入的bean可以使用BeanDefinitionBuilder来生成 
    也可以使用AnnotationConfigApplicationContext对象的registerBeanDefinition方法来动态注入bean 
    @Component 
    public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { 
    @Override 
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { 
    BeanDefinitionBuilder beanBuilder = BeanDefinitionBuilder.rootBeanDefinition(Person.class); 
    beanBuilder.addPropertyValue("name", "bob"); 
    beanBuilder.addPropertyValue("age",17); 
    beanDefinitionRegistry.registerBeanDefinition("person", beanBuilder.getBeanDefinition()); 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值