SpringBoot/Spring AOP默认动态代理方式是什么

1. springboot 2.x 及以上版本 

在 springboot 2.x aop中会默认使用cglib来实现,但是spring5中默认还是使用jdk动态代理。spring aop 默认使用 jdk 动态代理,如果对象没有实现接口,则使用 cglib 代理。当然,也可以强制使用 cglib 代理。

在 SpringBoot 中,通过AopAutoConfiguration来自动装配AOP.

SpringBoot/Spring AOP默认动态代理方式是什么

2. Springboot 1.x

Springboot 1.x AOP默认还是使用 JDK 动态代理的

SpringBoot/Spring AOP默认动态代理方式是什么

3.SpringBoot 2.x 为何默认使用 Cglib

因为JDK 动态代理是基于接口的,代理生成的对象只能赋值给接口变量。JDK动态代理使用Proxy.newProxyInstance()创建代理实现类,然而第二个参数就需要接口类型,如果没有接口类型就会报错。

Proxy.newProxyInstance(iCustomerInstance.getClass().getClassLoader(), iCustomerInstance.getClass().getInterfaces(), this);

登录后复制

而 CGLIB 就不存在这个问题。因为 CGLIB 是通过生成子类来实现的,代理对象无论是赋值给接口还是实现类,这两者都是代理对象的父类。

所以在2.x版本以上,将 AOP 默认实现改为了 CGLIB代理。

新建一个接口

public interface ICustomService {    void printf();}

登录后复制

新建一个ICustomService的实现类

@Servicepublic class CustomServiceImpl implements ICustomService {     public void printf() {     }}

登录后复制

再增加一个类不实现任何接口

@Servicepublic class CustomNoImpl {     public void hello() {            }}

登录后复制

然后启动,可以ICustomService和CustomNoImpl看出AOP的代理使用的是CGLIB的动态代理

SpringBoot/Spring AOP默认动态代理方式是什么

然后我们通过application.properties配置将代理默认设置为JDK代理。

spring.aop.proxy-target-class=false

登录后复制

然后启动调试发现,CustomNoImpl因为没有实现接口,所以使用的是CGLIB生成的代理,而

customService有接口实现,所以使用JDK的动态代理

SpringBoot/Spring AOP默认动态代理方式是什么

以上就是SpringBoot/Spring AOP默认动态代理方式是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2627251.html

(0)
上一篇 2025年3月7日 01:02:09
下一篇 2025年3月7日 01:02:15

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论