文章目錄
- 一、搭建環境
- 二、實作原生API接口
- 三、配置xml檔案
- 四、測試
友情連結:
AOP是什麼?
使用原生API接口實作AOP
使用自定義類實作AOP
使用注解實作AOP
一、搭建環境
模拟
service
層,首先建立個
UserService
接口:
package com.wzq.service;
public interface UserService {
void add();
void delete();
void update();
void query();
}
UserService
接口的實作類:
package com.wzq.service;
public class UserServiceImpl implements UserService{
public void add() {
System.out.println("增加了一條資訊");
}
public void delete() {
System.out.println("删除了一條資訊");
}
public void update() {
System.out.println("更新了一條資訊");
}
public void query() {
System.out.println("查詢了一條資訊");
}
}
在
pom.xml
中注入
aspectjweaver
依賴:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
<scope>runtime</scope>
</dependency>
二、實作原生API接口
原生
API
接口有五個,如下表所示:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zZiBnRYp1csJzYshnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyEjNxEDOwQTMyAjMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
這裡實作一下前兩個
建立
BeforeLog
類,實作
MethodBeforeAdvice
接口,需要寫
before
方法,參數說明都在注釋裡:
package com.wzq.log;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class BeforeLog implements MethodBeforeAdvice {
/*
* method:要執行的目标對象的方法
* args:參數
* target:目标對象
* */
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("執行了" + target.getClass().getName() + ",中的" + method.getName() + "方法");
}
}
建立
AfterLog
類,實作
AfterReturningAdvice
接口,寫
afterReturning
方法:
package com.wzq.log;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class AfterLog implements AfterReturningAdvice {
/*
* returnValue:傳回值
* method:要執行的目标對象的方法
* args:參數
* target:目标對象
* */
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("執行了" + target.getClass().getName() +
"中的" + method.getName() + "方法,傳回參數是:" + returnValue);
}
}
三、配置xml檔案
在
.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
首先需要注冊
bean
:
<!-- 注冊bean -->
<bean id="userService" class="com.wzq.service.UserServiceImpl"/>
<bean id="afterLog" class="com.wzq.log.AfterLog"/>
<bean id="beforeLog" class="com.wzq.log.BeforeLog"/>
然後是配置
aop
:
<!-- 方式一:使用原生Spring API接口 -->
<!-- 配置aop:需要導入aop限制 -->
<aop:config>
<!-- 切入點 -->
<aop:pointcut id="pointcut" expression="execution(* com.wzq.service.UserServiceImpl.*(..))"/>
<!-- 執行環繞增加 -->
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut" />
<aop:advisor advice-ref="beforeLog" pointcut-ref="pointcut" />
</aop:config>
注意在
aop:pointcut
标簽裡面有一個
expression
表達式,它的作用就是切入點入口
expression="execution(修飾符 傳回值 包名.類名/接口名.方法名(參數清單))"
在上面的例子中,忽略掉了修飾符,
*
表示所有,比如
com.wzq.service.UserServiceImpl.*(..))
,它的意思是:
com.wzq.service.UserServiceImpl
類下所有的方法和所有的參數
四、測試
編寫測試類:
import com.wzq.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void Test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = (UserService) context.getBean("userService");
service.add();
}
}