皮皮网

【linux 源码目录结构】【易源码修复】【夏源码网】springboot源码翻译

时间:2024-11-25 08:36:09 分类:知识 来源:校园兼职系统源码

1.「译」Spring 事务管理:@Transactional 深度解析|by MarcoBehler.md
2.Spring官宣,SpringFramework6和SpringBoot3蓄势待发!
3.SpringBoot中的源码Swagger2如何使用?
4.springcloudstream用的多吗?
5.Spring Boot官方文档翻译

springboot源码翻译

「译」Spring 事务管理:@Transactional 深度解析|by MarcoBehler.md

       原文链接为: Spring Transaction Management: @Transactional In-Depth | MarcoBehler

       你可以通过本文,对@Transactional 注解在 Spring 事务管理中的翻译运行机制,形成一个简明实用的源码理解。

       唯一的翻译阅读前提?你需要对数据库 ACID 原则有个大致了解,即数据库事务是源码什么,我们为什么需要它。翻译linux 源码目录结构此外,源码本文没有覆盖分布式事务和反应式事务(reactive transactions),翻译尽管在 Spring 中下文提到的源码一些通用原则也是适用的。

       在本文中,翻译你将学到 Spring 事务抽象框架的源码核心概念,同时会有很多示例代码帮助你理解。翻译

       相对于 Spring 官方文档,源码本文不会让你迷失在 Spring 的翻译上层概念里。 相反你会以不同寻常的源码路径来学习 Spring 事务管理。从底层开始,一层层向上。也就是说,你将从普通原始的 JDBC 事务学起。

       普通的 JDBC 事务是如何工作的?如何 start, commit 或 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)。

       你的UserService 有一个 invoice() 事务方法。它调用了另外一个 InvoiceService 类上的 createPdf() 事务方法。然而从 Spring 看来,这里有 2 个逻辑事务存在:第一个在UserService,另外一个在 InvoiceService。Spring 足够智能知道让两个 @Transactional 标记的方法,在底层使用同一个物理数据库事务。

       更改事务传播模式为requires_new 告诉 Spring:createPDF() 需要在它自己的、独立于其他任何已经在的.net gridview 源码事务里执行。这意味着你的底层代码会打开 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 事务管理有了全面的了解,希望你在实践中能够灵活运用这些知识,解决实际项目中的事务问题。感谢阅读。

Spring官宣,SpringFramework6和SpringBoot3蓄势待发!

       SpringOne大会上宣布了一件重大的事情:SpringFramework6和SpringBoot3计划在年第四季度能够达到生产可用的发布标准。

       Spring6.0的完整发布路线图如下:

       ç®€å•è§£é‡Šä¸€ä¸‹ä¸åŒç‰ˆæœ¬çš„区别:

       M1M2M3M4中M是Milestone里程碑的意思。代表功能可能还不完整,可能存在一些问题。

       RC1RC2RC3中的RC是ReleaseCandidate的缩写,翻译过来的意思就是发布候选。代表功能完整且相对稳定,主要进行问题解决。

       GA是GeneralAvailability的缩写,翻译过来的一般可用,代表稳定可用于生产的版本。

       SpringFramework6可以说是Spring下一步重点规划的一个项目,标志着Spring进入新的时代,很大程度上关系了Spring能够沿袭过去的辉煌。

       åœ¨æ¡†æž¶è®¾è®¡ä¸Šï¼ŒSpringFramework6相对来说比较激进。SpringFramework6和SpringBoot3在运行时至少需要JDK,以及至少Tomcat/Jetty(为了与JakartaEE9兼容)。

       JakartaEE:JavaEE,Java平台企业版(JavaPlatformEnterpriseEdition),之前称为Java2Platform,EnterpriseEdition(J2EE),年3月更名为JakartaEE

       è¿™ä¸ªä¹Ÿæ˜¯åœ¨Spring官方在深思熟虑之后商定的结果。

       å› ä¸ºï¼ŒJDK在年第四季度发表之前将取代JDK作为下一个长期支持的JDK版本。同时,这也是为JDK和JDK,JakartaEE的到来做准备。

       Spring官方认为JDK仅仅是一个过渡使用的JDK版本,而JDK几乎是一个全新的编程语言,增强和完善了API和JVM,这让升级JDK成为更具吸引力的选择。

       åŽŸè¯æ˜¯è¿™æ ·è¯´çš„:“incomparison,JDKisatransitionalrelease.Also,JDKprovidesanaccumulatedsetofrecentlanguage,APIandJVMenhancements,makingitamorecompellingupgrade.”

       SpringFramework5.3.x和SpringBoot2.x暂时仍在积极开发中,SpringBoot2.6和SpringBoot2.7仍然会基于SpringFramework5.3.x。

       é¢„计会在今年月推出SpringBoot2.6,明年5月份推出SpringBoot2.7。

       SpringOne大会上还详细介绍了SpringNative的相关情况以及最新进展。

       SpringNative是什么呢?官方是这样介绍的:

       â€œSpringNativeprovidesbetasupportforcompilingSpringBootapplicationstonativeexecutableswithGraalVM,providinganewwaytodeploySpringBootapplicationsthatthenrunextremelyefficiently.”

       ç®€å•æ¥è¯´ï¼Œè¿™å°±æ˜¯ä¸€ç§ä½¿ç”¨GraalVM将Spring应用编译成原生镜像的技术,你可以将其看作是部署SpringBoot应用程序的新方法,更加高效快速!

       æ ¹æ®å®˜æ–¹ä»‹ç»ï¼ŒSpringNative的构建时间通常要长一些,不过在容器镜像大小、内存占用、启动时间上优势非常大!

       å¼ºçƒˆå»ºè®®å°ä¼™ä¼´ä»¬æ‰¾åˆ°å¯¹åº”çš„PPT(我已整理,文末领取即可)和视频看一看,讲解的非常清楚。

       ä¸ºäº†åº”对云原生时代其他编程语言的挑战,Spring表示自己正在竭尽全力打造一个强大的Java云原生生态系统。拭目以待吧!

       ç›¸å…³èµ„料:

       FromSpringFramework5.3to6.0

       AJavaandJakartaEE9baselineforSpringFramework6

