Spring詳解(概述、組件詳解、加載流程)
來源: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)系:

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

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 的子類主要包含兩個方面:
ConfigurableApplicationContext 表示該 Context 是可修改的,也就是在構(gòu)建 Context 中用戶可以動態(tài)添加或修改已有的配置信息,它下面又有多個子類,其中最經(jīng)常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext 類。 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 接口封裝了各種可能的資源類型,也就是對使用者來說屏蔽了文件類型的不同。對資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個問題,我們看到:
屏蔽資源提供者: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ù) 沒錯,不是機器人 記得一定要等待,等待才有好東西!
