# AOP實現方式一:string方法【主要Spring Api接口實現】 ###### tags: `Spring-AOP` ## 使用Spring實現AOP **【重點】使用AOP織入,需要導入一個依賴包** ```xml= <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> <scope>runtime</scope> </dependency> ``` ### 方式一:使用Spring的API接口 1.在pom.xml導入依賴包 ```xml= <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>spring-09-aop</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.21</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.21</version> <scope>test</scope> </dependency> </dependencies> </project> ``` 2.創建接口 ```java= public interface UserService { public void add(); public void delete(); public void update(); public void select(); } ``` 3.實現類 ```java= package com.kuang.service; public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加一個用戶"); } @Override public void delete() { System.out.println("刪除一個用戶"); } @Override public void update() { System.out.println("更新一個用戶"); } @Override public void select() { System.out.println("查詢一個用戶"); } } ``` 4.AOP功能想要放入的日誌 implements MethodBeforeAdvice:放在方法前 ```java= package com.kuang.log; import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class Log implements MethodBeforeAdvice { @Override //method:要執行的目標對象的方法 //objects:參數 //target:目標對象 public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(target.getClass().getName() + "的" + method.getName() + "被執行了"); } } ``` implements AfterReturningAdvice 放在方法後 ```java= public class AfterLog implements AfterReturningAdvice { @Override //returnValue:返回值 public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("執行了" + method.getName() + "方法,返回結果為:" + returnValue); } } ``` 5.在applicationContext.xml配置aop約束 ```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--> <bean id="userService" class="com.kuang.service.UserServiceImpl"/> <bean id="log" class="com.kuang.log.Log"/> <bean id="afterlog" class="com.kuang.log.AfterLog"/> <!--方式一:使用原先Spring API接口--> <!--配置aop:需要導入aop的約束--> <aop:config> <!--切入點:expression:表達式,execution(要執行的位置! * * * * *) 修飾符 返回值 類名 方法名 參數--> <!--UserServiceImpl.*(..):表示這個類的所有方法(*)中的任意參數(..)--> <aop:pointcut id="pointcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/> <!--執行環繞增加--> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> <aop:advisor advice-ref="afterlog" pointcut-ref="pointcut"/> </aop:config> </beans> ``` 6.測試方法 ```java= public class MyTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //注意點:動態代理代理的是接口 UserService userService = (UserService) context.getBean("userService"); userService.add(); } } ``` 7.結果 可以看到before()方法切入的句子在原來的方法執行前先被執行,AfterLog()則在後方 我們並沒有在原先的add()方法寫入這兩個句子,表示我們成功用aop切入,讓被切到的類在執行方法時,都能執行aop中的方法 ![](https://i.imgur.com/5NvUFhG.png)