众所周知,我们可以从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
标签:spring,Transactional,代理,boot2,bean,proxy,Spring,注解 From: https://www.cnblogs.com/huainanyin/p/17969107