Spring中基於AspectJ的AOP切面程式設計介紹及實現
阿新 • • 發佈:2018-12-06
簡介:
- AOP Aspect Oriented Programing 面向切面程式設計
- AOP採取==橫向抽取==機制,取代了傳統==縱向繼承==體系重複性程式碼(效能監視、事務管理、安全檢查、快取)
- Spring中的Aop是純Java來實現的,使用==動態代理==的方式增強程式碼
- AOP不是由Spring提出來的,是由AOP聯盟定義的
專業術語:
- Joinpoint(連線點) :委託類中可以被增強的方法
- ==Pointcut(切入點) :切點 ,要被增強的方法==
- ==Advice(通知/增強) :增強的程式碼==
- Target(目標物件) :委託物件
- Weaving(織入) :把增強應用切點的過程
- Proxy(代理): 一個類被AOP織入增強後,就產生一個結果代理類
- ==Aspect(切面): 是切點和通知的結合==
Aspect的增強型別:
- @Before 前置通知
- @AfterReturning 後置通知
- @Around 環繞通知
- @AfterThrowing丟擲通知
- @After 最終final通知
實現:
1.引入pom依賴
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.10.RELEASE</version> </dependency>
2.配置自動代理和註解掃描器
<?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: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-4.0.xsd"> <!--配置註解掃描器--> <context:component-scan base-package="com.it.bigdata"/> <!--開啟aop自動代理--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
3.編寫dao(委託類)
package com.it.bigdata;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
public void addUser(User user) {
System.out.println("新增使用者.." + user);
}
public void deleteUser(Integer id) {
System.out.println("刪除使用者" + id);
}
public void findUser(Integer id) {
System.out.println("查詢使用者" + id);
}
public void updateUser(Integer id) {
System.out.println("修改使用者" + id);
}
}
4.編寫切面
package com.it.bigdata;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/**
* 切面 = 切點(切點表示式) + 通知(要增強的程式碼,方法)
*/
@Aspect
@Component
public class MyAspect {
/**
* 通知
*/
@Before("execution( * com.it.bigdata.UserDao.delete*(..))")
public void advice1() {
System.out.println("通知1");
}
}
5.呼叫dao的方法
userDao.deleteUser(12);