一、静态代理
Java的静态代理是在代码中进行硬编码,代理类和目标类同时实现一个接口,在代理类中的方法调用目标类的代码,并进行增强。
以展示照片为例,场景IImage接口,定义display展示方法,在Image类中进行具体实现,通过ImageProxy代理类,对display()方法添加前置和后置的方法进行业务代码的增强,从而实现静态代理。
二、动态代理
Java的动态代理是在运行期间动态创建代理类的机制(静态代理是在编译期间创建的代理类)。Java动态代理的实现方式主要有2个,一个是通过JDK动态代理,一个是CGlib动态代理。
-
JDK动态代理:主要通过Proxy类和InvocationHandler接口;
Client.class: // 创建目标对象 Image image = new Image(); // 创建动态代理的处理器 InvocationHandler handler = new MyInvocationHandler(image); IImage iImage = Proxy.newProxyInstance(Image.class.getClassLoader(), new Class<?>[]{IImage.class}, hander); // MyInvocationHandler.class: class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置逻辑"); Object result = method.invoke(target, args); System.out.println("After method execution."); return result; } }
-
CGlib代理:动态生成一个要代理类的字类,然后重新父类(目标类)中的方法,并在子类中织入代码从而实现在执行业务代码的时候,执行公共方法。在springboot2.x以后,AOP默认采用CGlib进行动态代理,如果实现类中采用了private修饰词修饰方法,无法通过@Transactional走事务。