一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring BeanPostProcessor接口使用詳解

Spring BeanPostProcessor接口使用詳解

2021-03-15 12:08zpwd63 Java教程

本篇文章主要介紹了Spring BeanPostProcessor接口使用詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

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

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

示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
 * 測試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;
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * 自定義后處理器
 */
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;
  }
}
?
1
2
3
4
5
6
7
8
9
10
/**
 * 運行
 */
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配置信息

?
1
2
3
4
5
6
7
<!--配置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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
 * 初始化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對自定義方法實現的調用過程。希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.jianshu.com/p/e1c3c6e90e8a

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲风情无码免费视频 | 500福利第一导航 | 啊啊啊好大视频 | 双性产卵| 私人影院在线播放 | 国产香蕉国产精品偷在线观看 | 精品精品久久宅男的天堂 | 不知火舞被c视频在线播放 不卡一区二区三区卡 | 精品国产剧情在线观看 | 日韩福利网 | 无人视频在线观看完整版高清 | 亚洲精品成人 | 久热人人综合人人九九精品视频 | 高h文3p双龙| 国产午夜亚洲精品理论片不卡 | 蜜月aⅴ免费一区二区三区 蜜桃影像传媒推广 | 国产麻豆剧果冻传媒观看免费视频 | 插鸡网站 | 手机在线观看网站免费视频 | 亚洲 综合 欧美在线视频 | 国产午夜精品一区二区 | 国产精品久久亚洲一区二区 | 国产老村长足疗店对白 | 日本亚欧乱色视频在线观看 | 国产精品免费视频一区一 | 污黄在线观看 | 国产亚洲精品九九久在线观看 | 东北美女野外bbwbbw免费 | 激情五月姐姐 | 日本免费高清在线 | 私人影院在线免费观看 | 日本男女视频 | 白丝萝莉喷水 | 免费国产影视观看网站入口 | 日本视频免费在线播放 | 午夜福利理论片高清在线 | 91桃色网站| 国自产在线精品免费 | 久久婷婷五月免费综合色啪 | ass性强迫rape | 久久五月综合婷婷中文云霸高清 |