Aop是面向切面编程,在项目中有时我们希望通过打印日志来查错,Aop可以帮助我们实现。
创建springboot工程之后需要添加aop的相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
1.编写service类
package org.javaboy.aop.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public String getUsernameById(Integer id) {
System.out.println("getUsernameById");
return "javaboy";
}
public void deleteUserById(Integer id) {
System.out.println("deleteUserById");
}
}
这是一个service类,类中提供了两个方法。
2.controller类
package org.javaboy.aop;
import org.javaboy.aop.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/test1")
public String getUsernameById(Integer id) {
return userService.getUsernameById(id);
}
@GetMapping("/test2")
public void deleteUserById(Integer id) {
userService.deleteUserById(id);
}
}
控制类中注入service类,在controller类中调用service类中的方法。
3.编写aop
package org.javaboy.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//表示spring组件
@Component
//表示是切面
@Aspect
public class LogComponent {
//定义拦截规则
@Pointcut("execution(* org.javaboy.aop.service.*.*(..))")
public void pc1() {
}
//前置通知
@Before(value = "pc1()")
public void before(JoinPoint jp) {
//拿到执行方法名
String name = jp.getSignature().getName();
System.out.println("before--" + name);
}
//后置通知
@After(value = "pc1()")
public void after(JoinPoint jp) {
String name = jp.getSignature().getName();
System.out.println("after--" + name);
}
//返回通知
@AfterReturning(value = "pc1()",returning = "result")
public void afterReturning(JoinPoint jp,Object result) {
String name = jp.getSignature().getName();
System.out.println("afterReturning>>>>" + name + "------" + result);
}
//异常通知
@AfterThrowing(value = "pc1()",throwing = "e")
public void afterThrowing(JoinPoint jp,Exception e) {
String name = jp.getSignature().getName();
System.out.println("afterThrowing--" + name + "------" + e.getMessage());
}
//环绕通知(包含四个)
@Around(value = "pc1()")
public Object arround(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed();
}
}
4.访问路径:http://localhost:8080/test1
控制台打印:
before--getUsernameById
getUsernameById
after--getUsernameById
afterReturning>>>>getUsernameById------javaboy