【Spring】Spring入門只要一篇文章
目錄
什么是Spring
- Spring是一個(gè)Java的
免費(fèi)開源的框架。 - Spring 使創(chuàng)建 Java 企業(yè)應(yīng)用程序變得容易。
- 它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。
- 2003 年 2 月,Spring 0.9 版本發(fā)布,它采用了 Apache 2.0 開源協(xié)議;
- 2004 年 4 月,以
interface21框架為基礎(chǔ),Spring 1.0 版本正式發(fā)布。 - Spring的核心理念 : 整合現(xiàn)有的框架技術(shù)。
官網(wǎng) : http://spring.io/
官方下載地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-projects
Spring的優(yōu)點(diǎn) :: IOC和AOP
Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器(框架)
方便解耦,簡(jiǎn)化開發(fā)
Spring 就是一個(gè)大工廠,可以將所有對(duì)象的創(chuàng)建和依賴關(guān)系的維護(hù)交給 Spring 管理。
方便集成各種優(yōu)秀框架
Spring 不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對(duì)各種優(yōu)秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
降低 Java EE API 的使用難度
Spring 對(duì) Java EE 開發(fā)中非常難用的一些 API(JDBC、JavaMail、遠(yuǎn)程調(diào)用等)都提供了封裝,使這些 API 應(yīng)用的難度大大降低。
方便程序的測(cè)試
Spring 支持 JUnit4,可以通過注解方便地測(cè)試 Spring 程序。
AOP 編程的支持
可以進(jìn)行面向切面的編程,可以方便地實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截和運(yùn)行監(jiān)控等功能。
聲明式事務(wù)的編程
聲明式事務(wù)(Declarative Transaction Management)是 Spring 框架中非常常見的事務(wù)管理方式。它不需要顯式地編寫事務(wù)管理的代碼,而是通過注解(Annotation)或 XML (Dependency Injection)配置來管理事務(wù)的行為。
相比于編程式事務(wù)管理,聲明式事務(wù)更加簡(jiǎn)潔和靈活。
Spring組成
模塊介紹
組成 Spring 框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是
BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory使用控制反轉(zhuǎn)(IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。 - Spring 上下文:Spring 上下文是一個(gè)配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如 JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。
- Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向切面的編程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的對(duì)象。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP,不用依賴組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
- Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫(kù)供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)。
- Spring ORM:Spring 框架插入了若干個(gè) ORM 框架,從而提供了 ORM 的對(duì)象關(guān)系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。
- Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于 Web 的應(yīng)用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/li>
- Spring MVC 框架:MVC 框架是一個(gè)全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實(shí)現(xiàn)。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術(shù),其中包括 JSP、Velocity、Tiles、iText 和 POI。
擴(kuò)展部分
- Spring Boot 是 Spring 的一套快速配置腳手架,可以基于Spring Boot 快速開發(fā)單個(gè)微服務(wù);
- Spring Cloud是基于Spring Boot實(shí)現(xiàn)的;
Spring核心
Spring的核心就是兩個(gè)概念要素:IOC(控制反轉(zhuǎn))和AOP(切片編程);
控制反轉(zhuǎn)(IoC)
什么是IoC
控制反轉(zhuǎn)IoC(Inversion of Control),是一種設(shè)計(jì)思想,DI(依賴注入)是實(shí)現(xiàn)IoC的一種方法, 也有人認(rèn)為DI只是IoC的另一種說法。沒有IoC的程序中 , 我們使用面向?qū)ο缶幊?, 對(duì)象的創(chuàng)建與對(duì)象間的依賴關(guān)系完全硬編碼在程序中,對(duì)象的創(chuàng)建由程序自己控制,控制反轉(zhuǎn)后將對(duì)象的創(chuàng)建轉(zhuǎn)移給第三方,個(gè)人認(rèn)為所謂控制反轉(zhuǎn)就是:獲得依賴對(duì)象的方式反轉(zhuǎn)了。
IoC是Spring框架的核心內(nèi)容,使用多種方式完美的實(shí)現(xiàn)了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置實(shí)現(xiàn)IoC。
Spring容器在初始化時(shí)先讀取配置文件,根據(jù)配置文件或元數(shù)據(jù)創(chuàng)建與組織對(duì)象存入容器中,程序使用時(shí)再?gòu)腎oc容器中取出需要的對(duì)象。