作者:JavaGuide

SpringBoot中的Swagger2如何使用?

       背景

       在之前我们已经在SpringBoot项目中集成好了Swagger2组件,同时已经可以成功访问了相关的swagger-ui.html,那么现在我们就来看一下Swagger的相关注解如何使用吧。

Swagger2的一些注解应用

       先看一下官方的一些解释。

       如果有兴趣,可以自行查看这里。

       接下来我们来看一下具体的翻译信息:

注解名称功能描述@Api将类标记为Swagger资源。@ApiImplicitParam表示API操作中的单个参数。@ApiImplicitParams允许多个ApiImplicitParam对象列表的包装器。@ApiModel提供有关Swagger模型的其他信息。@ApiModelProperty添加和操作模型属性的数据。@ApiOperation描述针对特定路径的操作或通常的HTTP方法。@ApiParam为操作参数添加额外的元数据。@ApiResponse描述操作的可能响应。@ApiResponses允许多个ApiResponse对象列表的包装器。@Authorization声明用于资源或操作的授权方案。@AuthorizationScope描述OAuth2授权范围。@ResponseHeader表示可以作为响应的一部分提供的标头。

       通过这些,我们就可以对具体的类进行修饰。

       下面我们来看一下一个Demo。

@Api(tags="Demo演示接口")@Slf4j@RestController("demo")publicclassDemoController{ @ApiOperation(value="@Demo演示接口1",notes="@Demo演示接口1")@GetMapping("/list/{ name}")@ResponseBodypublicStringtest(@PathVariableStringname){ log.info(name);System.out.println("test");returnname;}@ApiOperation(value="Demo演示接口2",notes="Demo演示接口2")@GetMapping("/test")@ResponseBodypublicStringtest1(){ log.info("test");return"test1";}}

