AOP
一: 基础概念
-
AOP概念
面向切面变成,通过预编译的方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是Spring的另一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性。
-
AOP作用
- 作用 : 在程序运行期间,不修改源代码对已有方法进行增强
- 能够减少重复代码
- 提高开发的效率
- 更方便的维护
- 作用 : 在程序运行期间,不修改源代码对已有方法进行增强
-
动态代理
- 特点 : 字节码随用随创建,随用随加载
- 作用 : 不修改源码的基础上对方法进行增强
- 与静态代理的区别:
- 静态代理是字节码一开始就创建好,并完成加载
- 动态代理是字节码随用随创建,随用随加载
装饰者模式也是动态代理的一种实现
-
基于接口代理
涉及的类 : Proxy 提供者 : JDK
- 如何使用:
- 使用Proxy类中的 newProxyInstance 方法
要求: 被代理对象最少实现一个接口,如果没有则不能使用
-
newProxyInstance 参数 :
- ClassLoader : 类加载器,用于加载代理对象字节码,和被代理对象使用相同的类加载器。是固定写法
- Class[] : 字节码数组,是用于让代理对象和被代理对象有相同的方法。是固定写法
- InvocationHandler : 用于提供增强的代码,是用于写如何代理,一般是写一个该接口的实现类,通常情况下是匿名内部类,但不是必须写。此接口的实现类都是谁用谁写,
-
例:
被代理对象类名 代理对象 = (被代理对象类名) Proxy.newProxyInstance(被代理对象.getClass().getClassLoader(), 被代理对象.getClass().getInterfaces(), new InvocationHandler() { /** * 作用: 执行被代理对象的任何接口方法都会经过该方法 * proxy: 代理对象的引用 * method: 当前执行的方法 * args: 当前执行方法所需的参数 * * 和被代理对象方法有相同的返回值 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在此处提供增强的方法 return method.invoke(被代理对象, args); } });
- 如何使用:
-
基于子类代理
-
导入依赖
cglib cglib 2.1_3
涉及的类 : Enhancer 提供者 : 第三方cglib库
- 如何使用:
- 使用Enhancer类中的create方法
要求: 被代理对象不能是最终类
-
create 参数 :
- Class : 字节码,用于指定被代理对象的字节码
- Callback : 用于提供增强的代码,是用于写如何代理,一般是写一个该接口的实现类,通常情况下是匿名内部类,但不是必须写。此接口的实现类都是谁用谁写 (一般写都是该接口的子接口实现类-> MethodInterceptor )
-
例:
被代理对象类名 代理对象 = (被代理对象类名) Enhancer.create(被代理对象.getClass(), new MethodIntercetor() { /** * 执
-