Spring中两个要点,aop和ioc,我们都知道aop是面向切面编程,常用于日志管理之类的,原理呢?
Spring的核心原理是通过动态代理模式在方法执行前后或出现异常时加入相关的逻辑。
1.AOP是基于动态代理模式。
2.AOP是方法级别的(要测试的方法不能为static修饰,因为接口中不能存在静态方法,编译就会报错)。
3.AOP可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。
动态代理:
动态代理分为JDK代理和Cglib代理,看一下Spring的DefaultAopProxyFactory源码:
从上述源码片段可以看出,是否使用cglib是在代码中进行判断的,判断条件首先是config.isOptimize()、config.isProxyTargetClass()和hasNoUserSuppliedProxyInterfaces(config)。其中config.isOptimize()与config.isProxyTargetClass()默认返回都是false,这种情况下判断结果就由hasNoUserSuppliedProxyInterfaces(config)的结果决定:
所以简单的说“ hasNoUserSuppliedProxyInterfaces(config)“就是判断代理的对象是否有实现的接口,有的话直接走JDK代理的分支。
其次通过方法createAopProxy中可以看到 new ObjenesisCglibAopProxy(config)和new JdkDynamicAopProxy(config)
那么Spring是如何生成代理对象的呢?
1.创建容器对象的时候,根据切入点表达式拦截的类,生成代理对象
2.动态代理,上面源代码的判别中可以看出,如果目标对象有实现接口,使用JDK代理;否则用Cglib代理。
3.然后从容器获取代理后的对象,在运行期植入“切面”类的方法。
呃呃呃,就这样吧!