日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring aop实例讲解_Spring框架核心知识点

發布時間:2023/12/4 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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功能。基于Bean工廠,我們還會發現多種Spring應用上下文的實現,所有的Spring模塊都構建于核心容器之上

  • TEST模塊

為了使開發者能夠很方便進行測試,Spring提供了測試模塊來進行Spring應用的測試。

如下圖所示:

二、Spring核心

IOC和AOP是Spring的核心

1、IOC

1.1、IOC的定義

IOC,控制反轉,它是一個技術思想,核心就是將new對象的操作交由IOC容器去幫助我們完成,包括創建實例化對象并管理它,我們需要使用哪個對象,去IOC容器獲取即可。控制指的是對象創建(實例化、管理)的權力,反轉指的是控制權交給了外部環境(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>

  • 使用實例化方法創建
<bean id="beanFactory" class="com.lagou.factory.instancemethod.BeanFactory"></bean> <bean id="transferService" factory-bean="beanFactory" factorymethod="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包:
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.1.12.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>
  • AOP核心配置:
<!--把通知bean交給spring來管理--> <bean id="logUtil" class="com.lagou.utils.LogUtil"></bean> <!--開始aop的配置--> <aop:config> <!--配置切?--><aop:aspect id="logAdvice" ref="logUtil"><!--配置前置通知--><aop:before method="printLog" pointcut="execution(public * com.lagou.service.impl.TransferServiceImpl.updateAccountByCardNo(com.lagou .pojo.Account))"></aop:before></aop:aspect> </aop:config>
  • 切入點表達式pointcut的表達式規則:
    訪問修飾符 返回值 包名.包名.包名.類名.方法名(參數列表)
    其中訪問修飾符可以省略
    返回值可以使用*表示任意返回值
    包名可以使用.表示任意包,但是有幾級包就對應幾個. , 因此可以使用..來表示當前包及其子包
    類和方法名都可以使用.表示任意類、任意方法
    參數列表,基本類型直接寫類型名稱,如int,引用類型必須寫全限定類名,如java.lang.String

? 參數列表可以使用..表示有無參數均可

? 全通配方式:* *..*.*(..)

  • 修改代理方式配置:
    • 方式一:使?aop:config標簽配置
<aop:config proxy-target-class="true"> - 方式二:使?aop:aspectj-autoproxy標簽配置 <!--此標簽是基于XML和注解組合配置AOP時的必備標簽,表示Spring開啟注解配置AOP的?持--><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectjautoproy>
  • 五種通知類型:
    • 前置通知:aop:before標簽:
<!--作?:?于配置前置通知。出現位置:它只能出現在aop:aspect標簽內部屬性:method:?于指定前置通知的?法名稱pointcut:?于指定切?點表達式pointcut-ref:?于指定切?點表達式的引?--><aop:before method="printLog" pointcut-ref="pointcut1"></aop:before> - 正常執行的通知:after-returning標簽 <!--作?:?于配置正常執?時通知出現位置:它只能出現在aop:aspect標簽內部屬性:method:?于指定后置通知的?法名稱pointcut:?于指定切?點表達式pointcut-ref:?于指定切?點表達式的引?--><aop:after-returning method="afterReturningPrintLog" pointcutref="pt1"></aop:after-returning> - 異常通知:after-throwing標簽 <!--作?:?于配置異常通知。出現位置:它只能出現在aop:aspect標簽內部屬性:method:?于指定異常通知的?法名稱pointcut:?于指定切?點表達式pointcut-ref:?于指定切?點表達式的引?--><aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing> - 最終通知:after標簽 <!--作?:?于指定最終通知。出現位置:它只能出現在aop:aspect標簽內部屬性:method:?于指定最終通知的?法名稱pointcut:?于指定切?點表達式pointcut-ref:?于指定切?點表達式的引?--><aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after> 無論切入點方法是否產生異常,都會在返回之前執行- 環繞通知:around標簽 <!--作?:?于配置環繞通知。出現位置:它只能出現在aop:aspect標簽的內部屬性:method:?于指定環繞通知的?法名稱pointcut:?于指定切?點表達式pointcut-ref:?于指定切?點表達式的引?--><aop:around method="aroundPrintLog" pointcut-ref="pt1"></aop:around> 環繞通知有別于其他通知,一般不與其他通知一起配置使用,它是Spring框架為我們提供的一種可以通過編碼方式,控制增強代碼何時執行的通知類型。

XML+注解模式

  • XML中開啟Spring對注解AOP的支持
<!--開啟spring對注解aop的?持--><aop:aspectj-autoproxy/>

#### 注解模式

配置類加入如下注解:

@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包:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.12.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.12.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.12.RELEASE</version></dependency>
  • XML配置
<tx:advice id="txAdvice" transaction-manager="transactionManager"><!--定制事務細節,傳播?為、隔離級別等--><tx:attributes><!--?般性配置--><tx:method name="*" read-only="false"propagation="REQUIRED" isolation="DEFAULT" timeout="-1"/><!--針對查詢的覆蓋性配置--><tx:method name="query*" read-only="true"propagation="SUPPORTS"/></tx:attributes></tx:advice><aop:config><!--advice-ref指向增強=橫切邏輯+?位--><aop:advisor advice-ref="txAdvice" pointcut="execution(*com.lagou.edu.service.impl.TransferServiceImpl.*(..))"/></aop:config>

2.2 XML+注解

  • XML配置
<!--配置事務管理器--><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--開啟spring對注解事務的?持--><tx:annotation-driven transaction-manager="transactionManager"/>
  • 在接?、類或者?法上添加@Transactional注解
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)

