正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换?

您所在的位置:网站首页 代理模式有几种 正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换?

正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换?

2023-12-06 18:41| 来源: 网络整理| 查看: 265

 

 

spring的动态代理模式有几种?默认是那种?如何切换?

spring的动态的代理模式有两种

JDK动态代理,基于接口(默认代理模式),CGLIB动态代理(若要使用需要进行配置)

JDK动态代理是由java JDK提供

其缺点是只能为接口创建代理,返回的代理对象也只能转到某个接口类型

CGLIB动态大力是由是由第三方库cglib提供,

CGLIB的实现机制与JDK的实现机制不同,它是通过继承实现的,它也是动态的创建一个类,但这个类的父类是被代理类

如何将代理模式由默认的JDK切换到CGLIB

配置aop true使用CGLIB产生代理对象 false 使用jdk 默认false。

通过代码模拟事务控制 JDK动态代理

Java SDK代理的是对象,需要先有一个实际对象,自定义的InvocationHandler引用该对象,然后创建一个代理类 和代理对象,客户端访问的是代理对象,代理对象后再调用实际对象的方法

package com.baizhi.c_dynamic_proxy;

import com.baizhi.service.UserService; import com.baizhi.service.impl.UserServiceImpl;

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;

public class TestDynamicProxy {

public static void main(String[] args) {

//1.目标对象 被代理对象(实现类) final UserService userService = new UserServiceImpl();

//2.使用Proxy创建代理类对象 UserService proxy = (UserService) Proxy.newProxyInstance (TestDynamicProxy.class.getClassLoader(),new Class[] {UserService.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //System.out.println(proxy.hashCode()); System.out.println("开启事务...");

//调用实际对象的方法 Object result = method.invoke(userService,args); System.out.println("提交事务..."); return result; } }); System.out.println(proxy.getClass());

proxy.reg();

/* UserService userService = new UserServiceImpl(); UserService proxy = (UserService) new MyDynamicProxy (userService).newProxyInstance(); System.out.println(proxy);*/ //proxy.reg();

}

}执行结果

 

 

 

Cglib动态代理

cglib代理的是类,创建的对象只有一个。

package com.baizhi.d_cglib_proxy;

import com.baizhi.service.impl.UserServiceImpl; import org.springframework.cglib.proxy.Callback; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class TestCglibProxy {

public static void main(final String[] args) { //enhancer 代理对象 Enhancer enhancer = new Enhancer(); //基于继承 参数是实现类的class UserServiceImpl被代理对象 enhancer.setSuperclass(UserServiceImpl.class); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("开启事务..."); Object result = methodProxy.invokeSuper(o,objects); System.out.println("结束事务..."); return result; } }); UserServiceImpl o2 = (UserServiceImpl) enhancer.create(); System.out.println(o2.getClass()); o2.reg();

}

}执行结果

 

 

 

————————————————版权声明:本文为CSDN博主「莫言秋语」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/moyanqiuyu/article/details/84305295



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3