標籤:

Spring(3):AOP

AOP概念

aop:面向切面編程,拓展功能不通過改動源代碼實現

aop採取橫向抽取機制,取代了傳統縱向繼承體系重複性代碼

縱向抽取機制解決:

要想添加新的功能,可以新建一個類,在類中定義方法實現新功能,再繼承這個類,

調用父類的方法即可。缺點:沒有根本的解決問題,比如父類的方法名變化時,子類中也要去

修改。

原理:

要求了解即可,不要求掌握代碼

AOP基本術語

Spring的AOP操作

1.在Spring中進行aop操作,使用Aspectj實現

Aspectj是一個基於Java語言的AOP框架

Aspectj不是Spring的一部分,而是和Spring一起使用進行aop操作

Spring2.0以後新增了對AspectJ支持

2.使用aspectj實現aop有兩種方式

(1)基於aspectj的xml配置

(2)基於aspectj的註解方式

AOP操作準備

1.除了導入基本的jar包,還需要導入相關jar包

2.創建Spring 核心配置文件,導入aop約束

AOP具體操作(通過配置文件實現)

使用表達式配置切入點

1 切入點:實際增強的方法

2 常用的表達式

execution(<訪問修飾符>?<返回類型><方法名>(<參數>)<異常>)

(1)executioon(* cn.itcast.aop.Book.add(..))

*表示一切訪問修飾符 ..表示參數

(2)executioon(* cn.itcast.aop.book.*(..))

表示對Book類中的一切方法增強

(3)execution(* *.*(..))

表示對所有類進行增強

(4)匹配所有sava開頭的方法execution(* save*(..))

具體的代碼:

創建對象:

public class Book { public void add(){ System.out.println("add...."); }}public class MyBook { public void add1(){ System.out.println("前置增強"); }}//測試類 @Test public void testj(){ ApplicationContext context=new ClassPathXmlApplicationContext("bean3.xml"); Book book1=(Book) context.getBean("book"); book1.add(); }

配置xml文件

<!--1.配置對象 --> <bean id="book" class="cn.itcast.aop.Book"></bean> <bean id="mybook" class="cn.itcast.aop.MyBook"></bean> <!--2.配置aop操作 --> <aop:config> <!--2.1配置切入點 --> <aop:pointcut expression="execution(* cn.itcast.aop.Book.add(..))" id="pointcut1"/> <!-- 2.2配置切面,把增強用到方法上面 --> <aop:aspect ref="mybook"> <!--配置增強類型 method:增強類中哪個方法作為增強 --> <aop:before method="add1" pointcut-ref="pointcut1"/> </aop:aspect> </aop:config>

最終輸出結果:

環繞增強代碼書寫格式:

實現不改動源代碼的情況下增加了功能。

基於aspectj的註解aop操作

第一步 創建對象(使用配置文件,也可以用註解,方法同ioc操作)

<!--1.配置對象 -->

<bean id="book" class="cn.itcast.aop.Book"></bean>

<bean id="mybook" class="cn.itcast.aop.MyBook"></bean>

第二步 在Spring核心配置文件中,開啟aop操作

<!-- 開啟aop註解操作--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

第三步 在增強類上面使用註解完成aop操作

在方法上面使用註解完成增強配置


推薦閱讀:

【spring指南系列】使用Redis進行消息傳遞
Spring Boot中使用Flyway來管理資料庫版本
構建用戶管理微服務
springboot(十七):使用Spring Boot上傳文件

TAG:Spring |