Spring核心思想
Spring是一個庫,它的功能是提供了一個軟體框架,這個框架目的是使軟體之間的邏輯更加清晰,配置更靈活,實作這個目的的手段使用AOP和IoC,而AOP和IoC是一種思想,
1、IoC(控制反轉)
所謂的IOC稱之為控制反轉,簡單來說就是將物件 的創建的權力及物件的生命周期的管理程序交由Spring框架來處理,從此在開發程序中不在需要關注物件的創建和生命周期的管理,而是在需要的時候由Spring框架提供,這個由Spring框架管理物件創建和生命周期的機制稱之為控制反轉,
2、DI(依賴注入)
在創建物件的程序中Spring可以依據配置對物件的屬性進行設定,這個程序稱之為依賴注入,也即DI
3.AOP(Aspect Oriented Programming,面向切面編程)
AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向物件編程)的補充和完善,OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用于模擬公共行為的一個集合,不過OOP允許開發者定義縱向的關系,但并不適合定義橫向的關系,例如日志功能,日志代碼往往橫向地散布在所有物件層次中,而與它對應的物件的核心功能毫無關系對于其他型別的代碼,如安全性、例外處理和透明的持續性也都是如此,這種散布在各處的無關的代碼被稱為橫切(cross cutting),在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用,
AOP技術恰恰相反,它利用一種稱為"橫切"的技術,剖解開封裝的物件內部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其命名為"Aspect",即切面,所謂"切面",簡單說就是那些與業務無關,卻為業務模塊所共同呼叫的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊之間的耦合度,并有利于未來的可操作性和可維護性,
使用"橫切"技術,AOP把軟體系統分為兩個部分:核心關注點和橫切關注點,業務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點,橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似,比如權限認證、日志、事物,AOP的作用在于分離系統中的各種關注點,將核心關注點和橫切關注點分離開來,
Spring整體架構
Spring框架是一個分層架構,它包含一系列的功能要素,并被分為大概20個模塊,

