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

最新文章

  1. Hbuilder与svn快速连接并在手机上测试页面
  2. linux dns 配置
  3. git操作日志
  4. 序列化--dict与(file)文件读写
  5. 基于HTML5的WebGL设计汉诺塔3D游戏
  6. [moka同学笔记]Yii2.0显示页匿名函数设置$value
  7. BlacJack游戏
  8. Android菜鸟成长记5-ADB和sqllite
  9. ArcGIS Engine开发的ArcGIS 版本管理的功能
  10. 所有的代码生成器都是浮云,如果可以用aspx文件作为模板
  11. Spring--AOP--面向切面编程
  12. pinvoke 数据交互笔记
  13. Python 中 and 和 or 的短路原则
  14. Python实现无向图最短路径
  15. mysql 唯一索引UNIQUE使用方法详解
  16. [Windows Azure] Adding Sign-On to Your Web Application Using Windows Azure AD
  17. RocketMQ 集群搭建--双Master方案
  18. java语言导学(5版)--第12章并发之二
  19. Archlive新年第一棒: 基于2.6.37稳定内核的archlive20110107
  20. 开篇~试试word写博客

热门文章

  1. git log 的常用用法
  2. 怎么把百度地图的搜索结果全部导出到Excel文件
  3. spring boot整合druid
  4. redis常用命令之string&amp;list
  5. 全网echarts案例资源大总结和echarts的高效使用技巧(细节版)
  6. unix:///var/run/supervisor.sock no such file报错解决办法
  7. laravel facebook等第三方授权登录
  8. SQLServer数据库,使用Alter修改表的主外键结构
  9. Echarts xAxis、yAxis
  10. Ajax 后台传值接收方法