2.3 純注解

Spring基于注解驅動開發的事務控制配置,只需要把 xml 配置部分改為注解實現。只是需要?個 注解替換掉xml配置?件中的 配置。 在 Spring 的配置類上添加 @EnableTransactionManagement 注解即可。配置如下:

@EnableTransactionManagement//開啟spring注解事務的?持public class SpringConfiguration {}

總結

以上是生活随笔為你收集整理的spring aop实例讲解_Spring框架核心知识点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 婷婷综合av | 国产毛片久久久久久国产毛片 | 国产精品久久久久久久久久久久久 | 日批免费网站 | 自拍偷拍激情小说 | 欧美,日韩,国产精品免费观看 | 四川话毛片少妇免费看 | 欧美老女人性视频 | 永久久久久久久 | 97成人在线| 亚洲欧美一区二区在线观看 | 91在线看视频 | 亚洲精品在线不卡 | 放几个免费的毛片出来看 | 91视频最新地址 | 男人的天堂网在线 | 7x7x7x人成影视 | 日韩电影在线一区二区 | 性渴老太作爱 | 久久亚洲精少妇毛片午夜无码 | 国内精品人妻无码久久久影院蜜桃 | 黄频在线免费观看 | 久久99激情| 日韩午夜小视频 | 日韩中文字幕视频在线观看 | 欧美精品一区二区久久婷婷 | 欧美人与性动交ccoo | 波多野结衣50连登视频 | 国产欧美一区二区三区视频 | av av片在线看| 91porny在线| 97色综合 | 成人日韩视频 | 成人亚洲天堂 | 国产激情一区二区三区在线观看 | 波岛野结衣 | 国产三级免费观看 | 精品肉丝脚一区二区三区 | 男生捅女生肌肌 | 最近最新最好看的2019 | 午夜国产一区二区 | 亚洲精品网站在线观看 | 久久看视频 | 无码人妻久久一区二区三区蜜桃 | 意大利性荡欲xxxxxx | 以女性视角写的高h爽文 | 欧美一区日韩一区 | 中文字幕av高清 | 亚洲三级欧美 | 婷婷爱爱 | 午夜影片 | 日韩美一区二区三区 | 欧美性猛交bbbbb精品 | 亚洲精品国产美女 | 国产aⅴ无码片毛片一级一区2 | 激情综合五月 | 色婷婷六月天 | 性视频免费 | 日本三级吃奶头添泬无码苍井空 | 精品一二三 | 国产一区h | 国产黄色免费视频 | 久久91 | 又粗又猛又爽又黄的视频 | 黄色在线视频播放 | 亚洲自拍在线观看 | 精品视频免费在线观看 | 天天干天天爽天天操 | 蜜桃导航-精品导航 | 久久伊人av | 日韩欧美视频在线 | 国产中出 | 亚洲啪啪网站 | 久草成人 | 欧美日韩一级二级三级 | 日韩福利视频导航 | 欧美日韩久久久久久 | 99久久婷婷国产综合精品青牛牛 | a天堂在线观看视频 | 国产精品中文 | 国产精品另类 | 中文在线日韩 | 亚洲AV无码乱码国产精品牛牛 | 欧美一区二区成人 | 粗大的内捧猛烈进出在线视频 | 999xxxx| 中文字幕线人 | 亚洲欧美色图片 | 女人十八岁毛片 | 91看片成人 | 亚洲精品成人无码毛片 | 国产一区网 | 奇米影视9999 | 精品久久在线 | 欧美一区不卡 | 国产亚洲激情 | 成人精品福利 | 国产免费视频一区二区三区 | 国产成人精品久久久 |