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

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

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

服務器之家 - 編程語言 - Java教程 - spring啟動加載程序的幾種方法介紹

spring啟動加載程序的幾種方法介紹

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

本篇文章主要介紹了spring啟動加載程序的幾種方法介紹,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

第一種:通過注解@PostConstruct 和 @PreDestroy 方法 實現初始化和銷毀bean之前進行的操作

?
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 被執行");
 }
 @PreDestroy
 public void destroyMethod() throws Exception {
  System.out.println("destroyMethod 被執行");
 }
}

第二種是:通過 在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 被執行");
 }
 public void destroyMethod() throws Exception {
  System.out.println("destroyMethod 被執行");
 }
}

 

復制代碼 代碼如下:

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

 

 

第三種是: 通過bean實現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 被執行");
 }
  
 @Override
 public void destroy() throws Exception {
  System.out.println("destroy 被執行");
 }
 
}

 其中第一種和第二種是同一種形式,只不過一種xml配置,另外一種采用注解形式罷了,有很大區別的是第三種,如果同一個bean同時采用兩種方式初始化的時候執行某個方法,首先在執行順序上就會體現出來。

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

這里我們看下源碼

這方式在spring中是怎么實現的?

通過查看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是否實現了實現了InitializingBean接口,如果實現了InitializingBean接口,則只掉調用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 {
      //直接調用afterPropertiesSet
      ((InitializingBean) bean).afterPropertiesSet();
      return null;
     }
    },getAccessControlContext());
   } catch (PrivilegedActionException pae) {
    throw pae.getException();
   }
  }    
  else {
   //直接調用afterPropertiesSet
   ((InitializingBean) bean).afterPropertiesSet();
  }
 }
 if (mbd != null) {
  String initMethodName = mbd.getInitMethodName();
  //判斷是否指定了init-method方法,如果指定了init-method方法,則再調用制定的init-method
  if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
    !mbd.isExternallyManagedInitMethod(initMethodName)) {
    //進一步查看該方法的源碼,可以發現init-method方法中指定的方法是通過反射實現
   invokeCustomInitMethod(beanName, bean, mbd);
  }
 }

總結:

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

2:實現InitializingBean接口是直接調用afterPropertiesSet方法,比通過反射調用init-method指定的方法效率相對來說要高點。但是init-method方式消除了對spring的依賴

3:如果調用afterPropertiesSet方法時出錯,則不調用init-method指定的方法。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 蜜桃视频在线观看官网 | 星星动漫在线观看免费 | 国产高清视频网站 | 午夜深情在线观看免费 | 亚洲卡一卡2卡三卡4卡无卡三 | 俄罗斯性高清完整版 | 倩女还魂在线观看完整版免费 | 国产在线观看人成激情视频 | 色五月天天 | 日韩免费观看成第15集 | 国产午夜精品理论片 | 精品国产一区二区三区久久久蜜臀 | 草草草视频 | 4虎tv| 日本天堂影院在线播放 | 高h喷水荡肉爽文np肉色文 | 黑人巨鞭大战白妞10级 | 精品久久日日躁夜夜躁AV | 99久久伊人一区二区yy5099 | 波多野结衣作品在线观看 | 日本孕妇与黑人xxxxxx | 精品欧美一区二区三区久久久 | 亚洲黄色天堂 | 日本深夜影院 | 欧美日韩国产手机在线观看视频 | 青青久在线视频免费观看 | 九九精品视频在线播放 | 欧美 亚洲 一区 | 九九热免费在线观看 | jzzjlzz亚洲乱熟在线播放 | 欧美一级片观看 | 日韩性大片免费 | 免费的毛片视频 | bb18lv黑料正能量 | 国内揄拍国内精品久久 | 天天色天天综合 | 成人性色生活片免费网 | 美女扒开两腿露出尿口的视频 | 国内精品久久久久久野外 | 精品国产在线观看 | 成人亚洲欧美日韩在线观看 |