系列三十五、Spring AOP失效原因以及解决方式

一、Spring AOP失效原因

(1)内部调用不会触发AOP;

(2)方法是private修饰的,AOP会失效;               解决方法:改成public

(3)目标类没有配置为bean,AOP会失效;           解决方法:将目标类配置为bean

(4)切入点表达式配置不正确,AOP也会失效;     解决方法:正确配置切入点

二、Spring  AOP正常代理案例

2.1、pom


    
      cglib
      cglib
      3.1
    
    
      aopalliance
      aopalliance
      1.0
    
    
      org.aspectj
      aspectjweaver
      1.9.19
    
    
      org.springframework
      spring-aop
      5.2.5.RELEASE
    
    
      commons-logging
      commons-logging
      1.1.1
    
    
      com.alibaba
      druid
      1.2.16
    
    
      org.springframework
      spring-beans
      5.2.5.RELEASE
    
    
      org.springframework
      spring-context
      5.2.5.RELEASE
    
    
      org.springframework
      spring-core
      5.2.5.RELEASE
    
    
      org.springframework
      spring-expression
      5.2.5.RELEASE
    


    
      junit
      junit
      4.13.2
    
    
    
      org.projectlombok
      lombok
      1.18.22
    
    
      org.slf4j
      slf4j-api
      1.7.32
    
    
      ch.qos.logback
      logback-classic
      1.2.10
    

2.2、MySpringConfig

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 16:30
 * @Description: 演示Spring AOP(正常情况)
 * @EnableAspectJAutoProxy的作用:开启Spring对AOP的支持
 *      属性:boolean proxyTargetClass() default false;
 *          作用:是否启用CGLIB动态代理:
 *              true:启用
 *              false:不启用
 *          说明:如果不设置的话,Spring会自行选择,当被代理对象实现了接口将会使用JDK动态代理,否则使用CHLIB动态代理
 *      属性:boolean exposeProxy() default false;
 *          作用:是否暴露当前代理对象到本地线程
 *              true:暴露
 *              false:不暴露
 */
@Configuration
@ComponentScan(basePackages = "org.star")
@EnableAspectJAutoProxy
public class MySpringConfig {
    
}

2.3、Calculator

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 15:18
 * @Description: 计算器类
 */
public interface Calculator {
    /**
     * 加
     * @param num1
     * @param num2
     * @return
     */
    int add(Integer num1,Integer num2);

    /**
     * 减
     * @param num1
     * @param num2
     * @return
     */
    int subtract(Integer num1,Integer num2);

    /**
     * 乘
     * @param num1
     * @param num2
     * @return
     */
    int multiply(Integer num1,Integer num2);

    /**
     * 除
     * @param num1
     * @param num2
     * @return
     */
    int divide(Integer num1,Integer num2);

}

2.4、CalculatorImpl

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/29 15:20
 * @Description: 目标类
 */
@Component
@Slf4j
public class CalculatorImpl implements Calculator {

    @Override
    public int add(Integer num1, Integer num2) {
        log.info("执行目标方法add,参数:{},{}", num1, num2);

        return num1 + num2;
    }

    @Override
    public int subtract(Integer num1, Integer num2) {
        log.info("执行目标方法subtract,参数:{},{}", num1, num2);

        return num1 - num2;
    }

    @Override
    public int multiply(Integer num1, Integer num2) {
        log.info("执行目标方法multiply,参数:{},{}", num1, num2);

        return num1 * num2;
    }

    @Override
    public int divide(Integer num1, Integer num2) {
        log.info("执行目标方法divide,参数:{},{}", num1, num2);

        return num1 / num2;
    }
}

2.5、测试

@Slf4j
public class App {

    public static void main(String[] args) {
        m1();
    }

    /**
     * jdk动态代理案例一
     */
    private static void m1() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);
        Calculator calculator = context.getBean(Calculator.class);
        int result = calculator.add(3, 2);
        System.out.println(result);
    }

}

系列三十五、Spring AOP失效原因以及解决方式_第1张图片

三、Spring  AOP内部调用导致AOP失效&解决方案(一)

3.1、失效

失效代码基本同上,修改的地方为 CalculatorImpl#add()

@Override
public int add(Integer num1, Integer num2) {
    log.info("执行目标方法add,参数:{},{}", num1, num2);
    /**
     * 演示Spring AOP内部调用导致AOP失效
     *  int subtractResult = subtract(num1, num2);
     *  System.out.println("subtractResult = " + subtractResult);
     */
    int subtractResult = subtract(num1, num2);
    System.out.println("subtractResult = " + subtractResult);
    return num1 + num2;
}

3.1.1、测试

系列三十五、Spring AOP失效原因以及解决方式_第2张图片

3.2、解决 

解决也很简单,代码基本同上,修改内容如下

 系列三十五、Spring AOP失效原因以及解决方式_第3张图片

3.2.1、测试

系列三十五、Spring AOP失效原因以及解决方式_第4张图片

四、Spring  AOP内部调用导致AOP失效&解决方案(二) 

4.1、解决

代码基本同2.xxx、修改内容如下:

4.1.1、MySpringConfig

系列三十五、Spring AOP失效原因以及解决方式_第5张图片 

4.1.2、CalculatorImpl

系列三十五、Spring AOP失效原因以及解决方式_第6张图片

 4.1.3、测试

系列三十五、Spring AOP失效原因以及解决方式_第7张图片

你可能感兴趣的:(Spring全家桶面试系列,spring,java,后端)