首页 > 其他分享 >spring boot2 bean和代理

spring boot2 bean和代理

时间:2024-01-17 09:45:44浏览次数:24  
标签:spring Transactional 代理 boot2 bean proxy Spring 注解

众所周知,我们可以从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

相关文章

  • SpringCloudAliBaBa Seata学习
    分布式事务使用场景同一个事务对两个数据库操作,事务肯定是会失效的因为一个事务就是一个数据库连接,不同的连接就是不同的事务Seata是什么?Seata是一款分布式事务解决方案,用AT模式是阿里推荐的事务模式:TCC、SAGA、XA常见分布式事务解决方案1、seata阿里分布式框架2、消息......
  • Spring-jdbc
    1引入相关依赖<dependencies><!--springjdbcSpring持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><versi......
  • springcache condition #result 条件不生效问题排查
    本文主要是日常开发过程当中遇到的一个实际问题,以及问题排查的过程你将了解:springcache注解中condition的作用原理condition以及unless条件判断的区别背景有一个用户权限查询接口,查询用户在某个应用的权限,关键的两个入参信息为appCode(应用编码)account(用户账号)......
  • 掌握Spring缓存-全面指南与最佳实践
    第1章:引言大家好,我是小黑,咱们今天来聊聊缓存,在Java和Spring里,缓存可是个大角色。咱们在网上购物,每次查看商品详情时,如果服务器都要去数据库里翻箱倒柜,那速度得慢成什么样?这就是缓存发光发热的时刻。缓存就像是服务器的“小抽屉”,把经常用到的数据放在里面,下次需要的时候,直接从“......
  • Springboot3+Vue3在进行WebSocket通讯时出现No mapping for GET或者是404
    参考:在SpringBoot中整合、使用WebSocket-spring中文网(springdoc.cn)===============================原代码(此时前端访问后端,后端会出现:NomappingforGET/wspath)前端相关代码:letsocket:WebSocket|null=nullconstsocketURL=`ws://127.0.0.1:8084/w......
  • Spring Boot 整合工厂设计模式完成服务调用的一种实现
    工厂模式是一种创建型设计模式,其主要目的是提供一个创建对象的接口,但将具体类的实例化延迟到子类中。这样,客户端代码就不需要知道要实例化的具体类,只需要知道使用的工厂接口。项目结构如下代码实例如下所有水果都要实现这个接口publicinterfaceAllFruits{voideatFru......
  • Spring事务传播机制解析
    确保数据一致性的关键在Java的Spring框架中,事务管理是保证应用数据一致性和可靠性的关键。Spring提供了灵活的事务传播机制,它定义了事务边界,以及在嵌套方法调用时如何处理事务。本文旨在深入探讨Spring的事务传播行为,帮助开发者更好地理解和运用这一重要特性。事务传播机制简介......
  • 实现手机/PC端滑块验证(VUE+Springboot)
    思路a,通过后端,获取到图片,这个图片自己定义,随便是撒。b,通过代码把图片进行随机抠图,扣出一块,形成第二个图,该小图就是为了合并到原有的窟窿中。c,然后把两个图传到后端,保存抠出的图需要移动的距离到redis,作为验证值。d,前端根据图的位置展示底图与小图e,进行移动,完成后进行验证。......
  • Spring IoC 原理剖析
    目录IoC容器系列的设计与实现:BeanFactory和ApplicationContextIOC容器接口设计图BeanFactory容器设计原理编程式使用IOC容器ApplicationContext设计原理AbstractRefreshableApplicationContextIoC容器的初始化创建Bean容器前的准备工作创建Bean容器,加载并注册Bean刷新Bean......
  • springBoot通过AOP(面向切面编程)实现自动保存请求日志
    1.定义注解importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Target(ElementType.METHOD)//指定该注解只能应用于方法上@Retention(RetentionPolicy.......