(1)内部调用不会触发AOP;
(2)方法是private修饰的,AOP会失效; 解决方法:改成public
(3)目标类没有配置为bean,AOP会失效; 解决方法:将目标类配置为bean
(4)切入点表达式配置不正确,AOP也会失效; 解决方法:正确配置切入点
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
/**
* @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 {
}
/**
* @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);
}
/**
* @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;
}
}
@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);
}
}
失效代码基本同上,修改的地方为 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; }
解决也很简单,代码基本同上,修改内容如下
代码基本同2.xxx、修改内容如下: