激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務(wù)器之家 - 編程語言 - Java教程 - 淺談Spring bean 生命周期驗證

淺談Spring bean 生命周期驗證

2021-01-25 11:38只會一點java Java教程

本篇文章主要介紹了淺談Spring bean 生命周期驗證,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、從源碼注釋看bean生命周期

從jdk源碼上看,beanfactory實現(xiàn)類需要支持bean的完整生命周期,完整的初始化方法及其標(biāo)準(zhǔn)順序(格式:接口 方法)為:

1.beannameaware setbeanname 設(shè)置bean名稱
2.beanclassloaderaware setbeanclassloader 設(shè)置bean類加載器
3.beanfactoryaware setbeanfactory 設(shè)置bean工廠
4.environmentaware setenvironment 設(shè)置環(huán)境:profiles+properties
5.embeddedvalueresolveraware setembeddedvalueresolver 設(shè)置嵌入式值解析器
6.resourceloaderaware setresourceloader 設(shè)置資源載入器,只適用于在應(yīng)用程序上下文中運行
7.applicationeventpublisheraware setapplicationeventpublisher注入應(yīng)用事件發(fā)布器applicationeventpublisher
8.messagesourceaware setmessagesource 設(shè)置國際化支持
9.applicationcontextaware setapplicationcontext 設(shè)置應(yīng)用上下文
10.servletcontextaware setservletcontext 設(shè)置servlet上下文
11.beanpostprocessors postprocessbeforeinitialization 執(zhí)行bean處理器前置方法
12.initializingbean afterpropertiesset 執(zhí)行初始化bean設(shè)置完屬性后置方法
13.a custom init-method definition 執(zhí)行自定義初始化方法
14.beanpostprocessors postprocessafterinitialization 執(zhí)行bean處理器后置方法

銷毀順序:

1.destructionawarebeanpostprocessors postprocessbeforedestruction 銷毀處理器的前置方法
2.disposablebean destroy bean銷毀回調(diào)方法
3.a custom destroy-method definition 用戶自定義銷毀方法

核心方法流程圖:

淺談Spring bean 生命周期驗證

二、測試驗證

2.1分析原理

前面說的17個步驟都可以測試,我們選取其中的8個步驟進行測試如下:

初始化流程:

1.beannameaware setbeanname 設(shè)置bean名稱
3.beanfactoryaware setbeanfactory 設(shè)置bean工廠
11.beanpostprocessors postprocessbeforeinitialization 執(zhí)行bean處理器前置方法
12.initializingbean afterpropertiesset 執(zhí)行初始化bean設(shè)置完屬性后置方法
13.a custom init-method definition 執(zhí)行自定義初始化方法
14.beanpostprocessors postprocessafterinitialization 執(zhí)行bean處理器后置方法

銷毀流程:

2.disposablebean destroy bean銷毀回調(diào)方法
3.a custom destroy-method definition 用戶自定義銷毀方法

 2.2 代碼清單

 1.構(gòu)建一個person類,實現(xiàn)beanfactoryaware, beannameaware, initializingbean, disposablebean接口。

?
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
59
60
61
62
63
64
65
66
67
package spring.ioc;
 
import org.springframework.beans.beansexception;
import org.springframework.beans.factory.beanfactory;
import org.springframework.beans.factory.beanfactoryaware;
import org.springframework.beans.factory.beannameaware;
import org.springframework.beans.factory.disposablebean;
import org.springframework.beans.factory.initializingbean;
 
public class person implements beanfactoryaware, beannameaware, initializingbean, disposablebean {
  
  private string name;
  
  private string mobile;
   
  public person() {
    super();
    system.out.println("[構(gòu)造器] 調(diào)用person的構(gòu)造器實例化");
  }
 
  public string getname() {
    return name;
  }
 
  public void setname(string name) {
    system.out.println("[屬性注入] name="+name);
    this.name = name;
  }
 
