这里有新鲜出炉的精品教程,程序狗速度看过来!
Spring 是什么呢?首先它是一个开源的项目,而且目前非常活跃;它是一个基于 IOC 和 AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层 中必须使用 Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的 MVC,对不同的数据访问技术提供了统一的接口,采用 IOC 使得可以很容易的实现 bean 的装配,提供了简洁的 AOP 并据此实现 Transcation Managment,等等
这篇文章主要介绍了 Spring AOP 的实现原理详解及实例的相关资料, 需要的朋友可以参考下
Spring AOP 的实现原理详解及实例
spring 实现 AOP 是依赖 JDK 动态代理和 CGLIB 代理实现的。
以下是 JDK 动态代理和 CGLIB 代理简单介绍
JDK 动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
CGLIB 代理:实现原理类似于 JDK 动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB 是高效的代码生成包,底层是依靠 ASM(开源的 Java 字节码编辑类库)操作字节码实现的,性能比 JDK 强。
在 Spring 中,有接口时将采用 JDK 的方式实现 proxy 代理对象,当没有接口时,将采用 cglib 中的方式实现 prixy 代理对象。详情如下:
- // JDK方式:PersonService为接口,PersonServiceBean为实现类,
- public class JDKProxyFactory implements InvocationHandler {
- private Object targetObject;
- public Object createProxyIntance(Object targetObject)
- {
- this.targetObject=targetObject;
- return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
- this.targetObject.getClass().getInterfaces(), this);
- }
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- PersonServiceBean person=(PersonServiceBean)this.targetObject;
- Object result=null;
- if(person.getUser()!=null)
- {
- result = method.invoke(targetObject, args);
- }
- return result;
- }
- }
- //使用CGlib包实现:PersonServiceBean为实现类, 而没有PersonService接口,
- public class CGlibProxyFactory implements MethodInterceptor{
- private Object targetObject;
- public Object createProxyInstance(Object targetObject)
- {
- this.targetObject=targetObject;
- Enhancer enhancer=new Enhancer();
- enhancer.setSuperclass(this.targetObject.getClass());//设置目标类的子类,该子类会覆盖所有父类中的非final方法
- enhancer.setCallback(this);//设置回调
- return enhancer.create();
- }
- public Object intercept(Object proxy, Method method, Object[] args,
- MethodProxy methodProxy) throws Throwable {
- PersonServiceBean person=(PersonServiceBean)this.targetObject;
- Object result=null;
- if(person.getUser()!=null)
- {
- result = methodProxy.invoke(targetObject, args);
- }
- return null;
- }
- }
来源: http://www.phperz.com/article/17/0822/338947.html