国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Spring BeanPostProcessor接口使用詳解

2024-07-13 10:15:57
字體:
來源:轉載
供稿:網友

Spring中提供了很多PostProcessor供開發者進行拓展,例如:BeanPostProcessor、BeanFactoryPostProcessor、BeanValidationPostProcessor等一系列后處理器。他們的使用方式大多類似,了解其中一個并掌握他的使用方式,其他的可以觸類旁通。

這里以BeanPostProcessor為例展示其使用方式。

BeanPostProcessor接口提供了兩個供開發者自定義的方法:postProcessBeforeInitialization、postProcessAfterInitialization。

postProcessBeforeInitialization:該方法主要針對spring在bean初始化時調用初始化方法前進行自定義處理。

postProcessAfterInitialization:該方法主要針對spring在bean初始化時調用初始化方法后進行自定義處理。

示例代碼:

/** * 測試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配置信息

  <!--配置bean并初始化-->  <bean id="cat" class="com.source.postprocessor.Cat" >    <property name="name" value="HelloKitty" />    <property name="age" value="1" />  </bean>  <bean id="catBeanPostProcessor" class="com.source.postprocessor.CatBeanPostProcessor" />

輸出結果:

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

可以看到通過后處理器處理過后的bean信息已經改變。最后,看看源碼中如何調用自定義實現的。

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

  /**  * 初始化bean  */ 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對自定義方法實現的調用過程。希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郯城县| 西贡区| 大荔县| 京山县| 溧水县| 石屏县| 枣庄市| 会理县| 长丰县| 扎鲁特旗| 青川县| 且末县| 施甸县| 永新县| 溧水县| 夹江县| 龙井市| 宿迁市| 古浪县| 信丰县| 廉江市| 霸州市| 德庆县| 米泉市| 宁强县| 泸水县| 河曲县| 邢台县| 黄骅市| 和田市| 龙陵县| 南陵县| 五峰| 连江县| 溧水县| 浠水县| 图木舒克市| 布尔津县| 辰溪县| 天镇县| 定襄县|