Spring AOP动态代理源码浅析

Spring中两个要点,aop和ioc,咱们都知道aop是面向切面编程,经常使用于日志管理之类的,原理呢?编程

Spring的核心原理是经过动态代理模式在方法执行先后或出现异常时加入相关的逻辑。测试

1.AOP是基于动态代理模式。spa

2.AOP是方法级别的(要测试的方法不能为static修饰,由于接口中不能存在静态方法,编译就会报错)。3d

3.AOP能够分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码造成的类。代理

动态代理:日志

动态代理分为JDK代理和Cglib代理,看一下Spring的DefaultAopProxyFactory源码:cdn


从上述源码片断能够看出,是否使用cglib是在代码中进行判断的,判断条件首先是config.isOptimize()、config.isProxyTargetClass()和hasNoUserSuppliedProxyInterfaces(config)。其中config.isOptimize()与config.isProxyTargetClass()默认返回都是false,这种状况下判断结果就由hasNoUserSuppliedProxyInterfaces(config)的结果决定:



因此简单的说“ hasNoUserSuppliedProxyInterfaces(config)“就是判断代理的对象是否有实现的接口,有的话直接走JDK代理的分支。对象

其次经过方法createAopProxy中能够看到 new ObjenesisCglibAopProxy(config)和new JdkDynamicAopProxy(config)blog

那么Spring是如何生成代理对象的呢?接口

1.建立容器对象的时候,根据切入点表达式拦截的类,生成代理对象

2.动态代理,上面源代码的判别中能够看出,若是目标对象有实现接口,使用JDK代理;不然用Cglib代理。

3.而后从容器获取代理后的对象,在运行期植入“切面”类的方法。

呃呃呃,就这样吧!

相关文章
相关标签/搜索