• AOP基础概念
  1. AOP为Aspect Oriented Programming的缩写,为面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
  2. 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率。
  3. 纵向抽取,横向重复

spring aop 没生效 spring aop 使用_连接点

使用AOP的好处:

对程序进行增强,在不修改源码的情况下AOP可以进行权限校验、日志记录、性能监控、事务控制。由于AOP的本质是动态代理,Spring可以帮助自动生成动态代理。

使用AOP能干什么?

  1. Spring声明式事务管理配置
  2. Controller层的参数校验
  3. 在执行方法前,判断是否具有权限
  4. 对部分函数的调用进行日志记录。监控部分重要函数,若抛出指定的异常,可以以短信或邮件方式通知相关人员。
  5. 信息过滤,页面转发等功能。
  • AOP的相关术语
  1. 连接点(Joinpoint):目标对象中所有都可以增强的方法(添加正交逻辑的方法),叫做连接点(就是那些被拦截的点,在Spring中指的就是方法,因为Spring只支持方法类型的连接点)。
  2. 切入点(Pointcut):目标对象中已经增强的方法(添加了正交逻辑的方法),叫做切入点。

连接点不一定是切入点,但是切入点一定是连接点。

  1. 通知/增强(Advice):

需要给目标对象添加的额外逻辑叫做通知(增强)。

通知分为:

  1. 前置通知:目标方法运行前调用。
  2. 后置通知:目标方法运行后调用。
  3. 异常通知:目标方法出现异常后调用。
  4. 最终通知:目标方法运行无论是否出现异常,都必须调用,通常在finally代码中调用的方法。
  5. 环绕通知:目标方法运行前后都要调用。
  6. 目标对象:就是被代理的对象
  7. 织入(Weaving):将通知应用到连接点的过程。
  8. 代理对象:将通知织入到连接点后形成代理对象。
  9. 切面(Aspect):切入点和通知的结合,方面,横切面的功能, 抽象出类,或接口, AOP编程重要的就是识别出横切面功能。对横切性关注点的模块化,封装成类。

总之:Spring AOP要做的事情就是:

  1. 增强的代码是什么
  2. 给哪些连接点添加增强代码
  3. 什么时候增强

Spring支持4种AOP实现方式:基于代理的SpringAOP、纯POJO切面、@AspectJ注解 驱动的切面、注入式AspectJ切面

  • 基于代理的Spring AOP实现

项目中日志模块的AOP方式实现:需要业务组件和日志组件,其中业务组件实现指定接口的业务组件类,而日志组件则以AOP的方式,将日志组件在运行时动态织入。

SpringAOP中常见的Advice接口:

  1. 前置通知(MethodBeforeAdvice)
public class LogAdvice implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("<     -------------");
        System.out.println("[日志输出]:-------前置输出");
        System.out.println("[方法名称]"+method.getName());
        System.out.println("[方法参数]"+Arrays.toString(args));
System.out.println("[目标对象]"+target);
}
}

三个参数意义如下:

参数1:method 目标方法

参数2:args 目标方法的参数值

参数3:target 目标对象

  1. 后置通知(AfterReturningAdvice)
public class LogAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("[日志输出]:-------后置输出");
        System.out.println("[返回结果]"+returnValue);
        System.out.println("------------------->");
}
}

四个参数意义如下:

参数1:returnValue 目标方法返回值

参数2:method 目标方法

参数3:args 目标方法返回值

参数4:target 目标对象

  1. 环绕通知(MethodInterceptor)
public class PerformAdvice implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
        long beginTime=System.currentTimeMillis();
        Object returnVal=invocation.proceed();
        long endTime=System.currentTimeMillis();
        System.out.println("[性能检测]-------环绕通知------");
        System.out.println("[性能检测]"+invocation.getMethod().getName()+"共耗时"+(endTime-beginTime)+"毫秒");
        return returnVal;
}
}

两个参数意义如下:

参数1:invocation 目标方法调用对象

参数2:Object类型的返回值 目标方法的返回值

  1. 异常通知(ThrowsAdvice)

ThrowsAdvice接口是一个其标志作用的空接口,所要实现的方法需按照方法签名自行定义或重载。

public class LogAdvice implements ThrowsAdvice {
public void afterThrowing(ArithmeticException exception) {
              System.out.println("出现算术逻辑异常");
       }
      
       public void afterThrowing(Exception exception) {
              System.out.println("啊出现异常了,发送异常报告给管理员");
}
}

参数意义如下:

参数:所要捕获的异常的类型

基于代理的Spring AOP:

调用者-------àtarget:被通知的Bean --------------代理ProxyFactoryBean

        --------àinterceptorNames: advice通知列表-----代理ProxyFactoryBean

配置代理工厂:ProxyFactoryBean

配置自动代理工厂:BeanNameAutoProxyCreator

切面:Advisor

Advisor=Pointcut(切点)+Advice(通知)

Advisor 是一种特殊的切面,由Pointcut (切点)和 Advice(通知)组成