springcloudstream用的多吗?

       SpringCloudStream介绍

       SpringCloudStream是创建消息驱动微服务应用的框架。SpringCloudStream是基于springboot创建,用来建立单独的/工业级spring应用,使用springintegration提供与消息代理之间的连接。本文提供不同代理中的中间件配置,介绍了持久化发布订阅机制,以及消费组以及分割的概念。将注解@EnableBinding加到应用上就可以实现与消息代理的连接,@StreamListener注解加到方法上,使之可以接收处理流的事件。

       åŽŸç‰ˆ:

       ç¿»è¯‘:

       PS:生产者yml配置

       PS:Barista接口为自定义管道

       PS:生产者消息投递

       PS:SpringBoot应用入口

       PS:消费者yml配置

       PS:Barista接口为自定义管道

       PS:消费者消息获取

       PS:SpringBoot应用入口

       SpringCloud()——Stream介绍

       å½“我们的分布式系统建设到一定程度了,或者服务间是通过异步请求来通讯的,那么我们避免不了使用MQ来解决问题。

       å‡å¦‚公司内部进行了业务合并或者整合,需要服务A和服务B通过MQ的方式进行消息传递,而服务A用的是RabbitMQ,服务B用的是Kafka,那么我要在服务里同时使用两个消息组件吗?

       æœ‰æ²¡æœ‰ä¸€ç§æŠ€æœ¯è®©æˆ‘们不再关注具体MQ的细节,只需要用一种适配绑定的方式呢?

       å½“然有,cloudStream就解决了这个问题。

       å®˜ç½‘地址:

       å®˜æ–¹å®šä¹‰SpringCloudStream是一个构建消息驱动微服务的框架。

       åº”用程序通过inputs或者outputs来与SpringCloudStream中的binder对象交互。

       é€šè¿‡æˆ‘们配置来binding(绑定),而SpringCloudStream的binder对象负责与消息中间件交互。

       æ‰€ä»¥ï¼Œæˆ‘们只需要搞清楚如何与SpringCloudStream交互就可以方便使用消息驱动的方式。

       è€Œé€šè¿‡SpringInteration来连接消息代理中间件以实现消息事件驱动。

       SpringCloudStream为一些供应商的消息中间件产品提供了个性化的自动化配置实现,引用了发布-订阅、消费组、分区的三个核心概念。

       ä½†æ˜¯ç›®å‰ä»…支持RabbitMQ、Kafka

       åœ¨æ²¡æœ‰ç»‘定器这个概念的情况下,我们的SpringBoot应用

       è¦ç›´æŽ¥ä¸Žæ¶ˆæ¯ä¸­é—´ä»¶è¿›è¡Œä¿¡æ¯äº¤äº’的时候,由于各消息中间件构建的初衷不同,它们的实现细节上会有较大的差异性。

       é€šè¿‡å®šä¹‰ç»‘定器作为中间层,完美地实现了应用程序与消息中间件细节之间的隔离。

       é€šè¿‡å‘应用程序暴漏统一的Channel通道,使得应用程序不需要再考虑各种不同的消息中间件实现。

       é€šè¿‡å®šä¹‰ç»‘定器Binder作为中间层,实现了应用程序与消息中间件细节之间的隔离

       Binder:很方便的连接中间件,屏蔽差异

       Channel:通道,是队列Queue的一种抽象,在消息通讯系统中就是实现存储和转发的媒介,通过Channel对队列进行配置。

       Source和Sink:简单的可理解为参照对象是SpringCloudStream自身,从Stream发布消息就是输出,接受消息就是输入。

SpringCloud|消息驱动——Stream

       åœ¨å¾®æœåŠ¡çš„架构下,原有单一的应用被拆分成了多个服务,所以微服务之间的消息传递也越来越频繁。

       ä¸ºäº†è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œå°±é€‰æ‹©æ¶ˆæ¯ä¸­é—´ä»¶â€”—Stream。

       é€šè¿‡æ¶ˆæ¯ä¸­é—´ä»¶å°±å¯ä»¥å­˜å‚¨å’Œè½¬å‘微服务之间的异步数据,使得微服务之间不用直接通信,从而使微服务的应用集中在一处。

       å½“微服务A向微服务B发送消息时,若网络不可用或微服务B不在线,则消息中间件会存储消息,直到连接变得可用或微服务B恢复,消息中间件在将消息转发到微服务B上。

       è¿™æ ·å°±ä¿éšœäº†æ¶ˆæ¯çš„可靠性,同时,也避免了微服务A等待微服务B处理消息而造成等待阻塞,能够保证系统故障时消息的正常传输。

       åŒæ—¶SpringCloudStream支持多种消息中间件的整合,例如:Kafka、RabbitMQ等;继承了Spring应用的框架理念,实现基于注解驱动框架。

       1、什么是消息驱动开发

       2、SpringCloudStream简介

       3、使用“发布-订阅”模式

       æ¯ä¸€ä¸ªä¸æ›¾èµ·èˆžçš„日子,都是对生命的辜负。一个人知道自己为什么而活,就可以忍受任何一种生活。其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。

Spring Boot官方文档翻译

       为实现公司微服务监控集成,我决定通读Spring Boot Actuator官方文档并尝试翻译。然而,当我翻译至最后一章节时,意外发现网上已有多版本翻译,涵盖范围广泛,不仅限于Actuator部分。此发现令人感到疲惫,转而将其视为英语提升的途径。

       我未将拙作翻译发布,反而推荐了两位翻译大神的作品。

       版本:1.4.1.RELEASE

       版本:2.0.1.RELEASE

copyright © 2016 powered by 皮皮网   sitemap