SpringBoot2 bean和代理

众所周知,我们可以从applicationContext根据name来获取bean,我曾一度以为bean就是bean自己,spring帮我们new出来的一个class对象,但当我读到下图这句话的时候,有点懵,getBean得到的为啥是代理对象???

 

不过又一想,方法上有Transactional注解,Transactional会帮你做一些事务的commit,rollback的操作,应该是做了一下动态代理,不过以前使用Transactional并没有想这么多,那么ok,我来验证一下吧,顺便看看用的是什么代理

先简单建个springboot2.5的project,加上controller和service,service上加个Transactional注解,开始调用吧

 

这怎么和猜想的不一样,这也不像是代理啊,就是bean本身啊,bean本身的话Transactional是怎么工作的??

想来想去,会不会是没有数据库,Spring初始化的bean的时候认为没有数据库,也不需要事务,所以就不做代理了?那我加上数据库再试试(依赖加上mysql connector和mybatis)

 

 

果然

 

 

从bean得到的就是代理类

答案有了,应该Spring会判断是否配置了数据库并且这个bean是否有Transactional注解(及别的aop相关的操作,比如自定义注解实现aop), 都满足,就进行代理,否则就是bean本身。

 

另外为什么是Cglib代理,这个class是有接口的,我明明记得Spring默认jdk proxy,没有接口就使用Cglib proxy,

一查资料,Spring5的AOP默认是jdk proxy,Spring Boot2虽然对应的是Spring5,但却是默认Cglib proxy,因为jdk proxy可能会有类型转换异常,好吧,是我记得片面了。

 

这段逻辑应该能从SpringBoot的初始化里面找到,参考 https://blog.csdn.net/qq_41625866/article/details/128613828

 

 

最近又尝试的一下SpringBoot3和SpringBoot2.7,针对@Transactional注解的代理增强,都是用的cglib

posted @ 2024-01-17 09:37  坏男银  阅读(34)  评论(0编辑  收藏  举报