9动态代理和AOP

56 阅读1分钟

AOP本质:在不改变原有业务逻辑的情况下,增强横切逻辑,横切逻辑代码往往是权限校验代码、日志代码、事务控制代码、性能监控代码。

动态代理:

1.1 Java动态代理

1.1.1 JDK动态代理 如果代理的类有接口,可以使用JDK动态代理:

1.1.2 CGLIB动态代理

CGLIB既可以代理无接口的类,也可以代理有接口的类

Spring AOP 底层就是动态代理。默认情况下,如果被代理的类有接口,就使用 JDK 动态代理; 如果被代理的类没有接口,就使用CGLIB动态代理。

image.png

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);
    }
}