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

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

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

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - spring啟動(dòng)加載程序的幾種方法介紹

spring啟動(dòng)加載程序的幾種方法介紹

2020-09-07 09:26OnMyWay--YAO Java教程

本篇文章主要介紹了spring啟動(dòng)加載程序的幾種方法介紹,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

關(guān)于在spring  容器初始化 bean 和銷毀前所做的操作定義方式有三種:

第一種:通過(guò)注解@PostConstruct 和 @PreDestroy 方法 實(shí)現(xiàn)初始化和銷毀bean之前進(jìn)行的操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
 
public class DataInitializer{ 
 @PostConstruct
 public void initMethod() throws Exception {
  System.out.println("initMethod 被執(zhí)行");
 }
 @PreDestroy
 public void destroyMethod() throws Exception {
  System.out.println("destroyMethod 被執(zhí)行");
 }
}

第二種是:通過(guò) 在xml中定義init-method 和  destory-method方法

?
1
2
3
4
5
6
7
8
public class DataInitializer{
 public void initMethod() throws Exception {
  System.out.println("initMethod 被執(zhí)行");
 }
 public void destroyMethod() throws Exception {
  System.out.println("destroyMethod 被執(zhí)行");
 }
}

 

復(fù)制代碼 代碼如下:

<bean id="dataInitializer" class="com.somnus.demo.DataInitializer" init-method="initMethod" destory-method="destroyMethod"/> 

 

 

第三種是: 通過(guò)bean實(shí)現(xiàn)InitializingBean和 DisposableBean接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.springframework.beans.factory.DisposableBean;
 
public class DataInitializer implements InitializingBean,DisposableBean{
  
 @Override
 public void afterPropertiesSet() throws Exception {
  System.out.println("afterPropertiesSet 被執(zhí)行");
 }
  
 @Override
 public void destroy() throws Exception {
  System.out.println("destroy 被執(zhí)行");
 }
 
}

 其中第一種和第二種是同一種形式,只不過(guò)一種xml配置,另外一種采用注解形式罷了,有很大區(qū)別的是第三種,如果同一個(gè)bean同時(shí)采用兩種方式初始化的時(shí)候執(zhí)行某個(gè)方法,首先在執(zhí)行順序上就會(huì)體現(xiàn)出來(lái)。

先執(zhí)行afterPropertiesSet(),后執(zhí)行initMethod()

這里我們看下源碼

這方式在spring中是怎么實(shí)現(xiàn)的?

通過(guò)查看spring的加載bean的源碼類(AbstractAutowireCapableBeanFactory)可看出其中奧妙

AbstractAutowireCapableBeanFactory類中的invokeInitMethods講解的非常清楚,源碼如下:

?
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
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
  throws Throwable {
 //判斷該bean是否實(shí)現(xiàn)了實(shí)現(xiàn)了InitializingBean接口,如果實(shí)現(xiàn)了InitializingBean接口,則只掉調(diào)用bean的afterPropertiesSet方法
 boolean isInitializingBean = (bean instanceof InitializingBean);
 if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
  if (logger.isDebugEnabled()) {
   logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
  }
  
  if (System.getSecurityManager() != null) {
   try {
    AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
     public Object run() throws Exception {
      //直接調(diào)用afterPropertiesSet
      ((InitializingBean) bean).afterPropertiesSet();
      return null;
     }
    },getAccessControlContext());
   } catch (PrivilegedActionException pae) {
    throw pae.getException();
   }
  }    
  else {
   //直接調(diào)用afterPropertiesSet
   ((InitializingBean) bean).afterPropertiesSet();
  }
 }
 if (mbd != null) {
  String initMethodName = mbd.getInitMethodName();
  //判斷是否指定了init-method方法,如果指定了init-method方法,則再調(diào)用制定的init-method
  if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
    !mbd.isExternallyManagedInitMethod(initMethodName)) {
    //進(jìn)一步查看該方法的源碼,可以發(fā)現(xiàn)init-method方法中指定的方法是通過(guò)反射實(shí)現(xiàn)
   invokeCustomInitMethod(beanName, bean, mbd);
  }
 }

總結(jié):

1:spring為bean提供了兩種初始化bean的方式,實(shí)現(xiàn)InitializingBean接口,實(shí)現(xiàn)afterPropertiesSet方法,或者在配置文件中同過(guò)init-method指定,兩種方式可以同時(shí)使用

2:實(shí)現(xiàn)InitializingBean接口是直接調(diào)用afterPropertiesSet方法,比通過(guò)反射調(diào)用init-method指定的方法效率相對(duì)來(lái)說(shuō)要高點(diǎn)。但是init-method方式消除了對(duì)spring的依賴

3:如果調(diào)用afterPropertiesSet方法時(shí)出錯(cuò),則不調(diào)用init-method指定的方法。

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

原文鏈接:http://blog.csdn.net/aa2484219/article/details/51261227

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 1986葫芦兄弟全集免费观看第十集 | 小浪妇奶真大水多 | 亚洲欧美午夜 | 亚洲 欧美 中文 日韩欧美 | 2020年精品国产午夜福利在线 | 国产福利在线免费观看 | 爱豆传媒最新视频国产 | 亚洲国产免费观看视频 | 婷婷色婷婷| 日韩欧美亚洲一区精选 | 美女翘臀跪床被打屁股作文 | 国产亚洲一区二区三区 | 日本哺乳期网站xxxx | 色人阁图片 | 加勒比成人 | 国产精品xxxav免费视频 | 欧美黑人换爱交换乱理伦片 | 女教师被女同学调教成脚奴 | 欧美综合另类 | 久久久这里有精品999 | 亚洲精品一线二线三线 | 国产亚洲精品久久yy5099 | 日本不卡不码高清免费观看 | 草莓视频网站18勿进 | 欧美视频在线一区二区三区 | 久久精品中文騷妇女内射 | 亚洲29p | 欧美国产日产精品免费视频 | 男女18一级大黄毛片免 | 2012在线观看免费视频大全 | 外国黄色软件 | 国产三级精品91三级在专区 | 色亚 | 免费超级乱淫视频播放性 | 久久国产精品高清一区二区三区 | 男插女的下面免费视频夜色 | 国产精品天天看特色大片不卡 | 久久精品热在线观看30 | 黄瓜污视频 | 国产精品色片 | 亚洲精品在线免费看 |