要了解Spring的AOP就必须要了解动态代理的原理,因为AOP就是基于动态代理实现的。
java.lang.reflect包下有个Proxy类,它正是构造代理类的入口,其中newProxyInstance就是创建代理对象的方法,这个方法需要三个参数:
1.ClassLoader(用于加载代理类的loader);
2.Interfaces,是要被代理的那些接口;
3.InvocationHandler,用于执行除了被代理接口中方法之外的用户自定义操作(也是我们需要代理类的真正目的)。用户调用目标方法都被代理到InvocationHandler类中定义的唯一方法Invoke()中。
代理的目的就是调用目标方法时可以转而执行InvocationHandler类的invoke方法,所以在InvocationHandler上做文章就是Spring实现AOP的关键之处。这就是JAVA中JDK代理。
这里其实运用到了一个设计模式:代理模式
设计模式主要分:动态代理和静态代理
静态代理:可以理解为对象由代理创建,在创建前后做一些事情,比如统计创建了多少对象,但静态代理只能创建一个或固定的几个对象。像如果是Spring中Bean,静态代理就明显不合适,因为这样不仅需要程序员手动创建大量的代理接口,而且也不能保证可扩展性。
为什么AOP选择使用动态代理实现:
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
网友评论