  public string getmobile() {
    return mobile;
  }
 
  public void setmobile(string mobile) {
    system.out.println("[屬性注入] mobile="+mobile);
    this.mobile = mobile;
  }
 
  @override
  public void destroy() throws exception {
    system.out.println("[接口disposablebean.destroy() ]");
  }
 
  @override
  public void afterpropertiesset() throws exception {
    system.out.println("[接口initializingbean.afterpropertiesset() ]");
  }
 
  @override
  public void setbeanname(string name) {
    system.out.println("[接口beannameaware.setbeanname() ]");
  }
 
  @override
  public void setbeanfactory(beanfactory beanfactory) throws beansexception {
    system.out.println("[接口beanfactoryaware.setbeanfactory() ]");
  }
 
  public void myinit(){
    system.out.println("[init-method]調(diào)用<bean>的init-method屬性指定的初始化方法");
  }
  
  public void mydestory() {
    system.out.println("[destroy-method]調(diào)用<bean>的destroy-method屬性指定的銷毀方法");
  }
 
}

2.自定義工廠后處理器,復(fù)寫postprocessbeanfactory方法,獲取bean定義后添加屬性mobile=110

?
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
package spring.ioc;
 
import org.springframework.beans.beansexception;
import org.springframework.beans.factory.config.beandefinition;
import org.springframework.beans.factory.config.beanfactorypostprocessor;
import org.springframework.beans.factory.config.configurablelistablebeanfactory;
 
/**
 *
 * @classname:mybeanfactorypostprocessor
 * @description:自定義工廠后處理器
 * @author diandian.zhang
 * @date 2017年10月25日下午7:14:09
 */
public class mybeanfactorypostprocessor implements beanfactorypostprocessor {
 
  public mybeanfactorypostprocessor() {
    super();
    system.out.println("[mybeanfactorypostprocessor工廠后處理器]beanfactorypostprocessor實現(xiàn)類構(gòu)造器!!");
  }
 
  @override
  public void postprocessbeanfactory(configurablelistablebeanfactory arg0)
      throws beansexception {
    system.out.println("[mybeanfactorypostprocessor工廠后處理器]beanfactorypostprocessor.postprocessbeanfactory()獲取bean定義后添加屬性mobile=110");
    beandefinition bd = arg0.getbeandefinition("person");
    bd.getpropertyvalues().addpropertyvalue("mobile", "110");
  }
 
}

3.自定義bean后處理器,復(fù)寫postprocessbeforeinitialization和postprocessafterinitialization2個方法,分別對應(yīng)初始化前后時的操作。

?
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
package spring.ioc;
 
import org.springframework.beans.beansexception;
import org.springframework.beans.factory.config.beanpostprocessor;
 
/**
 *
 * @classname:mybeanpostprocessor
 * @description:自定義bean后處理器
 * @author diandian.zhang
 * @date 2017年10月25日下午7:03:53
 */
public class mybeanpostprocessor implements beanpostprocessor {
 
  public mybeanpostprocessor() {
    super();
    system.out.println("這是beanpostprocessor實現(xiàn)類構(gòu)造器!!");
  }
 
  /**
   *
   * @description 初始化前,處理器
   * @param bean
   * @param beanname
   * @return
   * @throws beansexception
   * @author diandian.zhang
   * @date 2017年10月25日下午7:07:02
   * @see org.springframework.beans.factory.config.beanpostprocessor#postprocessbeforeinitialization(java.lang.object, java.lang.string)
   */
  @override
  public object postprocessbeforeinitialization(object bean, string beanname) throws beansexception {
    system.out.println("beanpostprocessor接口方法postprocessbeforeinitialization對屬性進行更改!beanname="+beanname);
    return bean;
  }
  
