(1)AOP概念:
面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。 主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
AOP特点:
采用横向抽取机制,取代了传统纵向继承体系重复性代码。
AOP底层实现:
AOP底层使用动态代理实现。包括两种方式:
(1)使用JDK动态代理实现。
(2)使用cglib来实现
JDK动态代理实现: 只能对实现了接口的类生成代理,而不是针对类,该目标类型实现的接口都将被代理。原理是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
1. 定义一个实现接口InvocationHandler的类 2. 通过构造函数,注入被代理类 3. 实现invoke( Object proxy, Method method, Object[] args)方法 4. 在主函数中获得被代理类的类加载器 5. 使用Proxy.newProxyInstance( )产生一个代理对象 6. 通过代理对象调用各种方法
cglib动态代理实现: 针对类实现代理,对是否实现接口无要求。原理是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以被代理的类或方法最好不要声明为final类型。
1. 定义一个实现了MethodInterceptor接口的类
2. 实现其intercept()方法,在其中调用proxy.invokeSuper( )
代理方式的选择:
- 如果目标对象实现了接口,默认情况下回采用JDK的动态代理实现AOP,也可以强制使用cglib实现AOP
- 如果目标对象没有实现接口,必须采用cglib库,Spring会自动在JDK动态代理和cglib之间转换
AOP操作术语: