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 |