spring的动态代理模式有几种?默认是那种?如何切换?
spring的动态的代理模式有两种
JDK动态代理,基于接口(默认代理模式),CGLIB动态代理(若要使用需要进行配置)
JDK动态代理是由java JDK提供
其缺点是只能为接口创建代理,返回的代理对象也只能转到某个接口类型
CGLIB动态大力是由是由第三方库cglib提供,
CGLIB的实现机制与JDK的实现机制不同,它是通过继承实现的,它也是动态的创建一个类,但这个类的父类是被代理类
如何将代理模式由默认的JDK切换到CGLIB
配置aop <aop:config proxy-target-class="true"> 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)