SSM框架學習之Spring的AOP學習以及資料整理

killerhz發表於2020-10-12

什麼是AOP?

  • 概念
    AOP:Aspect Oriented Programing即面向切面程式設計
    簡單來說:它就是把我們程式中重複性的程式碼抽取出來,在需要執行的時候,使用動態代理技術,在不修改原始碼的情況下,對我們的方法進行增強。

AOP的作用和優勢

  • 作用
    在程式執行期間,不修改原始碼對方法進行增強
  • 優勢
    減少重複程式碼
    提高開發效率
    方便維護

在這裡插入圖片描述
此處存在的問題:
事務被自動控制了,我們使用了connection物件的setAutoCommit(true)
此方式控制事務,只能控制一條,如果業務方法一次性要執行多條sql語句,這種方法就無法實現功能了。如下圖:

在這裡插入圖片描述
當我們執行時,由於執行有異常,轉賬失敗。但是因為我們是每次執行持久層方法都是獨立事務,導致無法實現事務控制(不符合事務的一致性)。

解決辦法:
讓業務層來控制事務的提交和回滾。

在這裡插入圖片描述

事務控制

開始事務:beginTransaction( )
提交事務:commit( )
回滾事務:rollback( )
釋放連線:release( )

通知

前置通知、後置通知、異常通知、最終通知、環繞通知
在這裡插入圖片描述

動態代理

  • 特點:
    位元組碼隨用隨建立,隨用隨載入。
    它與靜態代理的區別,靜態代理是位元組碼一上來就建立好了,並完成載入。
    裝飾者模式就是靜態代理的一種方式。
  • 動態代理常用的兩種方式:
    1、基於介面的動態代理
    提供者:JDK 官方的 Proxy 類。
    要求:被代理類最少實現一個介面。
    2、基於子類的動態代理
    提供者:第三方的 CGLib,如果報 asmxxxx 異常,需要匯入 asm.jar。
    要求:被代理類不能用 final 修飾的類(最終類)。

spring中基於xml的aop配置

1、把通知Bean也交給spring來處理
2、使用aop:config標籤表明開始aop的配置
3、使用aop:aspect標籤表明配置切面
	id屬性:是給切面提供一個唯一標識
	ref屬性:是指定通知類bean的id
4、在aop:aspect標籤的內部使用對應的標籤配置通知的型別
	aop:before:表示配置前置通知
		method:用於指定Logger類中哪個方法是前置通知
		pointcut:用於指定切入點表示式,該表示式的含義是對業務層中哪些方法進行增強
		完整的寫法:execution(void com.gk.service.impl.AccountServiceImpl.saveAccount())
		縮寫部分:execution(* com.gk.service.impl.*.*())
		全通配寫法:
			* *..*.*(..)
		
		實際開發中切入點表示式的通常寫法:
			* com.gk.service.impl.*.*(..)
5、aop:point-ref  id用於指定切入點表示式的唯一標識,expression屬性用於指定表示式內容
		aop:pointcut expression="* com.gk.service.impl.*.*(..))" id="pt1"/>
		也可以寫在aop:aspect外面(必須是在aop:aspect標籤之前),即所有切面可用。
6、aop:around   用於配置環繞通知
		method:指定通知中方法的名稱。
		pointct:定義切入點表示式
		pointcut-ref:指定切入點表示式的引用	
	spring 框架為我們提供了一個介面:ProceedingJoinPoint,它可以作為環繞通知的方法引數。
	其中有一個proceed()方法明確呼叫業務層方法(切入點方法)

在這裡插入圖片描述

基於註解的AOP配置

約束aop和context

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd">

在配置檔案中指定spring要掃描的包:
< !-- 告知 spring,在建立容器時要掃描的包 --> < context:component-scan base-package=“com.itheima”>< /context:component-scan >

在通知類上使用@ Aspect註解宣告為切面
在這裡插入圖片描述
以及一個@Around註解

@PointCut註解一定要注意下面通知呼叫的時候要使用pt1()加上括號,不然呼叫不成功;
在這裡插入圖片描述

完全不使用xml配置

@Configuration
@ComponentScan(basePackages="com.gk")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}

相關文章