Spring IoC容器和AOP

1、Spring簡單介紹

學習了spring,發現對spring的概念並不是特別理解,查閱了很多資料,資源亂七八糟的,參差不齊,看到合適的容易理解的並且覺得介紹的是正確的,遂做筆記摘抄與各位分享,如有錯誤,還請各位大佬批評指出

Spring有兩大特性:IoC\color{red}{IoC}AOP\color{red}{AOP}
IoC(Inversion of Control),意爲控制反轉
AOP(Aspect-Oriented Programming),意爲面向切面編程

Spring核心容器的主要組件是Bean工廠(BeanFactory),Bean工廠使用控制反轉(IoC)模式來降低程序代碼之間的耦合度,並提供了面向切面編程(AOP)的實現。

簡單說Spring(IoC)(AOP)\color{red}{Spring是一個輕量級的控制反轉(IoC)和麪向切面編程(AOP)的容器框架}

2、Spring常用註解

在具體介紹IoC和AOP之前,我們先簡要說明下Spring常用註解

常用註解 說明
@Controller 用於標註控制器層組件
@Service 用於標註業務層組件
@Component 用於標註這是一個受 Spring 管理的組件,組件引用名稱是類名,第一個字母小寫。可以使用@Component(“beanID”) 指定組件的名稱
@Repository 用於標註數據訪問組件,即DAO組件
@Bean 方法級別的註解,主要用在@Configuration和@Component註解的類裏,@Bean註解的方法會產生一個Bean對象,該對象由Spring管理並放到IoC容器中。引用名稱是方法名,也可以用@Bean(name = “beanID”)指定組件名
@Scope(“prototype”) 將組件的範圍設置爲原型的(即多例)。保證每一個請求有一個單獨的action來處理,避免action的線程問題。由於Spring默認是單例的,只會創建一個action對象,每次訪問都是同一個對象,容易產生併發問題,數據不安全
@Autowired 默認按類型進行自動裝配。在容器查找匹配的Bean,當有且僅有一個匹配的Bean時,Spring將其注入@Autowired標註的變量中
@Resource 默認按名稱進行自動裝配,當找不到與名稱匹配的Bean時會按類型裝配

如果能明確該類是一個控制器類組件的,用@Controller;能明確是一個服務類組件的,用@Service;能明確該類是一個數據訪問組件的,用@Repository;不確定或不好區分的,但想讓該類動態裝配的用@Component。

@Controller、@Service、@Component、@Repository都是類級別的註解,如果一個方法也想動態裝配,用@Bean。

當想按類型進行自動裝配時,用@Autowired;當想按名稱(beanID)進行自動裝配時,用@Resource;當我們要根據需要(比如配置信息等)來動態裝配不同的組件時,可以用getBean(“beanID”)。

3、控制反轉(IoC)

控制反轉,就是創建對象的控制權,被反轉到了Spring框架上。

通常,我們實例化一個對象時,都是使用類的構造方法來new一個對象,這個過程是由我們自己來控制的,而控制反轉就把new對象的工作交給了Spring容器,通過spring可以在容器中拿到對象

