AOP本质:在不改变原有业务逻辑的情况下,增强横切逻辑,横切逻辑代码往往是权限校验代码、日志代码、事务控制代码、性能监控代码。
动态代理:
1.1 Java动态代理
1.1.1 JDK动态代理 如果代理的类有接口,可以使用JDK动态代理:
1.1.2 CGLIB动态代理
CGLIB既可以代理无接口的类,也可以代理有接口的类
Spring AOP 底层就是动态代理。默认情况下,如果被代理的类有接口,就使用 JDK 动态代理; 如果被代理的类没有接口,就使用CGLIB动态代理。
AOP 底层源码实现:
public class Demo {
public static void main(String[] args) {
//这个是Spring中动态代理使用的对象
ProxyFactory proxyFactory = new ProxyFactory();
//设置被代理的对象
proxyFactory.setTarget(new ICalculatorImpl());
//这个属性设置为true,就统一使用CGLIB动态代理,为flase就会根据是否有接口自动选择
proxyFactory.setProxyTargetClass(true);
//代理对象要实现的接口
proxyFactory.addInterface(ICalculator.class);
//通知/增强,这个其实就是要在被代理的对象的方法上额外添加的方法
proxyFactory.addAdvice(new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
//获取被代理的方法
Method method = invocation.getMethod();
long startTime = System.currentTimeMillis();
//这个就类似于前面的method.invoke()
Object proceed = invocation.proceed();
long endTime = System.currentTimeMillis();
System.out.println("endTime-startTime = " + (endTime - startTime));
return proceed;
}
});
ICalculator calculator = (ICalculator) proxyFactory.getProxy();
calculator.add(3,4);
}
}