Spring之註解實現aop(面向切面程式設計)
1:Aop(aspect object programming)面向切面程式設計,名詞解釋:
1.1:功能:讓關注點程式碼與業務邏輯程式碼分離
1.2:關注點
重複程式碼就叫做關注點
1.3:切面
關注點形成的類,就叫做切面(類)
面向切面程式設計,就是指對很多功能都有的重複程式碼抽取,再在執行的時候往業務方法上動態植入"切面類程式碼";
1.4:切入點
執行目標物件方法,動態植入切面程式碼
可以通過切入點表示式,指定攔截那些類的那些方法,給指定的類在執行的時候植入切面類程式碼;
2:註解方式實現aop程式設計
2.1:開發步驟
(1):先引入aop相關的jar檔案
spring-aop-3.2.5.RELEASE.jar【去spring3.2原始碼裡面找】
aopalliance.jar【去spring2.5原始碼/lib/aopalliance檔案裡面找】
aspectjweaver.jar【去spring2.5原始碼/lib/aspectj檔案裡面找】或者【aspectj-1.8.2/lib/aspectjweaver.jar】
aspectjrt.jar【去spring2.5原始碼/lib/aspectj檔案裡面找】或者【aspectj-1.8.2/lib/aspectjrt.jar】
《注意:用到的spring2.5版本的jar本艦,如果用jd1.7版本可能會出現問題,
需要升級以下aspectj元件,即使用aspectj-1.8.2版本中提供的jar檔案aspectjweaver.jar和aspectjrt.jar》
(2)bean.xml中引入aop名稱空間
技巧:找到檔案spring-framework-3.2.5.RELEASE/docs/spring-framework-reference/htmlsingle
開啟index.html搜尋xmlns:aop然後找到下面紅色三句話,分別拷貝到bean.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
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">
拷貝之後的bean.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
(3):bean.xml中開啟aop註解掃描,如下配置所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 開啟註解掃描 -->
<context:component-scan base-package="com.bie.aop"></context:component-scan>
<!-- 開啟aop註解方式,預設為false -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
(4):開始寫一個切面類,原始碼如下所示:
package com.bie.aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author BieHongLi
* @version 建立時間:2017年3月28日 下午9:10:43
* @Aspect:指定當前類為切面類
*/
@Component //加入到IoC容器
@Aspect //指定當前類為切面類
public class Aop {
//指定切入點表示式,攔截那些方法,即為那些類生成代理物件
//@Pointcut("execution(* com.bie.aop.UserDao.save(..))") ..代表所有引數
//@Pointcut("execution(* com.bie.aop.UserDao.*())") 指定所有的方法 //@Pointcut("execution(* com.bie.aop.UserDao.save())") 指定save方法
@Pointcut("execution(* com.bie.aop.UserDao.*(..))")
public void pointCut(){
}
@Before("pointCut()")
public void begin(){
System.out.println("開啟事務");
}
@After("pointCut()")
public void close(){
System.out.println("關閉事務");
}
}