最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring框架初始化解析

 更新時(shí)間:2017年11月27日 08:47:16   作者:江曉曼軟件園  
這篇文章主要介紹了Spring框架初始化解析,具有一定參考價(jià)值,需要的朋友可以了解下。

一、Spring能做什么?

Spring的主要目的是使J2EE易用和促進(jìn)好編程習(xí)慣。

倒置控制容器 Spring的設(shè)計(jì)核心是 org.springframework.beans 包, 為與JavaBeans一起工作而設(shè)計(jì)。 這個(gè)包一般不直接被用戶(hù)使用, 但作為基礎(chǔ)為更多的其他功能服務(wù). 下一個(gè)較高層面的抽象是"Bean Factory"。 Spring bean factory 是一個(gè)普通的Factory,它使對(duì)象能夠按名稱(chēng)獲取,并且能管理對(duì)象之間的關(guān)系。 Bean factories 支持兩種對(duì)象模式: . Singleton:在此模式中,有一個(gè)具有特定名稱(chēng)的共享對(duì)象實(shí)例,它在查找時(shí)被獲取。這是默認(rèn)的,而且是最為經(jīng)常使用的。它對(duì)于無(wú)狀態(tài)對(duì)象是一種理想的模式。 .Prototype:在此模式中,每次獲取將創(chuàng)建一個(gè)獨(dú)立的對(duì)象。

二、spring啟動(dòng)加載及實(shí)現(xiàn)方式

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

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

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

第四種:寫(xiě)一個(gè)類(lèi),實(shí)現(xiàn)BeanPostProcessor接口,這個(gè)接口有兩個(gè)方法。

(1):postProcessBeforeInitialization方法,在spring中定義的bean初始化前調(diào)用這個(gè)方法
(2):postProcessAfterInitialization方法,在spring中定義的bean初始化后調(diào)用這個(gè)方法
或?qū)崿F(xiàn)
InstantiationAwareBeanPostProcessor,是BeanPostProcessor的子接口
Spring 容器加載完成后執(zhí)行

從spring監(jiān)聽(tīng)器作為入口。

org.springframework.web.context.ContextLoaderListener

找到初始化spring的方法

/** 
   * Initialize the root web application context. 
   */ 
  @Override 
  public void contextInitialized(ServletContextEvent event) { 
    initWebApplicationContext(event.getServletContext()); 
  } 

進(jìn)入initWebApplicationContext 方法

if (this.context == null) { 
  this.context = createWebApplicationContext(servletContext); 
} 
if (this.context instanceof ConfigurableWebApplicationContext) { 
  ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context; 
  if (!cwac.isActive()) { 
    // The context has not yet been refreshed -> provide services such as 
    // setting the parent context, setting the application context id, etc 
    if (cwac.getParent() == null) { 
      // The context instance was injected without an explicit parent -> 
      // determine parent for root web application context, if any. 
      ApplicationContext parent = loadParentContext(servletContext); 
      cwac.setParent(parent); 
    } 
    configureAndRefreshWebApplicationContext(cwac, servletContext); 
  } 
} 

ApplicationListener

