1、用途
做日志处理可以使用切面编程(其他的只要是需要在某个点进行处理的都是可以的,比如权限校验等)
2、实现代码
2.1、引入依赖
<!--aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.2、切面类代码
package com.example.myblog.test;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AOPTest {
//定义切入点
@Pointcut("execution(public * com.example.myblog.test.AOPTestClient.*(..))")
public void aspectTest(){}
//前置通知,切入点执行之前执行
@Before("aspectTest()")
public void doBefore(JoinPoint joinPoint){
System.out.println("前置通知");
}
//后置通知,切入点执行之后执行
@After("aspectTest()")
public void doAfter(JoinPoint joinPoint){
System.out.println("后置通知");
}
//最终通知,,切入点执行之后执行
@AfterReturning("aspectTest()")
public void doAfterReturning(JoinPoint joinPoint){
System.out.println("最终通知");
}
//异常通知,切入点抛出异常执行
@AfterThrowing("aspectTest()")
public void deAfterThrowing(JoinPoint joinPoint){
System.out.println("异常通知");
}
//环绕通知,切入点执行前、后执行
@Around("aspectTest()")
public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("未执行");
Object result = joinPoint.proceed();
System.out.println("已执行");
//返回结果
return result;
}
}
2.3、切点代码:
package com.example.myblog.test;
import org.springframework.stereotype.Component;
@Component
public class AOPTestClient {
public void test(){
System.out.println("正在测试AOP");
}
}
2.4、测试代码:
package com.example.myblog;
import com.example.myblog.test.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class MyblogApplicationTests {
@Autowired
private AOPTestClient aopTestClient;
@Test
public void testAOP(){
aopTestClient.test();
}
}
2.5、结果: