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的动态代理模式有几种?默认是那种?如何切换?的更多相关文章

  1. 浅谈正向代理、反向代理和CDN的区别

    一.正向代理 1.正向代理位于客户端和源服务器之间的服务器(代理服务器): 2.隐藏客户端:由代理服务器代替客户端去访问目标服务器,用户需要设置代理服务器的IP和端口: 3.每一次请求是到代理服务器, ...

  2. 使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度

    碰到问题:移动用户访问web服务器www.osyunwei.com很慢解决办法:1.在移动机房放置一台nginx反向代理服务器2.通过域名DNS智能解析,所有移动用户访问www.osyunwei.co ...

  3. spring AOP 动态代理和静态代理以及事务

    AOP(Aspect Oriented Programming),即面向切面编程 AOP技术,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装 ...

  4. 解决spring使用动态代理

    解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ... 转 ...

  5. jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

    代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...

  6. java代理(静态代理和jdk动态代理以及cglib代理)

    版权声明:本文为Fighter168原创文章,未经允许不得转载.   目录(?)[+]   说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻 ...

  7. Spring AOP 动态代理 缓存

    Spring AOP应用:xml配置及注解实现. 动态代理:jdk.cglib.javassist 缓存应用:高速缓存提供程序ehcache,页面缓存,session缓存 项目地址:https://g ...

  8. spring aop 动态代理批量调用方法实例

    今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候 ...

  9. Spring AOP动态代理原理与实现方式

    AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物   2.日志处理:3.安全验证 ...

  10. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只 ...

随机推荐

  1. k8s_使用k8s部署wordpress博客系统(一)

    系统部署流程 使⽤kubernetes部署wordpress+MySQL, 并利⽤NFS去保存我们容器的源代码以及DB数据.搭建好nfs后任意node上的Pod访问db或者业务代码都会有相同的效果,数 ...

  2. SQL1224 is returned during the execution of an SQL procedure

    SQL1224 is returned during the execution of an SQL procedure https://www.ibm.com/support/pages/sql12 ...

  3. Java 日期类 处理

    原始方案:SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD"); //线程不安全类,最好不要用了,替代方案: Date ...

  4. SpringCloud组件:搭建Eureka服务注册中心,搭建的时候一定要确保springboot和springCloud的版本对应

    搭建的时候一定要确保springboot和springCloud的版本对应,不然会报下面的错 查看版本对应得地址:https://start.spring.io/actuator/info 改了对应得 ...

  5. Finance财务软件(辅助核算专题)

    支持辅助核算和数量核算

  6. Java实现发红包模拟

    1.先画界面 package com.cmk; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; i ...

  7. [ARC140D] One to One

    个人思路: 一棵树也只有一个 \(a=-1\) 的点,所以可以把它看做一个点,但是要记录点的大小 \(sz_i\),即为这棵树的大小.如果本来就是一个点,那么大小为 \(1\). 状态:\(dp_{i ...

  8. vscode调试openresty

    一.快速上手 1.软件下载 官网地址:https://code.visualstudio.com/ 安装视频:https://code.visualstudio.com/docs/getstarted ...

  9. Jupyter Notebook基本配置与使用

    Jupyter Notebook,原名IPython Notbook,是IPython的加强网页版,一个开源Web应用程序 1.创建虚拟环境 mkvirtualenv ai 2.进入虚拟环境 work ...

  10. Python面向对象编程——一些类定义(杂)

    一.abstractmethod 子类必须全部实现重写父类的abstractmethod方法 非abstractmethod方法可以不实现重写 带abstractmethod方法的类不能实例化 fro ...