下面我找來一個例子幫助理解IoC(出處:IOC和AOP

當一個公司需要新的員工或者其他什麼資源時,傳統的做法是公司自己進行招聘,有了中介之後,公司聯繫中介公司說我要什麼樣的員工(類),員工需要有什麼樣的技能(類的依賴類或者其他資源)。如果中介公司有這樣的員工,交給公司。公司主動找人的過程就變成接受中介找到的員工,公司的主動權變爲了被動接受。這就是控制反轉。

IoC容器:具有依賴注入功能的容器,可以創建對象的容器。IoC容器負責實例化、定位、配置應用程序中的對象並建立這些對象之間的依賴。

4、依賴注入(DI)

DI(Dependency Injection)意爲依賴注入。

依賴注入:由IoC容器動態地將某個對象所需要的外部資源(包括對象、資源、常量數據)注入到組件(Controller, Service等)之中。簡單點說,就是IoC容器會把當前對象所需要的外部資源動態的注入給我們。

Spring依賴注入的方式主要有四個:基於註解注入方式、set注入方式、構造器注入方式、靜態工廠注入方式。推薦使用基於註解注入方式,配置較少,比較方便。

5、面向切面編程(AOP)

面向切面編程(AOP)就是縱向的編程。比如業務A和業務B現在需要一個相同的操作,傳統方法我們可能需要在A、B中都加入相關操作代碼,而應用AOP就可以只寫一遍代碼,A、B共用這段代碼。並且,當A、B需要增加新的操作時,可以在不改動原代碼的情況下,靈活添加新的業務邏輯實現。

在實際開發中,比如商品查詢、促銷查詢等業務,都需要記錄日誌、異常處理等操作,AOP把所有共用代碼都剝離出來,單獨放置到某個類中進行集中管理,在具體運行時,由容器進行動態織入這些公共代碼。

AOP主要一般應用於簽名驗籤、參數校驗、日誌記錄、事務控制、權限控制、性能統計、異常處理等。

5.1 AOP涉及名詞

切面(Aspect):共有功能的實現。如日誌切面、權限切面、驗籤切面等。在實際開發中通常是一個存放共有功能實現的標準Java類。當Java類使用了@Aspect註解修飾時,就能被AOP容器識別爲切面。

通知(Advice):切面的具體實現。就是要給目標對象織入的事情。以目標方法爲參照點,根據放置的地方不同,可分爲前置通知(Before)、後置通知(AfterReturning)、異常通知(AfterThrowing)、最終通知(After)與環繞通知(Around)5種。在實際開發中通常是切面類中的一個方法,具體屬於哪類通知,通過方法上的註解區分。

連接點(JoinPoint):程序在運行過程中能夠插入切面的地點。例如,方法調用、異常拋出等。Spring只支持方法級的連接點。一個類的所有方法前、後、拋出異常時等都是連接點。

切入點(Pointcut):用於定義通知應該切入到哪些連接點上,不同的通知通常需要切入到不同的連接點上,這種精準的匹配是由切入點的正則表達式來定義的。

比如,在上面所說的連接點的基礎上,來定義切入點。我們有一個類,類裏有10個方法,那就產生了幾十個連接點。但是我們並不想在所有方法上都織入通知,我們只想讓其中的幾個方法,在調用之前檢驗下入參是否合法,那麼就用切點來定義這幾個方法,讓切點來篩選連接點,選中我們想要的方法。切入點就是來定義哪些類裏面的哪些方法會得到通知。

目標對象(Target):那些即將切入切面的對象,也就是那些被通知的對象。這些對象專注業務本身的邏輯,所有的共有功能等待AOP容器的切入。

代理對象(Proxy):將通知應用到目標對象之後被動態創建的對象。可以簡單地理解爲,代理對象的功能等於目標對象本身業務邏輯加上共有功能。代理對象對於使用者而言是透明的,是程序運行過程中的產物。目標對象被織入共有功能後產生的對象。

織入(Weaving):將切面應用到目標對象從而創建一個新的代理對象的過程。這個過程可以發生在編譯時、類加載時、運行時。Spring是在運行時完成織入,運行時織入通過Java語言的反射機制與動態代理機制來動態實現。

5.2 Pointcut用法

Pointcut格式爲:

execution(modifier-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

修飾符匹配 modifier-pattern? 例:public private

返回值匹配 ret-type-pattern 可以用 * 表示任意返回值

類路徑匹配 declaring-type-pattern? 全路徑的類名

方法名匹配 name-pattern 可以指定方法名或者用 * 表示所有方法;set* 表示所有以set開頭的方法

參數匹配 (param-pattern) 可以指定具體的參數類型,多個參數用“,”分隔;可以用 * 表示匹配任意類型的參數;可以用 (…) 表示零個或多個任意參數

異常類型匹配throws-pattern? 例:throws Exception

其中後面跟着 ? 表示可選項
例:

@Pointcut("execution(public * cn.wbnull. springbootdemo.controller.*.*(..))")
private void sign() {
}

參考該博主寫的深入理解Spring兩大特性:IoC和AOP

6、Spring核心jar包

Spring核心容器jar包

  1. Beans\color{red}{Beans} :spring-beans-4.3.18.RELEASE.jar
  2. Core\color{red}{Core} :spring-core-4.3.18.RELEASE.jar
  3. Context\color{red}{Context} :spring-context-4.3.18.RELEASE.jar
  4. Expression\color{red}{Expression} :spring-expression-4.3.18.RELEASE.jar
  5. Context support:spring-context-support-4.3.18.RELEASE.jar

在這裏插入圖片描述

測試

  1. Test:spring-test-4.3.18.RELEASE.jar

面向切面編程:(核心)

  1. Aop:spring-aop-4.3.18.RELEASE.jar
  2. Aspects:spring-aspects-4.3.18.RELEASE.jar

數據訪問和集成:

  1. JDBC:spring-jdbc-4.3.18.RELEASE.jar
  2. Transaction:spring-tx-4.3.18.RELEASE.jar
  3. ORM:spring-orm-4.3.18.RELEASE.jar
  4. OXM:spring-oxm-4.3.18.RELEASE.jar
  5. Messaging:spring-messaging-4.3.18.RELEASE.jar
  6. JMS:spring-jms-4.3.18.RELEASE.jar

Web遠程調用:

  1. Web:spring-web-4.3.18.RELEASE.jar
  2. Web Servlet:spring-webmvc-4.3.18.RELEASE.jar
  3. Web portlet:spring-webmvc-portlet-4.3.18.RELEASE.jar
  4. Web Socket:spring-websocket-4.3.18.RELEASE.jar

依賴包

  1. commons-loggins…jar

spring各版本jar包下載鏈接

各jar包作用

下面講解各個jar包的作用(轉自腳本之家

\color{red}{\diamondsuit} 1.org.springframework.aop或spring-aop.jar
這個jar文件包含在應用中使用Spring的AOP特性時所需的類。使用基於AOP的Spring特性,如聲明型事務管理(Declarative Transaction Management),也要在應用裏包含這個jar包。

外部依賴spring-core.jar,spring-beans.jar,cglib-nodep.jar,aopalliance.jar

附:aopalliance.jar:這個包是AOP聯盟的API包,裏面包含了針對面向切面的接口。通常Spring等其它具備動態織入功能的框架依賴此包。

cglib-nodep.jar:這個包是一個強大的、高性能、高質量的Code生成類庫。它可以在運行期擴展Java類與實現Java接口。 當然這些實際的功能是asm所提供的,asm又是什麼?Java字節碼操控框架。cglib就是封裝了asm,簡化了asm的操作,實現了在運行期動態生成新的class。 實際上CGlib爲spring aop提供了底層的一種實現;爲hibernate使用cglib動態生成VO/PO (接口層對象)。

\color{red}{\heartsuit} 2.spring-asm.jar
Spring獨立的asm程序, Spring2.5.6的時候需要asmJar 包, 3.0開始提供他自己獨立的asmJar。

\color{red}{\diamondsuit} 3.spring-beans.jar
這個jar文件是所有應用都要用到的,它包含訪問配置文件、創建和管理bean 以及進行Inversion of Control / Dependency Injection(IoC/DI)操作相關的所有類。如果應用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。
外部依賴spring-core,cglib-nodep.jar。

\color{red}{\heartsuit} 4.spring-core.jar
這個jar 文件包含Spring 框架基本的核心工具類。Spring 其它組件要都要使用到這個包裏的類,是其它組件的基本核心,當然你也可以在自己的應用系統中使用這些工具類。
外部依賴Commons-Logging, Log4J。

\color{red}{\diamondsuit} 5.spring-aop.jar
這個jar 文件包含在應用中使用Spring 的AOP 特性時所需的類和源碼級元數據支持。使用基於AOP 的Spring特性,如聲明型事務管理(Declarative Transaction Management),也要在應用裏包含這個jar包。
外部依賴spring-core,spring-beans,aopalliance,CGLIB,Commons Attributes。

\color{red}{\heartsuit} 6.spring-context.jar
這個jar文件爲Spring核心提供了大量擴展。可以找到使用Spring ApplicationContext特性時所需的全部類,JDNI 所需的全部類,instrumentation組件以及校驗Validation 方面的相關類。
外部依賴spring-core.jar,spring-beans.jar,spring-aop.jar,commons-collections.jar,aopalliance.jar。

\color{red}{\diamondsuit} 7.spring-dao.jar
這個jar 文件包含Spring DAO、Spring Transaction 進行數據訪問的所有類。爲了使用聲明型事務支持,還需在自己的應用裏包含spring-aop.jar。
外部依賴spring-core,spring-aop, spring-context, JTA API。

\color{red}{\heartsuit} 8.spring-jdbc.jar
這個jar 文件包含對Spring 對JDBC 數據訪問進行封裝的所有類。
外部依賴spring-beans,spring-dao。

\color{red}{\diamondsuit} 9.spring-support.jar
這個jar文件包含支持UI模版(Velocity,FreeMarker,JasperReports),郵件服務,腳本服務(JRuby),緩存Cache(EHCache),任務計劃Scheduling(uartz)方面的類。
外部依賴spring-context, spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache

\color{red}{\heartsuit} 10.spring-web.jar
這個jar 文件包含Web 應用開發時,用到Spring 框架時所需的核心類,包括自動載入Web Application Context 特性的類、Struts 與JSF 集成類、文件上傳的支持類、Filter 類和大量工具輔助類。
外部依賴spring-context, Servlet API, JSP API, JSTL, Commons FileUpload, COS。

\color{red}{\diamondsuit} 11.spring-webmvc.jar
這個jar 文件包含Spring MVC 框架相關的所有類。包括框架的Servlets,Web MVC框架,控制器和視圖支持。當然,如果你的應用使用了獨立的MVC 框架,則無需這個JAR 文件裏的任何類。
外部依賴spring-web, spring-support,Tiles,iText,POI。

\color{red}{\heartsuit} 12.spring-portlet.jar
spring自己實現的一個類似Spring MVC的框架。包括一個MVC框架和控制器。
外部依賴spring-web, Portlet API,spring-webmvc。

\color{red}{\diamondsuit} 13.spring-struts.jar
Struts框架支持,可以更方便更容易的集成Struts框架。
外部依賴spring-web,Struts。

\color{red}{\heartsuit} 14.spring-remoting.jar
這個jar 文件包含支持EJB、遠程調用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的類。
外部依賴spring-aop, (spring-context,spring-web,Hessian,Burlap,JAX-RPC,EJB API)。
\color{red}{\diamondsuit} 15.spring-jmx.jar
這個jar包提供了對JMX 1.0/1.2的支持類。
外部依賴spring-beans,spring-aop, JMX API。

\color{red}{\heartsuit} 16.spring-jms.jar
這個jar包提供了對JMS 1.0.2/1.1的支持類。
外部依賴spring-beans,spring-dao,JMS API。

\color{red}{\diamondsuit} 17spring-jca.jar
對JCA 1.0的支持。JDO(Java Data Object )是Java對象持久化的新的規範,也是一個用於存取某種數據倉庫中的對象的標準化API。
外部依賴spring-beans,spring-dao, JCA API。

\color{red}{\heartsuit} 18.spring-jdo.jar
對JDO 1.0/2.0的支持。JCA (J2EE 連接器架構,Java Connector Architecture),可以將有JCA適配器其他語言的系統部署到j2ee應用服務器中
外部依賴spring-jdbc, JDO API, (spring-web)。

\color{red}{\diamondsuit} 19.spring-jpa.jar
對JPA 1.0的支持。
外部依賴spring-jdbc, JPA API, (spring-web)。

\color{red}{\heartsuit} 20.spring-hibernate2.jar
對Hibernate 2.1的支持,已經不建議使用。
外部依賴spring-jdbc,Hibernate2,(spring-web)。

\color{red}{\diamondsuit} 21.spring-hibernate3.jar
對Hibernate 3.0/3.1/3.2的支持。
外部依賴spring-jdbc,Hibernate3,(spring-web)。
\color{red}{\heartsuit} 22.spring-toplink.jar
對TopLink框架的支持。
外部依賴spring-jdbc,TopLink。
\color{red}{\diamondsuit} 23.spring-ibatis.jar
對iBATIS SQL Maps的支持。
外部依賴spring-jdbc,iBATIS SQL Maps。

\color{red}{\heartsuit} 24.spring-mock.jar
這個jar 文件包含Spring 一整套mock 類來輔助應用的測試。Spring 測試套件使用了其中大量mock 類,這樣測試就更加簡單。模擬HttpServletRequest 和HttpServletResponse 類在Web 應用單元測試是很方便的。並且提供了對JUnit的支持。
外部依賴spring-core。

\color{red}{\diamondsuit} 25.spring-aspects.jar
提供對AspectJ的支持,以便可以方便的將面向方面的功能集成進IDE中,比如Eclipse AJDT。
外部依賴。

\color{red}{\heartsuit} 26.spring-agent.jar
Spring的InstrumentationSavingAgent (爲InstrumentationLoadTimeWeaver),一個設備代理包,可以參考JDK1.5的Instrumentation功能獲得更多信息。
外部依賴none (for use at JVM startup: “-javaagent:spring-agent.jar”)。

\color{red}{\diamondsuit} 27.spring-tomcat-weaver.jar
擴展Tomcat的ClassLoader,使其可以使用instrumentation(設備)類。
外部依賴none (for deployment into Tomcat’s “server/lib” directory)。

spring各版本jar包下載鏈接

發佈了84 篇原創文章 · 獲贊 115 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章