栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring BeanPostProcessor接口使用详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring BeanPostProcessor接口使用详解

Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor、BeanFactoryPostProcessor、BeanValidationPostProcessor等一系列后处理器。他们的使用方式大多类似,了解其中一个并掌握他的使用方式,其他的可以触类旁通。

这里以BeanPostProcessor为例展示其使用方式。

BeanPostProcessor接口提供了两个供开发者自定义的方法:postProcessBeforeInitialization、postProcessAfterInitialization。

postProcessBeforeInitialization:该方法主要针对spring在bean初始化时调用初始化方法前进行自定义处理。

postProcessAfterInitialization:该方法主要针对spring在bean初始化时调用初始化方法后进行自定义处理。

示例代码:


public class Cat {
  private String name;
  private int age;
  public void say() {
    System.out.println("name:" + name);
    System.out.println("age:" + age);
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

public class CatBeanPostProcessor implements BeanPostProcessor {

  @Nullable
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if (bean instanceof Cat) {
      //输出原始属性
      Cat cat = (Cat) bean;
      cat.say();
      return bean;
    }
    return bean;
  }

  @Nullable
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if (bean instanceof Cat) {
      //修改属性值,并返回
      Cat cat = (Cat) bean;
      cat.setName("hello maomi");
      cat.setAge(3);
      return cat;
    }
    return bean;
  }
}

public class Run {
  public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
    Cat cat = (Cat) applicationContext.getBean("cat");
    cat.say();
  }
}

xml配置信息

  
  
    
    
  

  

输出结果:

name:HelloKitty
age:1
name:hello maomi
age:3

可以看到通过后处理器处理过后的bean信息已经改变。最后,看看源码中如何调用自定义实现的。

在初始化bean方法中:AbstractAutowireCapableBeanFactory.java

  
 protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
   //省略部分无关代码
   Object wrappedBean = bean;
   //初始化前
   if (mbd == null || !mbd.isSynthetic()) {
     wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
   }

   try {
     //调用初始化方法初始化bean
     invokeInitMethods(beanName, wrappedBean, mbd);
   }
   catch (Throwable ex) {
     throw new BeanCreationException(
  (mbd != null ? mbd.getResourceDescription() : null),
  beanName, "Invocation of init method failed", ex);
   }
   //初始化后
   if (mbd == null || !mbd.isSynthetic()) {
     wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
   }
   return wrappedBean;
 }
 //postProcessBeforeInitialization方法调用
 @Override
 public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
     throws BeansException {

   Object result = existingBean;
   for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
     //调用自定义postProcessBeforeInitialization方法
     Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);
     if (current == null) {
return result;
     }
     result = current;
   }
   return result;
 }
 //postProcessAfterInitialization方法调用
 @Override
 public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
     throws BeansException {

   Object result = existingBean;
   for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
     //自定义postProcessAfterInitialization方法调用
     Object current = beanProcessor.postProcessAfterInitialization(result, beanName);
     if (current == null) {
return result;
     }
     result = current;
   }
   return result;
 }

以上就是spring对自定义方法实现的调用过程。希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/142250.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号