Spring AOP使用了两种代理机制:一种是基于JDK的动态代理;另一种是基于CGLib的动态代理
JDK动态代理只能提供对接口的代理,不能实现对类的代理
所以Spring AOP也采用了Cglib动态代理技术
下面采用实例分别叙述JDK动态代理和CGLib的区别
JDK动态代理:
1、
业务接口和实现类:
public interface BusinessService { void ink_print(); } public class BusinessServiceImpl implements BusinessService { @Override public void ink_print() { System.out.println("---------------业务主体----------------"); } }
JDK动态代理涉及到两个类Proxy和InvocationHandler
Proxy:生成业务实体对象,产生代理类
InvocationHandler:用来将横切代码和业务代码结合起来
2、
实现InvocationHanlder接口:
public class JdkHandler implements InvocationHandler { private Object target; public JdkHandler(Object target){ this.target = target; } /** * 将横切逻辑和业务方法结合在一起 * ①System.out.println("---------------拦截AOP----------------"); * ②System.out.println("---------------业务主体----------------"); */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //拦截从此展开 System.out.println("---------------拦截AOP----------------"); //业务主体代码,method.invoke是通过反射机制调用业务对象的方法 Object obj = method.invoke(target, args); return obj; } }
3、创建代理实例
public class TestJdkProxy { public static void main(String[] args) { BusinessService target = new BusinessServiceImpl(); JdkHandler handler = new JdkHandler(target); //根据target、handler产生代理实例 BusinessService proxy = (BusinessService) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); proxy.ink_print(); } }
调用主业务的方法体,然后通过Proxy产生代理类,最终由代理类去执行操作,这就是代理操作。
CGlib动态代理
CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用
实现MethodInterceptor:创建动态代理类,将业务方法代码和横切逻辑代码组合
public class CglibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); public Object getProxy(Class clazz){ enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable { System.out.println("---------------拦截AOP----------------"); Object target = proxy.invokeSuper(obj, arg2); return target; } }
测试类: 此时就是和JDK动态代理不同,创建类代理,而不是接口
public class TestCglibProxy { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); BusinessServiceImpl businessService = (BusinessServiceImpl) proxy.getProxy(BusinessServiceImpl.class); businessService.ink_print(); } }
相关推荐
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
NULL 博文链接:https://jummy.iteye.com/blog/255628
JDK动态代理和Cglib动态代理实例源码
java静态代理 jdk动态代理 cglib动态代理 代理原理
java代理机制 JDK动态代理和cglib代理 详解
NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1711218
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
实现java动态代理的两个实例,jdk动态代理和cglib
jdk 的动态代理和CGLIB代理
静态代理、jdk动态代理、cglib动态代理
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我
通过从静态代理、JDK 动态代理、CGLIB 动态代理来进行本文的分析。 静态代理 静态代理就是在程序运行之前,代理类字节码.class就已编译好,通常一个静态代理类也只代理一个目标类,代理类和目标类都实现相同的接口。...
JDK代理和Cglib代理,下载源码清楚了解二者区别
本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...
jdk动态代理与cglib动态度代理的区别原理代码jar包
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能