控制反轉(zhuǎn)是一種通過描述(XML或注解)并通過第三方去生產(chǎn)或獲取特定對(duì)象的方式。在Spring中實(shí)現(xiàn)控制反轉(zhuǎn)的是IoC容器,其實(shí)現(xiàn)方法是依賴注入(Dependency Injection,DI)。
使用容器進(jìn)行對(duì)象創(chuàng)建
從前使用傳統(tǒng)的創(chuàng)建方案的,流程如serviceImpl→service→daoImpl→dao,僅僅使用一個(gè)的實(shí)現(xiàn)不追加修改的情況下差別不大。但是當(dāng)我們要追加一個(gè)實(shí)現(xiàn)的話,差距就能顯示出來了:
我們?cè)谑褂?strong>傳統(tǒng)的開發(fā)模式進(jìn)行開發(fā)的時(shí)候,需要在Dao追加一個(gè)實(shí)現(xiàn)類,再修改service的實(shí)現(xiàn)類, 以此反復(fù) 這樣子在每次想要追加的時(shí)候都要不停的改動(dòng)代碼,為dao擴(kuò)展實(shí)現(xiàn)類,需要反復(fù)的追加項(xiàng)目變動(dòng)代碼;
使用Spring的IoC的思想,在Dao留一個(gè)入?yún)ⅲ芳邮褂胹et方法實(shí)現(xiàn)改變Dao的項(xiàng)目 。
setUserDao(UserDao userDao){
this.userDao = userDao;
}
這樣我們就將這段邏輯的調(diào)用從主動(dòng)賦值變?yōu)榱吮粍?dòng)獲取;這既是IOC的魅力。
service.setUserDao(userMySqlImpl());
service.getUser();
service.setUserDao(userOracleImpl());
service.getUser();
這樣子在我們的方法體執(zhí)行的時(shí)候,執(zhí)行之前先去確定我們的入?yún)⑹荕ySql還是Oracle,之后在進(jìn)行執(zhí)行方法體。
以前所有東西都是由程序去進(jìn)行控制創(chuàng)建 , 而現(xiàn)在是由我們自行控制創(chuàng)建對(duì)象 , 把主動(dòng)權(quán)交給了調(diào)用者 . 程序不用去管怎么創(chuàng)建,怎么實(shí)現(xiàn)了 . 它只負(fù)責(zé)提供一個(gè)接口。
這種思想 , 從本質(zhì)上解決了問題 , 我們程序員不再去管理對(duì)象的創(chuàng)建了 , 更多的去關(guān)注業(yè)務(wù)的實(shí)現(xiàn) . 耦合性大大降低。 這也就是IOC的原型 !
面向切面編程(AOP).
代理
學(xué)習(xí)理解AOP思想之前要先明白代理模式,AOP的底層邏輯就是動(dòng)態(tài)代理!

我們(Client)想要做一個(gè)事情(AbstractSubject),可以直接去找合作方(RealSubject),也可以找代理商中介(Proxy),都可以把這件事情完成。
使用代理(Proxy)可以省略許多過程;只需要最終結(jié)果就可以了。
什么是AOP
AOP(Aspect Oriented Programming)意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
AOP 可以說 是一種 面向?qū)ο笏枷?的一種延續(xù),使用AOP將各個(gè)業(yè)務(wù)邏輯的各部分拆解開來,降低各個(gè)業(yè)務(wù)邏輯之間的耦合性,提高程序之間的可重(chong)用性,提高開發(fā)效率。減少因?yàn)楦唏詈习l(fā)生的系統(tǒng)問題。

看上圖,我們發(fā)現(xiàn)許多的地方有相似的地方,其中業(yè)務(wù)邏輯可以單獨(dú)寫一個(gè)方法,之后我們使用AOP切片思想,在業(yè)務(wù)邏輯外橫切入進(jìn)去進(jìn)行切入點(diǎn)操作,這樣我們完成了。
AOP的作用
提供聲明式事務(wù);允許用戶自定義切面
- 橫切關(guān)注點(diǎn):跨越應(yīng)用程序多個(gè)模塊的方法或功能。
- 與我們業(yè)務(wù)邏輯無關(guān)的,但是我們需要關(guān)注的部分,就是橫切關(guān)注點(diǎn)。如日志 , 安全 , 緩存 , 事務(wù) 等等 ….
- 切面(ASPECT):橫切關(guān)注點(diǎn) 被模塊化 的特殊對(duì)象。即,它是一個(gè)類(Classs)。
- 通知(Advice):切面必須要完成的工作。即,它是類中的一個(gè)方法(Function)。
- 目標(biāo)(Target):被通知對(duì)象。
- 代理(Proxy):向目標(biāo)對(duì)象應(yīng)用通知之后創(chuàng)建的對(duì)象。
- 切入點(diǎn)(PointCut):切面通知 執(zhí)行的 “地點(diǎn)”的定義。
- 連接點(diǎn)(JointPoint):與切入點(diǎn)匹配的執(zhí)行點(diǎn)。
SpringAOP中,通過Advice定義橫切邏輯,Spring中支持5種類型的Advice:
Spring AOP 通知類型說明
| 通知類型 | 觸發(fā)時(shí)機(jī)(連接點(diǎn)) | 實(shí)現(xiàn)接口 | 核心邏輯說明 |
|---|---|---|---|
| 前置通知 | 目標(biāo)方法執(zhí)行前 | MethodBeforeAdvice | 方法執(zhí)行前插入邏輯,可做參數(shù)校驗(yàn) |
| 后置通知 | 目標(biāo)方法正常返回后 | AfterReturningAdvice | 方法返回結(jié)果后執(zhí)行,可記錄返回值 |
| 環(huán)繞通知 | 目標(biāo)方法執(zhí)行前后 | MethodInterceptor(AOP Alliance 規(guī)范) | 完全包裹目標(biāo)方法,可控制執(zhí)行時(shí)機(jī) |
| 異常通知 | 目標(biāo)方法拋出異常時(shí) | ThrowsAdvice | 方法拋異常時(shí)觸發(fā),用于異常處理 |
| 引介通知 | 類新增方法 / 屬性時(shí) | IntroductionInterceptor | 給目標(biāo)類動(dòng)態(tài)添加接口實(shí)現(xiàn)(少用) |
如此可以在不改變?cè)写a的情況下 , 去增加新的功能


浙公網(wǎng)安備 33010602011771號(hào)