- AOP简介
面向切面编程(Aspect-Oriented Programming, AOP)在系统运行时动态添加代码的方法称为面向切面编程(AOP)。Spring框架对AOP提供了很好地支持,在AOP中有一些常见的概念:
(1)Joinpoint(连接点):类里面可以被增强的方法即为连接点,比如说,想修改哪个方法的功能,那么该方法就是一个连接点
(2)Pointcut(切入点): 对Joinpoint进行拦截的定义即为切入点,例如:拦截所有已insert开始的方法,这个定义即为切入点
(3)Advice(通知):拦截到Joinpoint 之后所要做的事情就是通知。例如:打印日志监控。通知分为前置通知、后置通知、异常通知、最终通知和环绕通知
(4)Aspect(切面) Pointcut和Advice的结合
(5)Target(目标对象) 要增强的类成为Target - Springboot配置AOP
(1)在springboot web项目中导入spring-boot-starter-aop依赖
<!--引入AOP依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
(2)创建UserService类 作为测试功能
@Service
public class UserService {
public String getUserById(Integer id){
System.out.println("get...");
return "user";
}
public void DelUserById(Integer id){
System.out.println("delete...");
}
}
(3)创建切面
@Component
@Aspect //这是一个切面类
public class LogAspect {
//切入点定义
// 第一个* 任意返回值
// 第二个* 任意类
// 第三个* 任意方法
// 括号两个点 表示任意参数
@Pointcut("execution(* com.example.springbootstudy.service.*.*(..))")
public void pc1(){
}
@Before(value = "pc1()")
public void before(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"方法开始执行了");
}
@After(value = "pc1()")
public void after(JoinPoint jp){
String name=jp.getSignature().getName();
System.out.println(name+"方法结束执行了");
}
@AfterReturning(value = "pc1()",returning = "result")
public void AfterReturning(JoinPoint jp,Object result){
String name=jp.getSignature().getName();
System.out.println(name+"方法返回值为:"+result);
}
@AfterThrowing(value = "pc1()",throwing = "e")
public void AfterThrowing(JoinPoint jp,Exception e){
String name=jp.getSignature().getName();
System.out.println(name+"方法抛异常了,异常时:"+e.getMessage());
}
@Around(value = "pc1()")
public Object Around(ProceedingJoinPoint jp) throws Throwable {
return jp.proceed();
}
}
(4)Controller调用UserService中的方法,查看结果
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping("/getUserById")
public String getUserById(Integer id){
return userService.getUserById(id);
}
@RequestMapping("/deleteById")
public void delete(Integer id){
userService.DelUserById(id);
}
}