  /**
   *
   * @description 初始化后,處理器
   * @param bean
   * @param beanname
   * @return
   * @throws beansexception
   * @author diandian.zhang
   * @date 2017年10月25日下午7:07:07
   * @see org.springframework.beans.factory.config.beanpostprocessor#postprocessafterinitialization(java.lang.object, java.lang.string)
   */
  @override
  public object postprocessafterinitialization(object bean, string beanname) throws beansexception {
    system.out.println("beanpostprocessor接口方法postprocessafterinitialization對屬性進行更改!beanname="+beanname);
    return bean;//注意,如果返回null,后續(xù)beanpostprocessor不會再執(zhí)行
  }
 
  
}

4.自定義實例化bean后處理器適配器,復(fù)寫postprocessbeforeinstantiation、postprocessbeforeinstantiation、postprocesspropertyvalues分別對應(yīng)實例化bean前調(diào)用、實例化bean后調(diào)用、設(shè)置某個屬性時調(diào)用

注意:instantiationawarebeanpostprocessoradapter ,這里是實例化instantiation,不是初始化initialization!!!

?
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
package spring.ioc;
 
import java.beans.propertydescriptor;
 
import org.springframework.beans.beansexception;
import org.springframework.beans.propertyvalues;
import org.springframework.beans.factory.config.instantiationawarebeanpostprocessoradapter;
 
/**
 *
 * @classname:myinstantiationawarebeanpostprocessor
 * @description:beanpostprocessor的子類,增加了更多自定方法
 * @author diandian.zhang
 * @date 2017年10月25日下午7:09:15
 */
public class myinstantiationawarebeanpostprocessor extends
    instantiationawarebeanpostprocessoradapter {
 
  public myinstantiationawarebeanpostprocessor() {
    super();
    system.out.println("這是instantiationawarebeanpostprocessoradapter實現(xiàn)類構(gòu)造器!!");
  }
 
  // 接口方法、實例化bean之前調(diào)用
  @override
  public object postprocessbeforeinstantiation(class<?> beanclass,string beanname) throws beansexception {
    system.out.println("instantiationawarebeanpostprocessor調(diào)用postprocessbeforeinstantiation方法[實例化bean之前調(diào)用 ]beanname="+beanname);
    return null;
  }
 
  // 接口方法、實例化bean之后調(diào)用
  @override
  public object postprocessafterinitialization(object bean, string beanname)
      throws beansexception {
    system.out .println("instantiationawarebeanpostprocessor調(diào)用postprocessafterinitialization方法[實例化bean之后調(diào)用]beanname="+beanname);
    return bean;
  }
 
  // 接口方法、設(shè)置某個屬性時調(diào)用
  @override
  public propertyvalues postprocesspropertyvalues(propertyvalues pvs,
      propertydescriptor[] pds, object bean, string beanname)
      throws beansexception {
    system.out.println("instantiationawarebeanpostprocessor調(diào)用postprocesspropertyvalues方法 pvs="+pvs+",beanname="+beanname);
    return pvs;
  }
}

5.測試類,使用classpathxmlapplicationcontext從xml中讀取bean配置文件生成applicationcontext容器應(yīng)用上下文,這一步對應(yīng)容器初始化。第二部從應(yīng)用上下文中獲取bean。最后一步注冊一個關(guān)閉鉤子,在容器關(guān)閉時觸發(fā)。

?
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
package spring.ioc;
 
import org.junit.test; 6 import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;10
import spring.aop.xml.dao.dao;
 
/**
 *
 * @classname:ioctest
 * @description:測試類
 * @author diandian.zhang
 * @date 2017年10月25日下午4:42:01
 */
public class ioctest {
  
