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

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
正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换?的更多相关文章
- 浅谈正向代理、反向代理和CDN的区别
一.正向代理 1.正向代理位于客户端和源服务器之间的服务器(代理服务器): 2.隐藏客户端:由代理服务器代替客户端去访问目标服务器,用户需要设置代理服务器的IP和端口: 3.每一次请求是到代理服务器, ...
- 使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度
碰到问题:移动用户访问web服务器www.osyunwei.com很慢解决办法:1.在移动机房放置一台nginx反向代理服务器2.通过域名DNS智能解析,所有移动用户访问www.osyunwei.co ...
- spring AOP 动态代理和静态代理以及事务
AOP(Aspect Oriented Programming),即面向切面编程 AOP技术,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装 ...
- 解决spring使用动态代理
解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ... 转 ...
- jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)
代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...
- java代理(静态代理和jdk动态代理以及cglib代理)
版权声明:本文为Fighter168原创文章,未经允许不得转载. 目录(?)[+] 说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻 ...
- Spring AOP 动态代理 缓存
Spring AOP应用:xml配置及注解实现. 动态代理:jdk.cglib.javassist 缓存应用:高速缓存提供程序ehcache,页面缓存,session缓存 项目地址:https://g ...
- spring aop 动态代理批量调用方法实例
今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候 ...
- Spring AOP动态代理原理与实现方式
AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物 2.日志处理:3.安全验证 ...
- Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只 ...
随机推荐
- jquery获取单选按钮选中的值
jQuery 取选中的radio的值方法 var val=$('input:radio[name="sex"]:checked').val(); 附三种方法都可以: $('inpu ...
- 头条二面:宕机后,Redis如何实现快速恢复?
Redis作为非常火热的内存数据库,其除了具有非常高的性能之外,还需要保证高可用,在故障发生时,尽可能地降低故障带来的影响,Redis也提供了完善的故障恢复机制:哨兵.下面就来具体来看看Redis的故 ...
- @Html.DropDownList,绑定默认值
后端代码: List<Area> list = new List<Area> { new Area { Id=1,Name="北京"}, new Area ...
- db2存储过程很慢如何查看
存储过程很慢 ,如何处理? #查看包的情况select r.routineschema, r.routinename, r.routinemodulename, rd.bname as package ...
- 增、改生产订单组件BAPI BAPI_ALM_ORDER_MAINTAIN
转载留存 IT_METHODS LIKE BAPI_ALM_ORDER_METHOD处理方法,必选项,存储CREATE CREATETONOTIF CHANGE DELETE RELEAS ...
- unity animation instance
animation instance piti6/UnityGpuInstancedAnimation https://github.com/piti6/UnityGpuInstancedAnimat ...
- java第六周学习情况
这个星期接到了要开学的消息,心情是非常慌张的,毕竟还没有学到多少东西.但确实是要开学了.心中说不出激动还是紧张,那就带着这种奇妙的情绪记录这次的学习吧 首先必然还是看了相关的程序,记没记下来是另外一说 ...
- 《Unix/Linux系统编程》第十三章学习笔记 20201209戴骏
TCP/IP协议 从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议.实际生活当中有时也确实就是指这两种协议.然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议 ...
- JS篇(001)-document load 和 document ready 的区别
答案: 页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待 ...
- 【2020NOI.AC省选模拟#2】A. 旋转
题目链接 原题解: 把每个点的坐标视为复数,那么每次询问就是区间求平均数(先求和然后除以个数).一个点绕着原点旋转就是乘以$(\cos 60^\circ +i\sin 60^\circ)$. 一个点绕 ...