<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring詳解(概述、組件詳解、加載流程)

          共 5280字,需瀏覽 11分鐘

           ·

          2021-03-05 12:55

          來源:https://blog.csdn.net/wzk646795873

          1.Spring是什么?

          Spring 是一個開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許您 選擇使用哪一個組件,同時為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。

          2.Spring特點?

          (1)IOC(控制反轉(zhuǎn))或DI(依賴注入)

          明確定義組件的接口,獨立開發(fā)各個組件,然后根據(jù)組件的依賴關(guān)系組裝運行;即將創(chuàng)建及管理對象的權(quán)利交給Spring容器。Spring是一個輕型容器(light-weight Container),其核心是Bean工廠(Bean Factory),用以構(gòu)造我們所需要的M(Model)。能夠讓相互協(xié)作的軟件組件保持松散耦合。降低了業(yè)務(wù)對象替換的復(fù)雜性,提高了組件之間的解耦。

          (2)AOP(面向切面編程)

          通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的一種技術(shù)。即系統(tǒng)級的服務(wù)從代碼中解耦出來。例如:將日志記錄,性能統(tǒng)計,安全控制,事務(wù)處理,異常處理等代碼從業(yè)務(wù)邏輯代碼中劃分出來。允許你把遍布應(yīng)用各處的功能分離出來形成可重用組件。

          3.Spring框架好處?

          (1)控制反轉(zhuǎn):Spring通過控制反轉(zhuǎn)實現(xiàn)了松散耦合,對象們給出它們的依賴,而不是創(chuàng)建或查找依賴的對象們。

          (2)面向切面的編程(AOP):Spring支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開。

          (3)MVC框架:Spring的WEB框架是個精心設(shè)計的框架,是Web框架的一個很好的替代品。

          (4)低侵入式設(shè)計:代碼污染極低,獨立于各種應(yīng)用服務(wù)器,基于Spring框架的應(yīng)用,可以真正實現(xiàn)Write Once,Run Anywhere的承諾。

          (5)集成能力強:集成多種優(yōu)秀的開源框架。(Hibernate、Struts、Hessian等)。

          (6)異常處理:Spring 提供方便的API把具體技術(shù)相關(guān)的異常(比如由JDBC,Hibernate or JDO拋出的)轉(zhuǎn)化為一致的unchecked 異常。

          (7)容器:Spring 包含并管理應(yīng)用中對象的生命周期和配置。

          (8)輕量:Spring 是輕量的,基本的版本大約2MB。

          4.Spring基本組成模塊?

          (1)CoreContain模塊:Core、bean、context、Expression Language。

          (2) Data Access/integration(集成)模塊:JDBC、ORM、OXM、JMS、Transaction.

          (3)Web模塊:WEB、Web-Servle、Web-Struts、Web-Portlet。

          (4)AOP、Aspects、Instrumentation、Test.

          //加載應(yīng)用上下文
          ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("ClassPath:spring.xml");

          //獲取bean
          User user = context.getBean("user");

          5.Spring核心組件詳解

          Spring核心組件只有Core、Context、Beans三個。core包側(cè)重于幫助類,操作工具,beans包更側(cè)重于bean實例的描述。context更側(cè)重全局控制,功能衍生。

          5.1Bean組件

          Bean組件主要解決:Bean 的定義、Bean 的創(chuàng)建以及對 Bean 的解析。

          開發(fā)者關(guān)心Bean創(chuàng)建,其他由Spring內(nèi)部幫你完成。

          (1)Bean 的創(chuàng)建時典型的工廠模式,他的頂級接口是 BeanFactory,下圖是這個工廠的繼承層次關(guān)系:

          Bean 工廠的繼承關(guān)系

          BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。但終的默認(rèn)實現(xiàn)類是 DefaultListableBeanFactory。實現(xiàn)多接口是為了區(qū)分在 Spring 內(nèi)部操作對象傳遞和轉(zhuǎn)化時,對對象的數(shù)據(jù)訪問所做的限制。

          例如 ListableBeanFactory 接口表示這些 Bean 是可列表的,HierarchicalBeanFactory 表示的是這些 Bean 是有繼承關(guān)系的,也就是每個 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定義 Bean 的自動裝配規(guī)則。這四個接口共同定義了 Bean 的集合、Bean 之間的關(guān)系、以及 Bean 行為。

          (2)Bean 的定義主要有 BeanDefinition 描述,如下圖說明了這些類的層次關(guān)系:

          Bean 定義的類層次關(guān)系圖

          Bean 的定義就是完整的描述了在 Spring 的配置文件中你定義的節(jié)點中所有的信息,包括各種子節(jié)點。當(dāng) Spring 成功解析你定義的一個節(jié)點后,在 Spring 的內(nèi)部他就被轉(zhuǎn)化成 BeanDefinition 對象。以后所有的操作都是對這個對象完成的。

          (3)bean 的解析過程非常復(fù)雜,功能被分的很細(xì),因為這里需要被擴展的地方很多,必須保證有足夠的靈活性,以應(yīng)對可能的變化。Bean 的解析主要就是對 Spring 配置文件的解析。這個解析過程主要通過下圖中的類完成:

          Bean解析類

          5.2Content組件

          Context 在 Spring 的 org.springframework.context 包下,給 Spring 提供一個運行時的環(huán)境,用以保存各個對象的狀態(tài)。

          ApplicationContext 是 Context 的頂級父類,他除了能標(biāo)識一個應(yīng)用環(huán)境的基本信息外,他還繼承了五個接口,這五個接口主要是擴展了 Context 的功能。下面是 Context 的類結(jié)構(gòu)圖:

          從上圖中可以看出 ApplicationContext 繼承了 BeanFactory,這也說明了 Spring 容器中運行的主體對象是 Bean,另外 ApplicationContext 繼承了 ResourceLoader 接口,使得 ApplicationContext 可以訪問到任何外部資源,這將在 Core 中詳細(xì)說明。


          ApplicationContext 的子類主要包含兩個方面:

          1. ConfigurableApplicationContext 表示該 Context 是可修改的,也就是在構(gòu)建 Context 中用戶可以動態(tài)添加或修改已有的配置信息,它下面又有多個子類,其中最經(jīng)常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 類。
          2. WebApplicationContext 顧名思義,就是為 web 準(zhǔn)備的 Context 他可以直接訪問到 ServletContext,通常情況下,這個接口使用的少。

          再往下分就是按照構(gòu)建 Context 的文件類型,接著就是訪問 Context 的方式。這樣一級一級構(gòu)成了完整的 Context 等級層次。

          總結(jié):

          總體來說 ApplicationContext 必須要完成以下幾件事:

          • 標(biāo)識一個應(yīng)用環(huán)境。
          • 利用 BeanFactory 創(chuàng)建 Bean 對象。
          • 保存對象關(guān)系表。
          • 能夠捕獲各種事件。

          Context 作為 Spring 的 Ioc 容器,基本上整合了 Spring 的大部分功能,或者說是大部分功能的基礎(chǔ)。

          5.3Core組件

          Core 組件作為 Spring 的核心組件,他其中包含了很多的關(guān)鍵類,其中一個重要組成部分就是定義了資源的訪問方式。這種把所有資源都抽象成一個接口的方式很值得在以后的設(shè)計中拿來學(xué)習(xí)。

          從下圖可以看出 Resource 接口封裝了各種可能的資源類型,也就是對使用者來說屏蔽了文件類型的不同。對資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個問題,我們看到:

          Resource 相關(guān)的類結(jié)構(gòu)圖

          從上圖可以看出 Resource 接口封裝了各種可能的資源類型,也就是對使用者來說屏蔽了文件類型的不同。對資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個問題,我們看到:

          • 屏蔽資源提供者:Resource 接口繼承了 InputStreamSource 接口,這個接口中有個 getInputStream 方法,返回的是 InputStream 類。這樣所有的資源都被可以通過 InputStream 這個類來獲取,所以也屏蔽了資源的提供者。
          • 資源加載:ResourceLoader 接口完成加載,他屏蔽了所有的資源加載者的差異,只需要實現(xiàn)這個接口就可以加載所有的資源,他的默認(rèn)實現(xiàn)是 DefaultResourceLoader。

          Resource與Context如何建立聯(lián)系:

          從上圖可以看出,Context 是把資源的加載、解析和描述工作委托給了 ResourcePatternResolver 類來完成,他相當(dāng)于一個接頭人,他把資源的加載、解析和資源的定義整合在一起便于其他組件使用。Core 組件中還有很多類似的方式。

          6.Spring初始化邏輯(流程)?

          附錄

          1. 應(yīng)用上下文加載類:

          (1)應(yīng)用上下文(Application Context)

          負(fù)責(zé)裝載bean的定義,并把它們組裝起來,即裝載配置文件。Spring應(yīng)用上下文全權(quán)負(fù)責(zé)對象的組裝。spring自帶多種應(yīng)用上下文的實現(xiàn),它們之間的區(qū)別僅僅在于如何加載配置。

          若Spring采用的是xml配置,則選擇ClassPathXMLApplicationContext作為應(yīng)用上下文比較合適。而對于基于java的配置,Spring提供了 AnnotationConfigApplicationContext.加載應(yīng)用上下文:

          (2)Spring自帶了多種類型的應(yīng)用上下文。

          a、AnnotationConfigApplicationContext:從一個或多個基于Java配置類中加載Spring應(yīng)用上下文。

          b、AnnotationConfigWebApplicationContext:從一個或多個基于java的配置類中加載Spring Web應(yīng)用上下文。

          c、ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中加載上下文定義,把應(yīng)用上下文定義文件作為類資源。

          d、FileSystemXMLApplicationContext:從文件系統(tǒng)下的一個或多個xml配置文件中加載上下文定義。

          e、xmlWebApplicationContext:從Web應(yīng)用的一個或多個xml配置文件中加載上下文定義。

          //加載應(yīng)用上下文的幾種方式示例
          //基于xml的配置
          ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(“classpath:spring.xml”);
          //基于java的配置

          AnnotaitionConfigApplicationContext context=new AnnotationConfigApplicationContext(“com.star.config.KnightConfig.class”); 應(yīng)用上下文準(zhǔn)備就緒之后,我們就可以調(diào)用上下文的getBean()方法從Spring容器中獲取bean。

          2.BeanFactory 工廠創(chuàng)建

          (1)這個方法就是構(gòu)建整個 Ioc 容器過程的完整的代碼,了解了里面的每一行代碼基本上就了解大部分 Spring 的原理和功能了。

          這段代碼主要包含這樣幾個步驟:

          • 構(gòu)建 BeanFactory,以便于產(chǎn)生所需的“演員”。
          • 注冊可能感興趣的事件。
          • 創(chuàng)建 Bean 實例對象。
          • 觸發(fā)被監(jiān)聽的事件。

          (2)refresh 也就是刷新配置,前面介紹了 Context 有可更新的子類,這里正是實現(xiàn)這個功能,當(dāng) BeanFactory 已存在是就更新,如果沒有就新創(chuàng)建。

          參考博客:

          https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle

          最近給大家找了java爬蟲相關(guān)的項目,從零搭建的新冠疫情防控指揮系統(tǒng)

          資源,怎么領(lǐng)取?

          掃二維碼為,加我微信,回復(fù):新冠疫情防控指揮系統(tǒng)

           注意,不要亂回復(fù) 

          沒錯,不是機器人
          記得一定要等待,等待才有好東西!
          瀏覽 77
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天草,人人草 | 日韩美女操逼网 | 色五月无码 | 亚洲欧美在线成人 | 韩国人免费的吊黑 |