1、編寫(xiě)一個(gè)實(shí)現(xiàn)ApplicationListener的listener類(lèi),

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;
@Service
public class StartupListenerimplements
 ApplicationListener<ContextRefreshedEvent>
{
  @Override
  public void onApplicationEvent(ContextRefreshedEvent event)
  {
    if(event.getApplicationContext().getParent() == null)//root application context 沒(méi)有parent,他就是老大.
    { 
      //需要執(zhí)行的邏輯代碼,當(dāng)spring容器初始化完成后就會(huì)執(zhí)行該方法。 
      System.out.println("\n\n\n\n\n______________\n\n\n加載了\n\n_________\n\n");
    } 
    
    //或者下面這種方式
    if(event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext"))
    {
      System.out.println("\n\n\n_________\n\n加載一次的 \n\n ________\n\n\n\n");
    }
    
  }
}

2、在配置文件(applicationContext-servlet.xml)中設(shè)置Service掃描的包

<!-- 注冊(cè)@Controller 、@Service-->
  <context:component-scan base-package="com.test.controller" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
  </context:component-scan>

3、部署啟動(dòng)項(xiàng)目,即可在加載完spring后就打印出“加載”

applicationontext和使用MVC之后的webApplicationontext會(huì)兩次調(diào)用上面的方法,如何區(qū)分這個(gè)兩種容器呢?

但是這個(gè)時(shí)候,會(huì)存在一個(gè)問(wèn)題,在web項(xiàng)目中(springmvc),系統(tǒng)會(huì)存在兩個(gè)容器,一個(gè)是rootapplicationcontext,另一個(gè)就是我們自己的projectName-servletcontext(作為rootapplicationcontext的子容器)。

這種情況下,就會(huì)造成onApplicationEvent方法被執(zhí)行兩次。為了避免上面提到的問(wèn)題,我們可以只在rootapplicationcontext初始化完成后調(diào)用邏輯代碼,其他的容器的初始化完成,則不做任何處理,修改后代碼

如下:

@Override 
   public void onApplicationEvent(ContextRefreshedEvent event) { 
    if(event.getApplicationContext().getParent() == null){//root application context 沒(méi)有parent,他就是老大. 
       //需要執(zhí)行的邏輯代碼,當(dāng)spring容器初始化完成后就會(huì)執(zhí)行該方法。 
    } 
   } 

初始化的順序是:

Constructor > @PostConstruct > InitializingBean > init-method

總結(jié)

以上就是本文關(guān)于Spring框架初始化解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。如有問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn)

    SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • java.lang.IllegalArgumentException:Invalid character found異常解決

    java.lang.IllegalArgumentException:Invalid character&nb

    本文介紹了java.lang.IllegalArgumentException: Invalid character found異常的解決,方法包括檢查代碼中的方法名,使用合適的HTTP請(qǐng)求方法常量,使用第三方HTTP庫(kù),檢查請(qǐng)求URL以及使用調(diào)試和日志工具,通過(guò)這些方法,我們可以解決異常并確保網(wǎng)絡(luò)應(yīng)用程序的正常運(yùn)行
    2023-10-10
  • SpringBoot原理之自動(dòng)配置機(jī)制詳解

    SpringBoot原理之自動(dòng)配置機(jī)制詳解

    Springboot遵循“約定優(yōu)于配置”的原則,使用注解對(duì)一些常規(guī)的配置項(xiàng)做默認(rèn)配置,減少或不使用xml配置,讓你的項(xiàng)目快速運(yùn)行起來(lái),下面這篇文章主要給大家介紹了關(guān)于SpringBoot原理之自動(dòng)配置機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 一文詳解Java中字符串的基本操作

    一文詳解Java中字符串的基本操作

    這篇文章主要為大家詳細(xì)介紹了Java中字符串的基本操作,例如遍歷、統(tǒng)計(jì)次數(shù),拼接和反轉(zhuǎn)等以及String的常用方法,感興趣的可以了解一下
    2022-08-08
  • spring-boot整合dubbo:Spring-boot-dubbo-starter

    spring-boot整合dubbo:Spring-boot-dubbo-starter

    這篇文章主要介紹了spring-boot整合dubbo:Spring-boot-dubbo-starter的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05
  • java  Swing基礎(chǔ)教程之圖形化實(shí)例代碼

    java Swing基礎(chǔ)教程之圖形化實(shí)例代碼

    這篇文章主要介紹了java Swing基礎(chǔ)教程之圖形化實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 一文帶你了解Java設(shè)計(jì)模式之原型模式

    一文帶你了解Java設(shè)計(jì)模式之原型模式

    原型模式其實(shí)就是從一個(gè)對(duì)象在創(chuàng)建另外一個(gè)可定制的對(duì)象,不需要知道任何創(chuàng)建的細(xì)節(jié)。本文就來(lái)通過(guò)示例為大家詳細(xì)聊聊原型模式,需要的可以參考一下
    2022-09-09
  • Java統(tǒng)計(jì)英文句子中出現(xiàn)次數(shù)最多的單詞并計(jì)算出現(xiàn)次數(shù)的方法

    Java統(tǒng)計(jì)英文句子中出現(xiàn)次數(shù)最多的單詞并計(jì)算出現(xiàn)次數(shù)的方法

    這篇文章主要介紹了Java統(tǒng)計(jì)英文句子中出現(xiàn)次數(shù)最多的單詞并計(jì)算出現(xiàn)次數(shù)的方法,涉及java針對(duì)英文句子的字符串遍歷、轉(zhuǎn)換、正則替換、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 一篇文章教帶你了解Java Spring之自動(dòng)裝配

    一篇文章教帶你了解Java Spring之自動(dòng)裝配

    今天小編就為大家分享一篇關(guān)于Spring中的自動(dòng)裝配,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-09-09
  • 解析java稀疏數(shù)組如何幫助我們節(jié)省內(nèi)存提升性能

    解析java稀疏數(shù)組如何幫助我們節(jié)省內(nèi)存提升性能

    這篇文章主要為大家介紹了java稀疏數(shù)組如何幫助我們節(jié)省內(nèi)存提升性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論

来凤县| 句容市| 邹平县| 靖安县| 池州市| 南开区| 昌都县| 金湖县| 铁力市| 阿坝县| 茂名市| 资阳市| 博客| 卢湾区| 佛山市| 龙里县| 奉贤区| 四平市| 南充市| 吉首市| 綦江县| 郎溪县| 长兴县| 方正县| 威远县| 七台河市| 黔西| 彭山县| 东辽县| 越西县| 葫芦岛市| 永清县| 团风县| 高阳县| 东阳市| 翁源县| 贞丰县| 杂多县| 安福县| 额尔古纳市| 招远市|