javascript
spring aop实例讲解_Spring框架核心知识点
文章內(nèi)容輸出來源:拉勾教育Java高薪訓(xùn)練營
前言:
由于工作需要提升自身技術(shù)能力,在各方比較下,報名了拉勾教育的java高薪訓(xùn)練營,目前已經(jīng)學(xué)了半個月啦,來說說自身學(xué)習(xí)的感受吧:
- 課程內(nèi)容有廣度更有深度,幾乎目前進(jìn)大廠需要的主流技術(shù)點都覆蓋了,包括比較新的mybatis-plus,k8s,flink等等,深度方面,更是帶領(lǐng)大家一起分析并手寫框架,然后去翻閱源代碼學(xué)習(xí)原理,這樣學(xué)習(xí)效果會更好;
- 老師講課也是很有水平,通過畫圖各種方式來講解課程內(nèi)容,并且課程有基礎(chǔ)回顧,有高級的技術(shù)點,也有一些面試高頻題的講解;
- 每個階段的學(xué)習(xí)都有作業(yè),需要認(rèn)真學(xué)習(xí)并對待才能完成作業(yè),作業(yè)挺有難度,包括簡答題和編程題,有些還需要自己畫圖來完成;
- 學(xué)習(xí)過程中,會有班主任的督促學(xué)習(xí),并且答疑老師也是非常耐心,經(jīng)常晚上都還在幫同學(xué)解答問題;
- 課程內(nèi)容挺多,需要花時間來認(rèn)真學(xué)習(xí),只要自己努力了,肯定不會虧,加油沖大廠。
一、Spring概述
1、Spring簡介
Spring是一個分層的全棧輕量級開源框架,核心是IOC和AOP,還能整合眾多的第三方開源框架和類庫,已經(jīng)成為使用最多的JAVA EE企業(yè)級應(yīng)用開源框架。
2、Spring優(yōu)勢
- 方便解耦,簡化開發(fā)
- AOP編程的支持
- 聲明式事務(wù)的支持
- 方便程序的測試
- 方便集成各種優(yōu)秀框架
- 降低JavaEE API的使用難度
- 源碼是經(jīng)典的JAVA學(xué)習(xí)范例
3、Spring的核心結(jié)構(gòu)
Spring是一個層級清晰,職責(zé)分明、且依賴關(guān)系非常輕量的框架,主要包括幾個模塊:
- 數(shù)據(jù)處理模塊
Spring的JDBC和DAO模塊封裝了大量樣板代碼,使得數(shù)據(jù)庫代碼更加簡潔,開發(fā)者可以更加專注業(yè)務(wù),還可以避免數(shù)據(jù)庫資源釋放失敗而引起的問題。另外,Spring AOP為數(shù)據(jù)訪問提供了事務(wù)管理服務(wù),同時還集成了其他ORM框架
- WEB模塊
該模塊提供了SpringMVC框架給WEB應(yīng)用,還提供了多種構(gòu)建和其他應(yīng)用交互的遠(yuǎn)程調(diào)用方案,SpringMVC框架在WEB層提升了應(yīng)用的松耦合水平。
- 面向切面編程AOP模塊:
對面向切面編程提供了豐富的支持。這個模塊是Spring應(yīng)用系統(tǒng)中開發(fā)切面的基礎(chǔ),與DI一樣,AOP可以幫助應(yīng)用對象解耦。
- Spring核心容器Core Container模塊:
是Spring框架最核心的部分,它管理著Spring應(yīng)用中bean的創(chuàng)建、配置和管理。在該模塊中,包括了Spring Bean工廠,為Spring提供了DI功能。基于Bean工廠,我們還會發(fā)現(xiàn)多種Spring應(yīng)用上下文的實現(xiàn),所有的Spring模塊都構(gòu)建于核心容器之上
- TEST模塊
為了使開發(fā)者能夠很方便進(jìn)行測試,Spring提供了測試模塊來進(jìn)行Spring應(yīng)用的測試。
如下圖所示:
二、Spring核心
IOC和AOP是Spring的核心
1、IOC
1.1、IOC的定義
IOC,控制反轉(zhuǎn),它是一個技術(shù)思想,核心就是將new對象的操作交由IOC容器去幫助我們完成,包括創(chuàng)建實例化對象并管理它,我們需要使用哪個對象,去IOC容器獲取即可。控制指的是對象創(chuàng)建(實例化、管理)的權(quán)力,反轉(zhuǎn)指的是控制權(quán)交給了外部環(huán)境(IOC容器)
1.2、IOC解決了什么問題
- 對象之間的耦合問題
1.3、IOC和DI的區(qū)別
IOC和DI描述的是同一件事情(對象實例化以及依賴關(guān)系維護(hù)這件事),只是不同角度罷了。
IOC是站在對象的角度,對象實例化及其管理的權(quán)力交給了容器,DI是站在容器的角度,容器會把對象依賴的屬性注入。
2、AOP
2.1、AOP定義
面向切面編程,是OOP(面向?qū)ο?#xff09;的延續(xù),OOP解決不了以下問題:
- 代碼重復(fù)問題
- 邏輯代碼和業(yè)務(wù)代碼混雜在一起,代碼臃腫,維護(hù)不方便
AOP提出橫向抽取機(jī)制,將橫切邏輯代碼和業(yè)務(wù)邏輯代碼分離
2.2、AOP解決了什么問題
在不改變原有業(yè)務(wù)邏輯情況下,增強(qiáng)橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重復(fù)。
2.3、為什么叫做面向切面編程
切:指的是橫切邏輯,原有業(yè)務(wù)邏輯代碼我們不能動,只能操作橫切邏輯代碼,所以?向橫切邏輯
?:橫切邏輯代碼往往要影響的是很多個?法,每?個?法都如同?個點,多個點構(gòu)成?,有?個 ?的概念在??
三、Spring IOC應(yīng)用
1、Spring IOC基礎(chǔ)
- beans.xml:定義需要實例化對象的類的全限定名以及其各個類之間的依賴關(guān)系描述
- BeanFactory:IOC容器,通過反射技術(shù)來實例化對象并維護(hù)對象之間的依賴關(guān)系
2、Spring IOC的三種實現(xiàn)方式
- 純XML(BEAN信息完全定義在XML中)
- XML+注解(部分bean使用XML定義,部分bean使用注解定義)
- 純注解模式(所有的bean都是通過注解來定義)
3、BeanFactory和ApplicationContext的區(qū)別
BeanFactory是Spring框架IOC容器的頂層接口,用于定義一些基礎(chǔ)功能和規(guī)范,ApplicationContext是它的一個子接口。通常我們稱BeanFactory是Spring IOC的基礎(chǔ)容器,ApplicationContext是容器的高級接口,比BeanFactory擁有更多功能,比如說國際化支持和資源訪問(XML、JAVA配置類等)。
4、實例化Bean的三種方式
- 使用無參構(gòu)造函數(shù)
在默認(rèn)情況下,通過反射調(diào)用無參構(gòu)造函數(shù)來創(chuàng)建對象,如果類中沒有無參構(gòu)造函數(shù),則創(chuàng)建對象失敗。
<bean id="ConnUtils" class="com.lagou.edu.utils.ConnUtils"> </bean>
- 使用靜態(tài)方法創(chuàng)建
<bean id="userService" class="com.lagou.factory.BeanFactory" factory-method="getTransferService"></bean>
- 使用實例化方法創(chuàng)建
5、Bean的作用范圍及生命周期
作用范圍:
- singleton:單例模式,在容器中僅有一個實例對象,IOC創(chuàng)建的對象默認(rèn)都是單例的
- prototype:原型模型(多例模式),每次getBean都會創(chuàng)建一個新的對象
- request:(web環(huán)境)每個request請求維護(hù)一個實例
- session(web環(huán)境)每個session會話維護(hù)一個實例
- application(web環(huán)境)每個應(yīng)用上下文維護(hù)一個實例
- websocket(web環(huán)境)
實際開發(fā)中常用的就singleton和prototype這兩種模式。配置如下
<bean id="transferService" class="com.lagou.service.impl.TransferServiceImpl" scope="singleton"> </bean>不同作用范圍有不同的生命周期:
- 單例模式:單例模式bean對象生命周期與容器相同
- 多例模式:每次使用對象都重新創(chuàng)建一個新對象,Spring框架只負(fù)責(zé)創(chuàng)建,銷毀由JAVA垃圾回收器負(fù)責(zé)
6、bean標(biāo)簽的常用屬性
- id屬性:bean對象的唯一標(biāo)識
- class屬性:類全限定名
- name屬性:類名稱,可以重復(fù),沒啥用
- factory-bean屬性:用于指定創(chuàng)建當(dāng)前bean對象的???法,如配合factory-bean屬性使?, 則class屬性失效。如配合class屬性使?,則?法必須是static的。
- scope:指定bean對象的作用范圍,默認(rèn)是singleton
- init-method屬性:指定bean對象的初始化方法,此方法會在bean對象裝配后調(diào)用,該方法必須是一個無參方法
- destory-method屬性:?于指定bean對象的銷毀?法,此?法會在bean對象銷毀前執(zhí)?。它只 能為scope是singleton時起作?。
7、常用注解
- @Autowired :根據(jù)指定的類型注入
- @Qualifier:告訴Spring具體去裝配哪個對象,可以結(jié)合@Autowired唯一確定對象
- @Resource: 默認(rèn)按照 ByName 自動注入
- @Configuration:表名當(dāng)前類是一個配置類
- @ComponentScan: 注解,替代 context:component-scan
- @PropertySource:引?外部屬性配置?件
- @Import:引?其他配置類
- @Value:對變量賦值,可以直接賦值,也可以使? ${} 讀取資源配置?件中的信息
- @Bean:將?法返回對象加? Spring IOC容器
Spring IOC高級特性
1、lazy-init延遲加載
延遲加載指的是Spring Bean的延遲創(chuàng)建。
默認(rèn)情況下,Spring會在容器啟動時就將所有的singleton bean提前進(jìn)行實例化,例如:
<bean id="ConnUtils" class="com.lagou.edu.utils.ConnUtils" lazy-init="false"></bean>lazy-init為false表示在spring啟動時,立即進(jìn)行實例化該bean
如果不想讓某個singleton bean在ApplicationContext初始化時被提前實例化,可以將bean設(shè)置為延遲加載,即將lazy-init屬性設(shè)為true即可,此時的bean只有當(dāng)?shù)谝淮蜗蛉萜鱣etBean的時候才會進(jìn)行實例化。
如果一個設(shè)置了立即加載的bean1,引用了一個延遲加載的bean2,那么bean1在容器啟動時被實例化,而bean2由于被bean1引用,也在此時被實例化,符合延遲加載的bean在第一次被使用時才初始化的原則。
如果一個bean的scope屬性為scope="prototype"時,即使設(shè)置了lazy-init=false,容器啟動時也不會實例化bean,而是調(diào)用getBean方法才會進(jìn)行初始化。
延遲加載應(yīng)用場景:
- 開啟延遲加載一定程度提高容器啟動和運轉(zhuǎn)性能
- 對于不常使?的 Bean 設(shè)置延遲加載,這樣偶爾使?的時候再加載,不必要從?開始該 Bean 就占 ?資源
容器不是一個Map,map其實只是ioc容器的一個成員,叫單例池,容器是一組組件和過程的集合,包括BeanFactory、單例池、BeanPost。
四、Spring AOP應(yīng)用
AOP本質(zhì):在不改變原有業(yè)務(wù)邏輯的情況下增強(qiáng)橫切邏輯,常用于權(quán)限校驗、日志記錄、事務(wù)控制、性能監(jiān)控等。
1、Spring AOP術(shù)語
- Joinpoint(連接點):可以將增強(qiáng)代碼加入到業(yè)務(wù)中的方法點
- PointCut(切入點):具體實現(xiàn)增強(qiáng)的業(yè)務(wù)方法點
- Advice(通知、增強(qiáng)):值切面類中用于提供增強(qiáng)功能的方法,并且不同方法增強(qiáng)的時機(jī)是不一樣的,分類有:前置通知、后置通知、異常通知、最終通知、環(huán)繞通知
- `Target`(目標(biāo)對象):代理的目標(biāo)對象,即被代理對象
- Proxy(代理):指一個類被AOP織入增強(qiáng)后,產(chǎn)生的代理對象
- Weaving(織入):指把增強(qiáng)應(yīng)用到目標(biāo)對象來創(chuàng)建新的代理對象的過程,Spring采用動態(tài)代理來實現(xiàn)
- Aspect(切面):指增強(qiáng)的代碼所關(guān)注的方面,把這些相關(guān)的增強(qiáng)代碼定義到一個類中,這個類就是切面類
切面=切入點(鎖定方法)+方位點(鎖定方法中的特殊時機(jī))+橫切邏輯
2、Spring中AOP的代理選擇
Spring AOP思想是通過動態(tài)代理技術(shù)來實現(xiàn)的。
在默認(rèn)情況下,Spring會根據(jù)被代理對象是否實現(xiàn)接口來選擇JDK還是CGLIB代理,如果被代理類未實現(xiàn)接口,則采用CGLIB代理,如果實現(xiàn)了接口,則采用JDK動態(tài)代理,我們也可以通過配置來讓Spring強(qiáng)制使用CGLIB代理。
3、Spring中AOP的配置方式
Spring 中AOP也有三種配置方式:
- XML
- XML+注解組合
- 純注解
4、Spring中AOP實現(xiàn)
XML模式
- 導(dǎo)入jar包:
- AOP核心配置:
- 切入點表達(dá)式pointcut的表達(dá)式規(guī)則:
訪問修飾符 返回值 包名.包名.包名.類名.方法名(參數(shù)列表)
其中訪問修飾符可以省略
返回值可以使用*表示任意返回值
包名可以使用.表示任意包,但是有幾級包就對應(yīng)幾個. , 因此可以使用..來表示當(dāng)前包及其子包
類和方法名都可以使用.表示任意類、任意方法
參數(shù)列表,基本類型直接寫類型名稱,如int,引用類型必須寫全限定類名,如java.lang.String
? 參數(shù)列表可以使用..表示有無參數(shù)均可
? 全通配方式:* *..*.*(..)
- 修改代理方式配置:
- 方式一:使?aop:config標(biāo)簽配置
- 五種通知類型:
- 前置通知:aop:before標(biāo)簽:
XML+注解模式
- XML中開啟Spring對注解AOP的支持
#### 注解模式
配置類加入如下注解:
@Configuration@ComponentScan("com.lagou")@EnableAspectJAutoProxy //開啟spring對注解AOP的?持public class SpringConfiguration {}5、Spring聲明式事務(wù)支持
1、事務(wù)基礎(chǔ)
1.1 事務(wù)概念
事務(wù)指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部失敗,從而確保數(shù)據(jù)的準(zhǔn)確與安全
1.2 事務(wù)的四大特性
- 原子性:事務(wù)是一個不可分割的工作單元,事務(wù)中的操作要么全部發(fā)生,要么都不發(fā)生
- 一致性:事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài)
- 隔離性:多個用戶并行訪問數(shù)據(jù)庫時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),每個事務(wù)不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個并發(fā)事務(wù)之間要隔離
- 持久性:一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是持久性的,即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有影響
1.3 事務(wù)的隔離級別
如果不考慮隔離級別,會出現(xiàn)以下情況:
- 臟讀:一個線程中的事務(wù)讀到了另一個線程中未提交的數(shù)據(jù)
- 不可重復(fù)讀:一個線程中的事務(wù)讀到了另一個線程中已經(jīng)提交的update數(shù)據(jù)(前后內(nèi)容不一致)
- 虛讀(幻讀):一個線程中的事務(wù)讀到了另一個線程中已經(jīng)提交的Insert或者update的數(shù)據(jù)(前后條數(shù)不一致)
數(shù)據(jù)庫的隔離級別:
- Serializable(串行化):可避免臟讀、不可重復(fù)讀、虛讀情況發(fā)生。(每個線程都排隊進(jìn)行訪問)級別最高
- Repeatable read(可重復(fù)讀):可避免臟讀、不可重復(fù)讀的情況發(fā)生(幻讀有可能發(fā)生)。該機(jī)制下會對要update的行進(jìn)行加鎖 級別第二
- Read committed(讀已提交):可避免臟讀情況發(fā)生 級別第三
- Read uncommitted(讀未提交):最低級別,以上情況均?法保證。(讀未提交) 級別最低
效率與級別高低成反比
MYSQL默認(rèn)的隔離級別是:REPEATABLE READ
查詢當(dāng)前使?的隔離級別: select @@tx_isolation;
設(shè)置MySQL事務(wù)的隔離級別: set session transaction isolation level xxx;
(設(shè)置的是當(dāng)前 mysql連接會話的,并不是永久改變的)
1.4 事務(wù)的傳播行為
事務(wù)往往在service層進(jìn)行控制,如果出現(xiàn)service層方法A調(diào)用了另一個service層方法B,A和B方法本身都已經(jīng)添加了事務(wù)控制,那么A在調(diào)用B的時候,就需要進(jìn)行一些事務(wù)策略的協(xié)商,這就叫做事務(wù)的傳播行為。
- PROPAGATION_REQUIRED:如果當(dāng)前沒有事務(wù),就新建?個事務(wù),如果已經(jīng)存在?個事務(wù)中, 加?到這個事務(wù)中。這是最常?的選擇。
- PROPAGATION_SUPPORTS:?持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以?事務(wù)?式執(zhí)?。
2、Spring聲明式事務(wù)配置
2.1 純XML模式
- 導(dǎo)入jar包:
- XML配置
2.2 XML+注解
- XML配置
- 在接?、類或者?法上添加@Transactional注解
2.3 純注解
Spring基于注解驅(qū)動開發(fā)的事務(wù)控制配置,只需要把 xml 配置部分改為注解實現(xiàn)。只是需要?個 注解替換掉xml配置?件中的 配置。 在 Spring 的配置類上添加 @EnableTransactionManagement 注解即可。配置如下:
@EnableTransactionManagement//開啟spring注解事務(wù)的?持public class SpringConfiguration {}總結(jié)
以上是生活随笔為你收集整理的spring aop实例讲解_Spring框架核心知识点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天喝4000毫升水能减肥吗
- 下一篇: 喝咖啡可以减肥吗