1.SpringBoot从入门到精通(十七)SpringBoot Actuator
2.「Java开发指南」如何在MyEclipse中使用JPA和Spring管理事务?(一)
3.「译」Spring 事务管理:@Transactional 深度解析|by MarcoBehler.md
4.SpringBoot从入门到精通(二十一)SpringBoot3 集成Swagger3
SpringBoot从入门到精通(十七)SpringBoot Actuator
欢迎大家点点关注,码解可以最先收到定期更新的码解 SpringBoot 以及 Java 编程相关知识文章。
最近突然有个想法,码解帮助那些刚毕业的码解大学生以及新入门的朋友来学习SpringBoot,写一系列的码解SpringBoot,今天写第十七篇,码解涨停板 源码SpringBoot Actuator,码解可以了解服务的码解各种情况,健康检查,码解服务状态之类。码解
一、码解pom文件增加引入
需要引入spring-boot-starter-actuator包,码解为我们提供actuator相关jar包,码解具体如下。码解
二、码解配置
application.yaml增加如下配置,注意可能是新版本的SpringBoot parent导致的,我的版本是2.7.4,启动服务后,没有任何报错,服务自动就停止了,最后增加了management.server.port: 这个配置后,才可以正常启动,查看文档发现后期版本把actuator和默认服务拆分了,阅读 redhat 源码需要配置独立于服务的端口。
三、Java实现
修改WebSecurityConfig.java,允许actuator不需要basicauth权限可以直接访问。
增加MaxMemoryHealthIndicator.java,修改默认/actuator/health接口默认实现,增加自定义的内存不足G表示服务没有成功启动的逻辑。
增加ReadinessEndpoint.java可以自定义一些actuator的监控接口,可以在里面自定义一些具体的按照自己业务逻辑或者特殊程序的一些逻辑。
四、验证
启动服务后,通过postman的Get方式调用接口mit 或 rollback JDBC 事务?最终,他们都做了同样的事来开启和关闭(或称为“管理”)数据库事务。纯 JDBC 事务管理代码如下:这 4 行高度简化的代码,就是 Spring@Transactional 为你在背后做的所有事情。在下一章节中,你将会学到他们是如何工作的。在此之前,我们还有一丁点知识点要补充。
如何使用 JDBC 隔离级别和保存点(savepoints)?如果你已经使用过 Spring@Transactional 注解,你可能碰到过类似用法:我们会在后文更加详细的介绍 Spring 嵌套事务和隔离级别,在这重复提及,是量化抄底源码因为这些参数最终可提炼成如下 JDBC 代码:
Spring 或 Spring Boot 的事务是如何工作的?既然现在你对 JDBC 事务有了基础的理解,让我们再去探究下纯粹的 Spring 核心事务。这里所讲都可 1:1 适用于 Spring Boot 和 Sring MVC,但又做了一些补充。到底什么是 Spring 事务管理或事务抽象框架?记住,事务管理可简单理解为:Spring 如何 start, commit 或 rollback JDBC 事务?是不是听着和前文讲得很相似?抓住重点:基于 JDBC 你只有一个方法(setAutocommit(false))来开启事务管理,Spring 提供了许多不同,但更方便的封装来做相同的事情。
如何使用 Spring 编程式事务管理?最初,但现在很少使用方式,是在 Spring 通过编程定义事务:通过TransactionTemplate 或者直接使用 PlatformTransactionManager。代码示例如下「译者注:参见配套项目 BookingServcie 实现」:与 JDBC 示例 比较:尽管这是一个不小的改进,但编程式事务管理并不是 Spring 事务框架主要关注的。相反,声明式事务管理才是重头戏。让我们一探究竟
如何使用 Spring 的@Transactional 注解(声明式事务管理)?让我们看下时下的 Spring 事务管理通常怎么用:这是怎么做到的?没有了冗余的 XML 配置和额外的编码。相反,你只需要做两件事:所以,为了让@Transactional 工作,你需要:现在,我说 Spring 透明的为你处理事务,到底在指什么? 在有了 JDBC 事务示例 的知识储备后,@Transactional 标注的 UserService 可以翻译简化成:这个示例看起来像魔术,让我们继续探究下 Spring 是时钟效果源码如何为你自动插入这些连接代码的。
CGLIB & JDK 代理 - 在@Transactional 之下?Spring 不能真的像我上面做的那样,去重写你的 Java 类来插入连接代码(除非你使用字节码增强等高级技术,在这我们暂时忽略它)
你的registerUser() 方法还是只是调用了 userDao.save(user),这是无法实时改变的。但是 Spring 有它的优势。在核心层,它有一个 IoC 容器。它实例化一个UserService 单例并可自动注入到任何需要 UserService 的 Bean 中。不管何时你在一个 Bean 上使用@Transactional,Spring 使用了个小伎俩。它不是直接实例化一个 UserService 原始对象,而是一个 UserService 的事务代理对象。借助 Cglib library 的能力,它可以使用子类继承代理(proxy-through-subclassing)的方式来实现。当然还有其他方式可以构造代理对象(例如 Dynamic JDK proxies 「译者注:这要求代理对象有相应接口类」),这里暂不做展开。
你的UserService 可以动态生成代理类,并且代理可以帮你管理事务。但是并不是代理类本身去处理事务状态(open,commit,close),而是委托给了事务管理器(transaction manager)。
你的git 网站源码UserService 有一个 invoice() 事务方法。它调用了另外一个 InvoiceService 类上的 createPdf() 事务方法。然而从 Spring 看来,这里有 2 个逻辑事务存在:第一个在UserService,另外一个在 InvoiceService。Spring 足够智能知道让两个 @Transactional 标记的方法,在底层使用同一个物理数据库事务。
更改事务传播模式为requires_new 告诉 Spring:createPDF() 需要在它自己的、独立于其他任何已经在的事务里执行。这意味着你的底层代码会打开 2(物理)连接/事务 到数据库。Spring 依旧能够机智的把 2 个 逻辑事务( invoice()/createPdf() )映射到两个不同的物理数据库事务上。
每个 Spring 传播模式在 数据库或 JDBC 连接层面到底做了什么?练习: 在原始 Java 实现那节,我展示了 JDBC 能够对事务进行的所有操作。花几分钟思考下,每个 Spring 传播模式在数据库或 JDBC 连接层面到底做了什么。然后再看下下面的解答。
答案:如你所见,大多数传播模式并没有在数据库或 JDBC 层面做什么事情。更多的是通过 Spring 来组织你的代码,告诉 Spring 如何/什么时候/哪里需要事务处理。
在示例中,任何时候你调用UserService 的 myMethod() 方法,Spring 期望这里有一个打开的事务。它不会为自己开启,相反,在没有已开启事务的情况下调用方法,Spring 会抛出异常。请记住这 “逻辑事务处理”的补充知识点。
@Transactional 上隔离级别(Isolation Levels)代表什么?这是个抖机灵的问题,但当你如下配置的时候,到底发生了什么?哈,这可以简单地等价于:然而数据库事务隔离级别,是一个复杂的主题,你需要自己花些时间去掌握。Pstgres 的官方文档中的 isolation levels 章节,是个不错的入门文档。
最容易踩的@Transactional 的坑?这里有一个 Spring 新手经常踩的坑,看下如下代码:你有一个UserService 类,事务方法 invoice 内部调用了事务方法 createPdf()。所以,当有人调用invoice() 的时候,最终有个多少个物理事务被打开?答案不是 2 个,而是 1 个,为什么呢?让我们回到本文中代理那章节。Spring 为你创建了UserService 代理类,但代理类内部的方法调用,是无法被代理的。也就是说,没有新的事务为你生成。这里有技巧(例如: self-injection 「译者注:参见示例项目 InnerCallSercie」),可以帮助你绕过该限制。但主要收获是:始终牢记代理事务的边界。
在 Spring Boot 或 Spring MVC 中使用@Transactional?我们目前只是讨论了纯粹的核心 Spring 上的用法。那在 Spring Boot 或 Spring MVC 中会有什么使用差异吗?答案是:没有。无论使用何种框架(或更确切地说:Spring 生态系统中的所有框架),您都将始终使用 @Transactional 注解,配合事务管理器,以及@EnableTransactionManagement 注解。没有其他用法了。但是,与 Spring Boot 的唯一区别是,通过 JDBC 自动配置,它会自动设置@EnableTransactionManagement 注解,并为你创建 PlatformTransactionManager。
关于 Spring 回滚的部分,将会在下一次文章修订中补充。Spring Boot 内回滚是通过@Transactional 注解上 rollback 系列配置实现的,读者可查阅源码注释了解使用方式,注释还是写得很完备的,本质上也是根据配置条件,确定何时调用 commit,何时调用 rollback。
Spring 和 JPA / Hibernate 事务管理是如何一起工作的?目标:同步 Spring@Transactional 和 Hibernate / JPA。在这个节点上,你期望 Spring 可以和其他数据库框架,类似 Hibernate(一个流行的 JPA 实现)或 Jooq 等整合。让我来看一个纯粹的 Hibernate 示例(注意:直接使用 Hibernate 还是通过 JPA 使用 Hibernate 都没关系)。用 Hibernate 将UserService 重写如下:然而上述代码有一个大问题:但最终我们还是可以将 Spring 和 Hibernate 无缝整合,也就是说他们其实可以理解对象的事务概念。代码如下:这是怎么做到的?使用 HibernateTransactionManager 有一个非常简单的解决此集成问题的方法:相比在 Spring 配置里使用 DataSourcePlatformTransactionManager,你可以替换成 HibernateTransactionManager(如果使用了原生 Hibernate)或 JpaTransactionManager(如果通过 JPA 使用了 Hibernate)。这个定制化的 HibernateTransactionManager 会确保:与往常一样,一图胜千言(不过请注意,代理和真实服务之间的流程在这被高度抽象和简化了)。
理解 Spring 事务管理后,你应该对 Spring 框架是如何处理事务,以及如何应用于其他 Spring 类库(例如 Spring Boot 或 Spring WebMVC)有了一个很好的了解。最大的收获应是:最终使用哪种框架都无关紧要,这一切可以映射到 JDBC 的基础概念上。正确理解它们(记住:getConnection(),setAutocommit(false),commit()),在以后碰到复杂的企业级项目的使用,你能更容易抓住本质。
到目前为止,你已经对 Spring 事务管理有了全面的了解,希望你在实践中能够灵活运用这些知识,解决实际项目中的事务问题。感谢阅读。
SpringBoot从入门到精通(二十一)SpringBoot3 集成Swagger3
本文旨在指导SpringBoot3版本项目集成Swagger3的方法。首先,引入Swagger相关包至项目的pom文件。通过修改application.yaml配置文件,确保配置项matching-strategy: ANT_PATH_MATCHER,以确保Swagger能正常引入与启动。 接着,创建OpenAPIConfig.java配置类,用于配置Swagger3的基本内容。同时,增加SecurityConfig.java类以忽略Swagger的访问权限控制。默认情况下,无需配置任何注解即可实现基本功能,但添加注解能提升Swagger的可读性。 为了演示,引入SwaggerController.java配置类,用于设置具体Swagger常用注解。通过@Schema注解,可以测试和优化模型定义。验证阶段,启动服务后,通过浏览器访问http://.0.0.1:/test-swagger/swagger-ui/index.html,即可查看和使用生成的API文档。 本文总结了SpringBoot3集成Swagger3的全过程,步骤清晰,易于操作。希望本文内容对正在学习SpringBoot的读者提供实用指导,欢迎持续关注后续文章以了解更多SpringBoot及Java编程知识。若您有任何问题或建议,欢迎随时与我联系。以下是部分已发布文章链接,欢迎继续深入阅读: SpringBoot从入门到精通(一)搭建SpringBoot项目 SpringBoot从入门到精通(二)SpringBoot服务基本配置 SpringBoot从入门到精通(三)SpringBoot常见Rest接口 SpringBoot从入门到精通(四)SpringBoot接口权限控制 SpringBoot从入门到精通(五)SpringBoot连接数据库 SpringBoot从入门到精通(六)SpringBoot验证validation SpringBoot从入门到精通(七)SpringBoot集成MyBatis SpringBoot从入门到精通(八)SpringBoot集成JPA SpringBoot从入门到精通(九)SpringBoot集成RestTemplate请求接口 SpringBoot从入门到精通(十)SpringBoot集成ehcache内存缓存 SpringBoot从入门到精通(十一)SpringBoot集成RabbitMQ SpringBoot从入门到精通(十二)SpringBoot集成Kafka SpringBoot从入门到精通(十三)SpringBoot2集成Swagger3 SpringBoot从入门到精通(十四)SpringBoot读取配置文件 SpringBoot从入门到精通(十五)SpringBoot配置Logback日志输出格式 SpringBoot从入门到精通(十六)SpringBoot AOP SpringBoot从入门到精通(十七)SpringBoot Actuator SpringBoot从入门到精通(十八)SpringBoot Test SpringBoot从入门到精通(十九)SpringBoot Docker SpringBoot从入门到精通(二十)SpringBoot MongoDB SpringBoot从入门到精通(二十一)SpringBoot3 集成Swagger3 SpringBoot从入门到精通(二十二)SpringBoot3集成Keycloak单点登录 SpringBoot从入门到精通(二十三)Github Actions一键部署到服务器 ScriptRunner执行Oracle SQL脚本 SpringBoot集成Logback遇到的问题 SpringBoot基础之Spring Actuator SpringBoot基础之Spring Expression Language(Spring表达语言SpEL) SpringBoot基础之Spring Data Jpa SpringBoot基础之AOP&AspectJ SpringBoot基础之JDBCTemplate Spring Cloud基础之Discovery Service服务发现简单搭建 Spring Cloud基础之Intelligent Routing智能路由 Spring Cloud基础之Config Server配置中心简单搭建 Spring Cloud基础之Load Balancing负载均衡 Spring Cloud基础之Hystrix熔断器