這些模塊被總結為以下幾個部分:
(1)Core Container
Core Container(核心容器)包含有Core、Beans、Context和Expression Language模塊,
- Core模塊主要包含Spring框架的核心工具類,Spring的其他組件都要使用這個包里的類,Core模塊是其他組件的核心,
- Beans模塊是所有應用都要用到的,它包含訪問組態檔、創建和管理bean以及進行Inversion of Control/Dependency Injection(IOC / DI )操作相關的所有類,
- Context模塊構建于Core和Beans模塊基礎之上,提供了一種類似于JNDI注冊器的框架式的物件訪問方法,Context模塊繼承了Beans的特性,為Spring核心提供了大量擴展,Context模塊同時也支持J2EE的一些特性,ApplicationContext是Context模塊的關鍵,
- Expression Language 是一種強大的運算式語言,支持在運行時查詢和操作物件,語言語法類似于Unified EL,但提供了額外的功能,特別是方法呼叫和基本的字串模板功能,同時因為SpEL是以API介面的形式創建的,所以允許將其集成到其他應用程式和框架中,Spring框架的核心功能之一就是通過依賴注入的方式來管理Bean之間的依賴關系,而SpEl可以方便快捷的對ApplicationContext中的Bean進行屬性的裝配和提取,
(2)Data Access / Integration
Data Access/Integration層包含有JDBC、ORM、OXM、JMS和Transaction模塊,
- JDBC模塊提供了一個JDBC抽象層,它可以消除冗長的JDBC代碼和決議資料庫廠商特有的錯誤代碼,這個模塊包含了Spring對JDBC資料訪問進行封裝的所有類,
- ORM模塊為流行的物件-關系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一個互動層,利用ORM封裝包,可以混合使用Spring提供的特性進行O/R映射,
- OXM模塊提供了一個對Object/XML映射實作的抽象層,Object/XML映射實作包括JAXB、Castor、XMLBeans、JiBX和XStream,
- JMS(Java Messaging Service)模塊主要包含了一些制造和消費訊息的特性,
- Transaction模塊支持編程和宣告性的是管理,這些事物類必須實作特定的介面,并且對所有的POJO都適用,
(3)Web
Web背景關系模塊建立在應用程式背景關系模塊之上,為基于Web的應用程式提供了背景關系,所以,Spring框架支持與Jakarta Struts的集成,Web模塊還簡化了處理多部分請求以及將請求引數系結到域物件的作業,Web層包括了Web、Web-Servlet、Web-Struts和Web-Porlet模塊,
- Web模塊:提供了基礎的面向Web的集成特性,例如,多檔案上傳、使用servlet listeners初始化IOC容器以及一個面向Web的應用背景關系,它還包括Spring遠程支持中Web的相關部分,
- Web-servlet模塊web.servlet.jar:該模塊包含Spring的model-view-controller(MVC)實作,Spring的MVC框架使得模型范圍內的代碼和web forms之間能夠清楚地分離開來,并與Spring框架的其它特性集成在一起,
- Web-Struts模塊:該模塊提供了對Struts的支持,使得類在Spring應用中能夠與一個典型的Struts Web層集成在一起,
- Web-Porlet模塊:提供了用于Prolet環境和Web-Servlet模塊的MVC實作,
(4)AOP
AOP模塊提供了一個符合AOP聯盟標準的面向切面編程的實作,它讓你可以定義例如方法攔截器和切點,從而將邏輯代碼分開,降低它們之間的耦合度,利用source-level的元資料功能,還可以將各種行為資訊合并到你的代碼中,
通過配置管理特性,Spring AOP模塊直接將面向切面的編程功能集成到了Spring框架中,所以很容易地使用Spring框架管理的任何物件支持AOP,Spring AOP模塊為基于Spring的應用程式中的物件提供了事物管理服務,通過使用Spring Aop,不用依賴EJB組件,就可以將宣告性事務管理集成到應用程式中,
- Aspects模塊提供了對AspectJ的集成支持,
- Instrumentation模塊提供了class instrumentation支持和classloader實作,使得可以在特定的應用服務器上使用,
(5)Test
Test模塊支持使用JUnit和TestNG對Spring組件進行測驗,
容器的基本實作
介紹以下兩個核心類:
1、DefaultListableBeanFactory
此類是XmlBeanFactory的父類,該類是整個bean加載的核心部分,是Spring注冊及加載bean的默認實作,XmlBeanFactory對DefaultListableBeanFactory類進行了拓展,主要用于從XML檔案中讀取BeanDefinition,對于注冊及獲取Bean都是使用從父類DefaultListableBeanFactory繼承的方法去實作,唯獨與父類不同的個性化實作是增加了XmlBeanDefinitionReader型別的reader屬性,在XmlBeanFactory中主要使用reader屬性對資源檔案進行讀取和注冊,
2、XmlBeanDefinitionReader
XML組態檔的讀取是Spring重要的功能,由于Spring的大部分功能都是以配置作為切入點,可以從XmlBeanDefinitionReader梳理一下資源檔案讀取、決議及注冊的大致脈絡,可以梳理出整個XML組態檔讀取的大致流程如下:
(1)通過繼承自AbstactBeanDefinitionReader中的方法,使用ResourceLoader將資源檔案路徑轉換為對應的Resource檔案,
(2)通過Document對Resource檔案進行轉換,將Resource檔案轉換為Document檔案,
(3)通過實作介面BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader類對Document進行決議,并使用BeanDefinitionParserDelegate對Element進行決議,
容器基礎XmlBeanFactory
public class BeanFactoryTest {
@Test
public void testSimpleLoad(){
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));
MyTestBean bean = (MyTestBean) bf.getBean("myTestBean");
assertEquals("testStr",bean.getTestStr());
}
}
先來看上面這一組代碼,該代碼是Spring的入門測驗代碼,分析一下代碼的執行邏輯,首先呼叫了ClassPathResource的建構式來構造Resource資源檔案的示例物件,這樣后續的資源處理就可以用Resoure提供的各種服務來進行操作,當我們有Resource后,就可以對XmlBeanFactory進行初始化了,
現在我們討論一下Resource資源是如何進行封裝的,要弄清楚Resource資源封裝我們必須了解ClassPathResource完成了什么事情,在Java中,將不同來源的資源抽象成URL,通過注冊不同的handler(URLStreamHandler)來處理不同來源的資源的讀取邏輯,一般handler的型別使用不同前綴來識別,如file:、http:、jar:等,然而URL沒有默認定義相對ClassPath或ServletContext等資源的handler,所以Spring對其內部使用到的資源實作了自己的抽象結構,Resource介面來封裝底層資源:
代碼如下:
public interface InputStreamSource{
InputSteam getInputStream() throws IOException;
}
public interface Resource extends InputStreamSource {
boolean exists();
boolean isReadable();
boolean isOpen();
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String relativePath) throws IOException;
String getFilename();
String getDescription();
}
InputStreamSource封裝任何能回傳InputStream的類,比如File,ClassPath下的資源和Byte Array等,它只有一個方法定義:getInputStream(),該方法回傳一個新的InputStream物件,
Resource介面抽象了所有Spring內部使用到的資源,它定義了3個判斷當前資源狀態的方法:存在性、可讀性、是否處于打開狀態,另外Resource介面還提供了不同資源到URL、URI、File型別的轉換,
日常開發程序中,對于資源檔案的加載就可以使用如下方法:
Resource resource = new ClassPathResource("beanFactoryTest.xml");
InputStream inputStream = resource.getInputStream();
ClassPathResource中對getInputStream是通過class或者classLoader提供的底層方法呼叫實作的,對于FileSystemResource的實作則更加簡單,直接使用FileInputStream對檔案進行實體化,
當通過Resource相關類完成對組態檔進行封裝后,組態檔的讀取作業就全權交給XmlBeanDefinitionReader來處理了,
了解了Spring中將組態檔封裝為Resource型別的實體方法后,接下來就可以繼續分析XmlBeanFactory的初始化程序了,在上面的代碼中,初始化是使用Resource示例作為建構式的引數方法:代碼如下:
public XmlBeanFactory(Resource resource) throws BeansException{
//呼叫XmlBeanFactory(Resource resource)的構造方法
this(resource,null);
}
建構式內部再次呼叫內部建構式
//parentBeanFactory為父類BeanFactory用于factory合并,可以為空
public XmlBeanFactory(Resource resource,BeanFactory parentBeanFactory) throws BeanException{
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
上面代碼中loadBeanDefinitions(resource)才是資源加載的真正實作,XmlBeanDefinitionReader加載資料就是在這里完成的,
然后在這個方法之前有一個呼叫父類的建構式初始化程序super(parentBeanFactory),
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/348326.html
標籤:其他