  @test
  public void iocpersontest(){
    system.out.println("=============容器初始化======start=========");
    @suppresswarnings("resource")
    applicationcontext applicationcontext = new classpathxmlapplicationcontext("simple_spring_bean.xml");//源碼入口
    system.out.println("=============容器初始化=======end========");
    system.out.println("=============獲取person bean====start=======");
    person person = applicationcontext.getbean("person",person.class);//獲取bean
    system.out.println("=============獲取person bean====end=======,person類名="+person.getclass().getname());
    system.out.println("=============注冊關(guān)閉鉤子,關(guān)閉容器(jvm shutdown)時觸發(fā)鉤子!================");
    ((classpathxmlapplicationcontext)applicationcontext).registershutdownhook();
  }
}

直接運行,結(jié)果如下:

?
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
=============容器初始化======start=========
log4j:warn no appenders could be found for logger (org.springframework.core.env.standardenvironment).
log4j:warn please initialize the log4j system properly.
[mybeanfactorypostprocessor工廠后處理器]beanfactorypostprocessor實現(xiàn)類構(gòu)造器!!
[mybeanfactorypostprocessor工廠后處理器]beanfactorypostprocessor.postprocessbeanfactory()獲取bean定義后添加屬性mobile=110
這是beanpostprocessor實現(xiàn)類構(gòu)造器!!
這是instantiationawarebeanpostprocessoradapter實現(xiàn)類構(gòu)造器!!
instantiationawarebeanpostprocessor調(diào)用postprocessbeforeinstantiation方法[實例化bean之前調(diào)用 ]beanname=person
[構(gòu)造器] 調(diào)用person的構(gòu)造器實例化
instantiationawarebeanpostprocessor調(diào)用postprocesspropertyvalues方法 pvs=propertyvalues: length=2; bean property 'mobile'; bean property 'name',beanname=person
[屬性注入] mobile=110
[屬性注入] name=張三
[接口beannameaware.setbeanname() ]
[接口beanfactoryaware.setbeanfactory() ]
beanpostprocessor接口方法postprocessbeforeinitialization對屬性進行更改!beanname=person
[接口initializingbean.afterpropertiesset() ]
[init-method]調(diào)用<bean>的init-method屬性指定的初始化方法
beanpostprocessor接口方法postprocessafterinitialization對屬性進行更改!beanname=person
instantiationawarebeanpostprocessor調(diào)用postprocessafterinitialization方法[實例化bean之后調(diào)用]beanname=person
=============容器初始化=======end========
=============獲取person bean====start=======
=============獲取person bean====end=======,person類名=spring.ioc.person
=============注冊關(guān)閉鉤子,關(guān)閉容器(jvm shutdown)時觸發(fā)鉤子!================
[接口disposablebean.destroy() ]
[destroy-method]調(diào)用<bean>的destroy-method屬性指定的銷毀方法

總結(jié)流程:

淺談Spring bean 生命周期驗證

淺談Spring bean 生命周期驗證

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/dennyzhangdd/p/7732273.html?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九热在线免费观看视频 | 久久久涩 | 日本韩国欧美一级片 | 日本黄色大片免费 | 一级裸体视频 | 视频一区二区三区视频 | 亚洲二区不卡 | 久久精品女人天堂av | 九色免费视频 | 久久久久久久久久性 | 成av在线 | 成人在线视频免费观看 | 国产在线观看精品 | 成人在线观看一区 | 精品国产乱码一区二区三区四区 | 一级黄色免费 | 日韩黄在线观看 | 久久精品一区二区三区国产主播 | 日韩精品中文字幕在线观看 | 成人免费看视频 | 69av导航 | 三级xxxx| 日韩精品中文字幕在线播放 | 久久成人免费网站 | 中文字幕在线播放不卡 | 日韩视频观看 | 国产精品视频中文字幕 | 欧美成人小视频 | 欧美乱码精品一区 | 999精品久久久| 久久久人人爽 | 久久9999久久| 4p一女两男做爰在线观看 | 久久综合九色综合久久久精品综合 | 性 毛片| 成人在线视频精品 | 久久久久久中文字幕 | av成人在线播放 | 免费永久在线观看黄网 | 欧美18—19sex性护士中国 | 国产毛片网 |