Spring篇
1.Spring的AOP理解?
AOP就是面向切面,用于将和业务无关的逻辑代码抽取并封装成一个可用的模块,减少重复代码,降低模块之间的耦合度,提高系统的可维护性。AOP的实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理,静态代理为AspectJ;动态代理微Spring AOP。
- AspectJ是静态代理的增强,就是AOP框架会在编译阶段生成AOP代理类,将AspectJ织入进Java字节码中,运行的时候就是增强后的AOP对象。
- Spring AOP使用的是动态代理,所谓动态代理就是AOP不会修改字节码,而是每次运行中在内存临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原始对象方法。
- 动态代理分为JDK和CGLib代理:
jdk动态代理是只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler通过invoke()方法反射来调用目标代码,动态的将和逻辑和业务编织在一起;然后利用InvocationHandler动态创建一个符合某一接口的实例生成目标类的代理对象。
如果代理类没有实现InvocationHandler接口,Spring AOP会选择CGLib代理,可以运行时动态的生成一个指定类的子类对象,并覆盖其中方法添加增强代码,CGLib是通过继承来做动态代理,如果某个类被标记为final,则无法使用CGLib做动态代理。