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