国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

Spring BeanPostProcessor接口使用詳解

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

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

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

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

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

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

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

示例代碼:

?
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" />

輸出結(jié)果:

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

可以看到通過后處理器處理過后的bean信息已經(jīng)改變。最后,看看源碼中如何調(diào)用自定義實現(xiàn)的。

在初始化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) {
  //省略部分無關(guān)代碼
  Object wrappedBean = bean;
  //初始化前
  if (mbd == null || !mbd.isSynthetic()) {
    wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  }
 
  try {
    //調(diào)用初始化方法初始化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方法調(diào)用
@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
    throws BeansException {
 
  Object result = existingBean;
  for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
    //調(diào)用自定義postProcessBeforeInitialization方法
    Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);
    if (current == null) {
      return result;
    }
    result = current;
  }
  return result;
}
//postProcessAfterInitialization方法調(diào)用
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
    throws BeansException {
 
  Object result = existingBean;
  for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
    //自定義postProcessAfterInitialization方法調(diào)用
    Object current = beanProcessor.postProcessAfterInitialization(result, beanName);
    if (current == null) {
      return result;
    }
    result = current;
  }
  return result;
}

以上就是spring對自定義方法實現(xiàn)的調(diào)用過程。希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品九九久久 | 久久777 | 日本一区二区三区四区 | 国产综合久久 | 国产精品尤物在线观看 | 国产成人精品久久二区二区 | 国产一级小视频 | 美日韩成人 | 超碰官网| 午夜精品久久久久久久久久久久 | 亚洲伊人伊色伊影伊综合网 | 九九精品视频在线观看 | 久久性 | 激情五月婷婷综合 | 久久亚洲国产精品 | 国产高清视频一区二区 | 午夜精品久久久 | 人人爱夜夜爽日日视频 | 天天干夜干 | 国产亚洲一区二区三区 | 日韩色av | 99亚洲精品 | 在线欧美视频 | 黄色在线免费观看 | 亚洲视频一区二区 | 一区二区在线电影 | 欧美影| 伊人最新网址 | 亚洲精选一区 | 国产亚洲精品女人久久久久久 | 国产亚洲精品精品国产亚洲综合 | 日韩欧美国产一区二区 | 超级av| 日本好好热视频 | 欧美综合在线观看 | 在线视频一区二区三区 | 国产欧美日韩一级大片 | 美女久久久久 | 日韩电影免费观看 | 欧美在线网站 | 亚洲a网站 |