240
世界上有2种人,一种懂二进制,另一种不懂二进制。

关于AOP-Spring Boot整合AOP配置

AOP概念

面向切面编程(aspect-oriented programming,AOP)主要实现的目的是针对业务处理过程中的切面进行提取,诸如日志、事务管理和安全这样的系统服务,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

铺垫概念

  • Joinpoint(连接点):类里面可以被增强的方法即为连接点。例如,想修改那个方法的功能,那么该方法就是一个连接点
  • Pointcut(切入点):对 Joinpoint 进行拦截的定义即为切入点。例如,拦截所有以 insert 开始的方法,这个定义即为切入点
  • Advice(通知):拦截到 Joinpoint 之后所要做的事情就是通知。例如,之前说到的打印日志监控。通知分为前置通知、后置通知、异常通知、最终通知、环绕通知
  • Aspect(切面):Pointcut 和 Advice 的结合
  • Target(目标对象):要增强的类成为 Target

SpringBoot对AOP提供了自动化配置解决方案

1】 引入依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
2】实现业务service

 

3】创建切面
@Component
@Aspect
public class LogAspect {
    @Pointcut("execution(* com.sang.aop.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("pc1()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        return pjp.proceed();
    }
}
 
注意:

@Aspect  表明是一个切面类

@Pointcut(

"execution(* com.sang.aop.service.*.*(..))"

) 定义一个切入点 方法 pc1()

第一个 * 表示方法返回任意值,

第二个 * 表示 service 包下的任意类,

第三个 * 表示类中的任意方法,

括号中的两个点表示方法参数任意

@Before注解 ,表示这是一个前置通知,before() 方法在目标方法执行之前执行。通过 JoinPoint 参数可以获取目标方法的方法名、修饰符等信息

方法使用了 @After注解,表示这是一个后置通知,after() 方法在目标方法执行之后执行

@AfterReturning 注解,表示这是一个返回通知,afterReturning() 方法中可以获取目标方法的返回值。@AfterReturning 注解的 returning 参数是指返回值的变量名,对应方法的参数。注意,在方法参数中定义了 result 的类型为 Object ,表示目标方法的返回值可以使任意类型,若 result 参数的类型为 Long ,则该方法只能处理目标方法返回值为 Long 的情况

@AfterThrowing 注解,表示这是一个异常通知,即当目标方法发生异常时,afterThrowing() 方法会被调用,异常类型为 Exception 表示所有的异常都会进入该方法中执行,若异常类型为 ArithmeticException ,则表示只有目标方法抛出 ArithmeticException 异常时才会进入该方法处理

@Around 注解,表示这是一个环绕通知。环绕通知是所有通知里功能最为强大的通知,可以实现前置通知、后置通知、异常通知以及返回通知的功能。目标方法进入环绕通知后,通过调用 ProceedingJoinPoint 对象的 proceed 方法使目标方法继续执行,开发者可以在此修改目标方法的执行参数、返回值等,并且可以在此处理目标方法的异常

配置完成后,接下来在Controller 中创建接口,分别调用 Userservice 中的两个方法,即可看到 LogAspect 中的代码动态的嵌入目标方法中执行了,如下:

getUserById方法开始执行...
get...
getUserById方法返回值为:user
getUserById方法执行结束...
deleteUserById方法开始执行...
delete...
deleteUserById方法返回值为:null
deleteUserById方法执行结束...

AOP的应用

、读写分离

、事务配置

、日志打印

、Authentication 权限

、Caching 缓存

、Context passing 内容传递

、Error handling 错误处理

、Lazy loading 懒加载

、Debugging 调试

、logging, tracing, profiling and monitoring 记录跟踪优化校准

、Performance optimization 性能优化

、Persistence 持久化

、Resource pooling 资源池

、Synchronization 同步

、Transactions 事务。 

 

posted @ 2022-09-20 16:10  _Origin  阅读(284)  评论(0编辑  收藏  举报