如今,在我们的虚拟工作室中,全球春季最著名的演讲者是乔希·朗。
他的报告在世界各地开放Java会议。 是他回答了社区的问题,在YouTube上发布了Spring Tips,是我们每周阅读的“春天的这一周”等等。
顺便说一句,Josh允许使用我们自己的“ Java的本周”中的所有资料,但他的工作量和深度如此之大,以致于这些数据从未被压缩为“ 15分钟摘要”格式。
有时候,他似乎同时在所有城市中,同时阅读报告和撰写文章。 今天我们将弄清楚他是如何做到的。 我们将了解“代码管辖权”,Spring惊人生命力的原因,以及他如何在没有从头开始和其他有趣技巧进行全球重写的情况下成功地生活了这么多年。

会员

Pivotal的Spring开发倡导者Josh Long

Evgeny Trifonov,Oleg Chirukhin-JUG.ru集团编辑
每个人都知道您出差很多,但是如果您能提供一些统计信息,那就很有趣-去年您访问了多少次会议,进行了多少次航班等等。
好问题。 我有一个表,记录我当年参加的所有会议。 我的助手塔莎(Tasha)帮助我安排了时间表和这张桌子。 因此,让我们在手机上打开这款平板电脑... 240。 目前,在2018年,我参加了240场不同的活动。 其中一些会议是在网上进行的(例如我们的会议),但我必须飞往大多数。 在这一年里,我飞了半百万英里。 让我检查一下地球到月球的距离……这是23.9万英里,这样我就可以飞向月球并返回。
“到月球,然后从春天回来。” 托尔金的书的好标题。
航空公司会因为您飞行太多而为您提供特别优惠吗?
好吧,我不抱怨这项服务。 我经常和联合航空一起飞行,他们有一个全球服务计划。 您只能通过收到邀请才能到达那里-您自己不能自己索要邀请,而且邀请的标准是未知的。 每年,他们都会邀请飞行次数最多的人。 去年,有人说他们选择了全球1%的最常客。 或者,它们可能会根据成本进行过滤。 一种或另一种,他们对我很好。 很好 但是即使在这种情况下,我认为对于大多数人来说,飞行也是一个负担。 这肯定让我担心。 我不是自己去飞行,而是去认识使用Spring的人。 如果有这样的机会,我会传送。 生活会更简单,更有趣。
等待Hyperloop的充分理由。
是的,但这将需要等待很长时间。
让我们谈论一个更接近Spring的话题。 您与世界各地的人们谈论它-流行程度是否存在地区差异?
我不会说。 Spring一直都是100%开放源代码,只要人们编写可在Internet上运行的软件,Spring就会在世界范围内继续取得成功。 的确,还有其他一些开放源代码项目,在这些项目中区域性很明显。 我现在无法确认统计数据,但是在我看来GridGain在俄罗斯非常普遍。
是的,这是真的。
在中国,MyBatis非常受欢迎。 在美国和欧洲,我已经十年没有见过它了,而在中国,它和春天一样普遍。 而且,事实上,MyBatis没什么问题,它既快速又强大-那么为什么不使用它呢?
我们做了一个MyBatis与GridGain一起工作的项目,它位于内部。
(笑)所以您同时使用它们-太好了! 我喜欢这两种技术。 MyBatis没有正常的支持,我经常问中国各家做得很棒的大型公司-为什么他们需要Spring的MyBatis? 还有很多其他选择,Hibernate表现很好,而西方几乎不使用MyBatis。 结果,我决定一旦使用了该程序,就必须确保其正常运行。 如果现在看一下MyBatis的Spring Boot Starter源码,您将在这里看到我的名字。 我希望东部需要此程序的人能够正常使用它。 总的来说,我工作的很大一部分来自我在旅行中在不同国家/地区发现的那种东西。
您是Spring项目的Pivotal Developer Advocate。 在实践中这意味着什么? 你到底在做什么
一个棘手的问题。 由于苹果,尤其是微软,Developer Advocate的概念得以传播。 它始于大约30年前,当时微软意识到只有开发人员才具有真正的实力。 如果您希望平台成功且有用,则需要开发人员在此平台上创建新的有价值的东西。 因此,您必须使他们相信平台的好处。 微软开始尝试以多种不同方式激励开发人员。 他们使Visual Studio非常便宜,也就是说,他们提供了负担得起的工具。 他们创建了许多非常有趣的API,您可以在Windows下使用它们。 总体而言,Microsoft意识到有必要与社区合作。 人们不信任软件,但是信任其他人。 人们对软件没有情感上的依恋。 您可以想象到只要在旅馆房间里独自编写一个程序就能成名,任何需要它的人都可以自己找到文档。 但是实际上这通常不会发生。 我的主要职责是与社区中的人们进行沟通。 我听别人说,然后将其带给开发人员,然后将开发人员的意见传达给社区。 换句话说,我是一种交通工具。
Spring团队很奇怪很漂亮。 她已经有十五年半了。 起初,她很小,开发人员本身也从事咨询工作。 他们不断与其他团队合作,帮助他们创建自己的软件,也就是说,他们解决了实际问题,并且没有坐在象牙塔中。 他们没有假装自己事先知道需要什么软件,而是写了其他人真正需要的软件,而他们的利益始终是他们的主要标准。 他们与客户分享了他们在解决问题上的痛苦。 我们不会创造无用的东西。 如您所知,这在创建软件时通常是一个问题。 实际上,第一支Spring团队已经由Developer Advocates组成。 它们与程序员通常代表的不相似。 是的,他们是才华横溢的开发人员,但与此同时,他们也热切地与其他人讨论他们的想法,参加演示,结识朋友,结识并进行对话。 因此,Spring迅速获得了广泛的欢迎。
问题在于这种方法无法很好地扩展。 所有开发人员都不可能将一半的时间花在旅行,聊天和开会上。 加入团队时,我已经在为Spring编写代码,因为它是一个开源项目。 另外,我已经出版过书籍,写过文章并做过演讲。 因此,我已经尽力将Spring尽可能地介绍给社区,并为尽可能多的人提供了解Spring的机会。 因此,Spring团队邀请我做同样的事情,但是要持续不断并且要花钱。 我认为我是80%的Developer Advocate和20%的程序员,而其余的Developer Advocate团队是20%和80%的程序员。
总而言之,我的工作是与社区保持联系,并且有许多不同的方法可以做到这一点。 我正在写我的第六本书,叫做The Reactive Spring Book; 我的上一篇是由O'Reilly发布的,名为Cloud Native Java。 我制作了很多视频教程,您可以在Safari Books Online上观看,每个过程需要4-5个小时。 此外,每个星期三,我都会在YouTube上发布Spring Tips视频 ,每个视频都专门针对生态系统的特定方面。 它们通常持续45分钟到一个小时,每年我至少要做两个季节,有时三个。 因此,每年,我每两周准备一次足够的材料,以便在会议上发表完整的报告。 从2011年1月开始,每个星期二无一例外,我都会新建一个博客条目“春季这一周” ,在其中,我回顾了生态系统中所有最有趣的内容。 我还有其他博客,最近两个晚上我一直在这样做。 除此之外,我还编写代码并在会议上发言。 因此,我的工作包括各种各样的活动,但我很可能只限于一件事。 有些人只是写博客或制作视频,他们做得很好。 有些人甚至不旅行,而是在线进行研讨会。 我的方法与其他方法不同,但是最终,所有这些活动都追求相同的目标。
顺便说一句,我的职责还包括制作教程,撰写博客等。 对我来说,这很困难,可能需要花费任意时间。 这给你有多难? 假设准备一部Spring Tips视频需要多长时间?
我忘了说-我有一个新的播客,到目前为止还没有任何消息,但是已经准备了七个采访:-)至于准备时间,它以不同的方式发生。 如果我已经熟悉了我决定涵盖的主题,那么我只需要坐下来记录所有内容两次或三遍-我总是会犯很多错误。 每周一次大约需要四个小时,即很少。 但是在其他情况下,这还不够。 有时,我研究一个问题并记下问题很多月,然后决定既然这项工作已经完成,为什么不制作这些笔记的视频。 我一直在学习,就像你可能正在学习的那样。 但是很少需要专门学习视频的情况。 这里最难的部分是决定您需要坐下来研究该主题的内容,而不是学习过程本身。
有时,我们团队的程序员会发布以前没有人创造过的东西。 在这种情况下,人们当然会有疑问,而这些问题将默认属于程序员。 我可以制作一个视频,在其中说明所有内容,然后将其预先上传到网络上,以便人们有时间互相了解。 显然,在这种情况下,我还必须学习-因为我们正在谈论的是全新的东西。
春季目前有多少个项目?
好问题。 我想几个。 有非常专业的模块,其中一些是由社区开发的,一些是由Pivotal的Spring团队或其他大型公司开发的。 对Google GCP的所有支持均在Google中进行,对Microsoft Azure的支持-在Microsoft中。 但是社区正在开发很多东西,例如MyBatis。 另外,我们有单独的模块,例如Spring Data Neo4j,它是Neo4j图形数据库的模块。 它是Spring Data项目的一部分,但是它是与Neo4j合作完成的,他们完成了该项目的主要工作,他只是住在我们的git仓库中。 有很多这样的例子。
至于Spring Boot,我们有一个很棒的机制叫做自动配置。 它为人们提供了一种方便的方式来将他们将要从事的工作分组。 该人员只需将JAR文件下载到他的类路径中,然后它将自动添加到正在运行的Spring Boot App中。 生态系统中有很多这样的自动配置,我只是不知道其中的重要部分。 它们像插件一样工作。
以及如何了解各种项目中的用户? 有一些一般的结构或想法吗?
最有可能的是,您不需要所有项目。 指定目标,然后根据目标选择所需的项目。 当人们尝试“学习春天”时,我不喜欢它-这是没有意义的练习。 这个问题应该是这样构成的:我需要编写一个REST API。 我的第一步是前往spring.io/guides ,在这里您可以找到耗时 10至15分钟的简单且价格合理的指南。 它具有您需要知道的所有内容:要编写的代码,在哪个文件夹中,如何在IntelliJ或Eclipse或其他方式中进行编写。 我们尝试详细解释所有内容,并且不遗漏任何内容,因为我们希望每个人都可以使用这些指南。 无论您做什么(JMS,Neo4j,安全性,断路器,Kafka),我们都会为每个主题提供单独的指南。 确定您的任务并选择适当的指南。 您不需要考虑Spring,而应该考虑与系统集成什么-Spring只是允许进行这种集成的工具。 因此,“学习Spring”没有意义-如果可以简化您的特定任务,则需要使用它。
您认为Spring中哪些项目最有前途? 还是最被低估的?
Spring Retry库非常受欢迎。 它最初是在Spring Batch上开发的。 我不知道您是否曾经使用过Spring Batch,它可以让您处理大量顺序传输的数据,例如文件系统中的文档,XML,CSP文件等。 在此工具的一个用例中,您读取了一条记录,然后将其写入-例如,从Web服务到消息队列。 处理这些数据可能要花费几个小时,如果系统由于最后的一个错误而将夜间完成的所有工作回滚,那将是非常不希望的。 你不能那样做。 Spring Batch处理数据包;它不处理记录,而是处理十或一千条记录。 即使丢失了成千上万条记录的处理,其余所有记录也将被保存。 此外,在编写软件包系统时,需要记住,您需要访问其他可能失败的服务。 为此,有Spring重试。 该库使您可以重复调用服务。 此外,您可以使用指数快门速度。 除了Spring Batch,Spring Retry还用于Spring Integration,Spring Cloud Stream,Spring Cloud Data Flow。 在最后两个中,我们支持Spring Retry,因为它与其他一些东西有关。 因此,该库已在许多Spring项目中使用,我不确定每个人都知道这一点。 Spring Retry是一个非常常用的库,有时会被忽略。 通常,我们有许多不同的反应性事物。 它们通常是最有趣的。
为什么要完全重新激活?
我们到处都有反应。 Spring的优点是您可以用它开始和结束一个项目。 本周,我们宣布将支持Facebook RSocket项目。 这是gRPC的完全反应性类似物,但更加灵活。 它可以用于发布/订阅,流数据,客户端请求/响应-通常,使用它可以实现许多不同的消息传递模式。 它用于Facebook。 有两个捆绑软件,一个捆绑在C ++中,另一个捆绑在Java中。 用Java编写的代码是使用我们的反应式库Reactor编写的。 她使用Salesforce。 当然,还有其他选择。 您听说过Google的gRPC吗? 它的质量很高而且很有趣,但是它不是反应式的,默认情况下,它不适用于反应式类型。 Salesforce gRPC没有此缺点。 他有一个基于Spring Reactor创建服务的编译器。 因此,Facebook和Salesforce都能根据自己的需求扩展Reactor。
反应堆本身是我们最有趣的项目之一。 RxJava较早推出,但Reactor是第一个提供反应式线程支持的人。 这主要是因为出色的程序员RxJava项目经理David Karnock与我们一起在Reactor上工作。 因此,在我们的生态系统中发生的所有新的有趣事物中,很大一部分都以某种方式触及了Reactor。 由于这个原因,该项目对创建大型系统的公司变得非常有吸引力。 Reactor也是Spring WebFlux框架的基础。 此外,基于Reactor,我们支持了响应式消息传递,响应式Web套接字,Spring Cloud Stream,响应式断路器等-所有这些组件都可以集成到响应式应用程序中。 当然,您可以只使用Spring,但我更喜欢将整个生态系统与这些反应类型一起使用。
除此之外,我们最近还发布了有关R2DBC的公告-R2DBC是我们的API,用于为反应性驱动程序访问基于SQL的数据。 反应性JDBC尚不存在。 问题在于,如果您使用反应式代码,那么您将无法使用锁。 如果使用锁定,则必须扩大此交互,从而增加线程数。 这与最初的目标相矛盾,因为我们只是想通过增加线程数来避免扩展-这太昂贵了。 因此,R2DBC提供了提供反应性数据访问的抽象。 有些数据库驱动程序最初是反应性的,例如Postgres。 因此,您可以将R2DBC与Postgres一起使用,并在不使用锁的情况下使用响应式SQL,因为您没有线程。 这整个主题对我来说似乎非常有趣。
也许您可以回答一些常见的技术问题? 问题之一是,当使用多个Spring项目时,会同时出现许多注释。 弄清它们各自的作用变得很困难-您不能在按住Ctrl的同时单击并转到定义。 在这种情况下如何表现?
它应使用--debug选项运行。 现在,大多数Spring生态系统都以自动配置形式存在。 某些部分就像一个导入的配置,如果在这种情况下,单击注释,您将看到题名“ @ Import”,然后将指示其类别。 如果然后单击它,将看到为您创建的那些对象。 但是有时候Spring通过自动配置机制起作用-在这种情况下,不会创建任何注释。 只有一个库和类路径。 然后,很难弄清正在发生什么以及为什么。 但是我们想让人们尽可能容易地弄清楚这一点。 为此,有一个--debug参数,在应用程序启动时必须输入该参数。 然后,您将看到一个报告,其中将描述应用程序在启动时执行的所有步骤。 该应用程序检查是否存在某些字段或类,并据此决定是否为其创建一些对象。 该报告向您显示满足哪些条件,不满足哪些条件,以及哪些配置不依赖任何检查。 因此,如果说,您只是不明白为什么与Kafka的连接不起作用,则可以查看相应的条件-也许您在类路径中没有必需的类。
现在将有一个小问题。 Spring的反对者经常声称这是低质量体系结构的原因,因为您可以在任何地方使用@Autowired
。 您是否同意这种观点? 十年前,该体系结构是在三层中创建的,值从构造函数转移到构造函数,并创建了DTO。 使用Spring,您可以摆脱所有这些。 是好是坏?
弹簧是一种工具。 它使更多的人可以创建可以正常生产的软件,并且可以正常工作,因此我认为这没有害处。 近年来,数以百万计的人已经使用它创建了应用程序,并且一切正常。 认为Spring总体上是有害的是荒谬的,这样的观点不能被称为无知。
在Spring中,您可以创建非常明确的接线。 如果您担心不清楚给定对象的来源,可以自己绑定它。 您可以创建一个Java配置,其中一个方法将调用另一个方法,被调用方法的输出值将是bin-Spring会照顾它。 即使您反复或多次调用同一个bin,如果此对象是单例对象,您也永远不会有多个链接。 您希望一切都明确-可以做到。 如果愿意,可以转向一个更无聊的选项-XML。 底线是,如果您不想使用“ @ Autowired”,则可以完全避免。
如果您以最普通的方式使用Spring Boot,那么您将只有一个bean。 您知道您需要类型为ConnectionFactory的bean-在这种情况下,按类型进行注入没有问题。 您仍然只有一个对象,一个连接将没有两个`ConnectionFactory`。 您不会有两个Hibernate会话,因此不会阻止您注入`HibernateSession`-它仍然存在于一个实例中。 如果您希望所有内容都是明确的,则可以使用`@ Qualifier`注释。 使用它,您可以按类型标记要注入的内容。 这将使彼此区分各种bin实现成为可能。 假设您拥有一项服务,通过该服务,一个地方的应用程序可以与iTunes通讯,而另一个地方的应用程序可以与Android – PlayPlay的商店进行通讯; 这将是三个具有不同类型的不同bean,但是每个bean都将具有注解@@ Qualifier。 此外,该注释可以叠加在另一个注释上,从而确保类型安全。 您将绑定此类型,并在其顶部具有注释,并且在创建Bean时,它将具有“ @ Qualifier”注释,包括在消费者的网站上。 因此,这些注释将为您提供链接,即使在程序运行时有三种实现,您仍然可以找到所需的一种。
就是说,总的来说,灵活性是一个积极的功能。 您和Spring团队是否遵守Zen Zen等一些基本原则?
是的,坚持。 顺便说一句,自90年代末以来我一直在使用Python编程,而我是Python Zen的大力支持者,他有一个非常正确的总体思路。 关于您的问题,在这里您需要谈论Spring的联合创始人JürgenHöller和从事该项目的第二位开发人员。 这是一个可爱的人,非常安静,是我必须与之沟通的最好的人之一。 例如,如果您在会议上认识他,与他交谈非常容易。 同时,他拥有强大的才智,他对Spring的贡献很难被高估。 JAX会议-非常重要,尽管当然还没有达到Joker :)-为他授予了一项特别奖项,以表彰他以前没有人获奖。 通常,奖项是在某些特殊类别中颁发的,但是这一奖项没有类别,仅属于于尔根。 Spring是Java生态系统中唯一一个在15年内从未进行过重写的项目-因为没有必要。 一般而言,于尔根(Jürgen)对如何编写模块,如何表达类型有一个非常清晰的想法-如何创建可以生存数十年并且可以在必要时轻松更改的高质量代码基础。 Java生态系统中没有其他此类项目。 这些项目的很大一部分已不复存在,即使在那些从头开始重写的项目中,也只有很少的项目可以使用15年。
不用重写,只有Spring持续了15年,因为它从一开始就写得很干净。 于尔根教会了我们遵循的一些基本原则:如何制作模块,如何制作实现程序包(与公共部分相对),如何描述API的表面级别及其设计类型,应使用哪种模式。 使用Spring,您不可避免地会熟悉设计模式,而且一直如此。 马上想到一个模式模式的例子。 Spring Integration向您介绍企业集成模式,Spring MVC介绍MVC。 所有这些模式都是框架的一部分,我们将基于成熟的实践来使用它们。 我们的禅宗是于尔根教导我们的原则。 在这方面,我们都是他的学生。 于尔根(Jürgen)因其编写代码的方式有些怪异而闻名-因为他的举止甚至出现了一个特殊的术语“ jurgenize”。 我们的团队有很多非常聪明的人,有着丰富的经验,其中一些人已经拥有学位和秃头补丁。 尽管如此,于尔根还是对自己的代码进行了更改。 有时候,它有点像添加空格,清理之类的事情,但有时,它可以从头开始重写代码一千次,同时它并不会改变代码的作者身份,即以原始作者的名义提交。 在这种情况下,据说该代码是“合法的”,也就是说,它已对其进行了修复。 多亏了于尔根,我们的代码很干净。 对于代码分析工具,由于存在非常干净的代码,因此在Spring中至少发现某种故障被认为是高品质的标记。 总的来说,我现在无法详细阐述我们的原则,但是这些原则已经存在,由Jürgen制定,所有Spring项目都遵循它们。 对于Spring Boot,我们有创建模块的非常精确的规则,我们将其称为启动器。
好的,谢谢您的回答。 我的最后一个问题是性能和Java11。据我所知,Spring总是在运行时生成上下文。 在某些旧的银行程序中,这可能需要几分钟到几个小时。
来吧 我不相信
老实说,用我自己的眼睛看。
但这不可能是Spring。 最有可能的是,Hibernate在那里做了一些可怕的事情。 可以生成数百万个Bean,可以编译并运行一个空Bean。 从数据库加载信息,进行验证等等需要时间,这可能会导致Spring延迟。 但是Spring本身非常快。
是的,我认为Hibernate确实有些恐怖。 尽管如此,Spring的启动时间是30秒,有时是一两分钟-仍然是相当长的时间,您认为吗? 例如,如果我们在Docker上运行它,那么我们需要立即启动该容器。 是否可以减少Spring启动时间?
启动Spring不到两秒钟。 借助Spring Cloud Function,此时间可以减少到半秒或更短。 我们的项目可以在半秒内顺利运行-例如,Spring Cloud Function中的Spring Boot。 因此,问题又不在春季,而是在对他们执行的操作中,在后台发生的事情-您是否可以访问Internet上的另一个数据源,是否从Internet下载文件,是否将数据上传到网格。 如果您所要做的只是小型微服务,那么您的系统应该运行得非常快。 如果您的应用程序运行时间很长,则可能是有问题。
知道了 顺便说一句,您听说过GraalVM和AOT吗?
是的 我会告诉你更多:我们有一个Spring Fu项目。 他具有实验性,我从Spring Tips系列中拍摄了一段有关他的视频 。 我们在Kotlin上编写了它,现在它具有Java API。 该项目是为GraalVM等环境创建的。 Spring Fu不使用动态生成的代理或“ @配置”。 GraalVM中的本机图像生成器需要知道将要加载哪些类。 但是,如果您使用cglib或Byte Buddy进行动态加载,那么使用GraalVM将会很困难。 Hibernate,Spring和所有其他使用动态生成的代理的库都不太适合创建本机映像。 因此,在春赋中没有这样的东西,这是直接说明的。 它仍然使用Spring,但是构建应用程序的方法不同。 Spring Fu的优点之一是,它与GraalVM可以很好地协同工作。 现在,该应用程序立即启动。 我的意思是,通常立即:一旦完全记入内存! 应当记住,GraalVM中的本机图像生成器仍处于开发的早期阶段。 因此,有时会出现困难,因为在人们看来,由GraalVM启动的应用程序将立即非常快速地开始加载,并且在运行时速度将与以前相同。 但这不是那样,因为在GraalVM运行时中,您不再使用JVM,系统的行为将有所不同。 因此,请对该项目进行健康测试,但请记住,这不是免费的启动加速。 但是,我对GraalVM感到很高兴,他们的团队付出了很多努力来使其更好地与框架一起使用。
当然,我的最后一个问题是关于Java 11的。
是的,她很漂亮。
对Spring有什么用?
对于Spring开发人员,我们选择该技术或该技术有两个主要标准:1.是否适合业务需求; 2.是否适合我们作为程序员。 至于第一个标准,该技术是否提供更高的速度,稳定性,是否具有长期支持。 Java 11中提供了所有这些功能。 对Java 8的支持将很快终止,因此有长期支持的情况下升级到下一版本是有意义的。 顺便说一句,我的朋友们,如果您升级到下一个版本,请使用OpenJDK程序集-每种方式都很棒。 正确的版本很容易获得,我已经在Twitter上写过。 这个版本在Spring上运行得很好-它很稳定。 您至少现在可以转到https://start.spring.io ,生成一个新项目,选择Java 11,它将可以正常工作。 IntelliJ和Eclipse中均提供Java 11支持。
至于第二个标准,对于Java 11中的Spring开发人员而言,没有重大变化。 很好,`var`和HTTP Client出现了,但是Spring已经有了一个响应式WebClient,所以我不确定我们将从HTTP Client中受益。 Java 10和Java 9中添加了一些方便的功能。此外,可以将Java程序作为脚本运行-这还不错。 我不确定用Spring进行此操作是否有意义-尽管另一方面,为什么不这样做呢。 情况如何,我不知道。
Spring很难转换到Java 11吗?
不行 Spring的核心是高质量的图书馆和生态系统。 请记住,Spring框架本身支持类路径和模块路径,但是我个人不建议使用模块路径。 为了正确使用它,其他所有内容也必须支持modulepath。 而且这还不可能,现在在库中提供模块路径支持的人太少了。 类路径模式工作得很好。 我们在使用CGLib,AspectJ和JAXB XML库时遇到了非常标准的问题,而每个人在切换到Java 9时都遇到了这些问题。所有这些问题都在去年左右得到解决,因此,我们可以轻松地过渡到Java 11。
顺便说一下,我们正在为Java的未来版本计划很多有趣的事情,例如,Loom项目是Java的纤维。
将在Java 12中使用吗?
很可能不会,他们将在相当长的一段时间内执行此操作。
Kotlin还使用协程,因此这个项目对我们来说非常有趣。 每当他出来时,他都会受益匪浅。 表达反应性管道而不创建反应性代码的能力非常重要。 我个人很期待多行String的出现。 也许这不是向我作证的最佳方法-我有很多需要大量行的代码,例如SQL查询等。
这是因为您有很大一部分代码针对幻灯片演示进行了优化。 在报告期间的幻灯片上,将整个字符串显示在屏幕上将很方便。
是的,否则很难阅读。 在IDE中,它们看起来会好得多。 同样,Python,Kotlin,Scala,Groovy-过去20年中的任何语言都提供了多行String支持。 我认为这很自然。
也许您想给我们的读者一些建议? 它可以涉及Spring或Pivotal,也可以涉及整个Java。
与任何技术一样,Spring的最好之处在于其社区。 从技术上讲,Spring是一组非常有趣的项目,但是它长寿的秘诀是一个很棒的社区。 如果您需要与难以忍受的人交流,则没人需要您的出色软件。 因此,我们尝试变得尽可能友好。 我们的开发人员(包括项目经理)在Stack Overflow上回答问题,并在其中关注各种标签。 我们在Gitter上有聊天室,其中的每个聊天室都对应于GitHub上的存储库。 例如, https://gitter.im/spring-projects/spring-boot 。 在这里,您可以找到Spring开发人员,并提出您感兴趣的问题。
人们经常问我如何帮助该项目,如何开始为Spring编写代码。 GitHub上的“理想贡献”等标签存在很多问题。 我们对每个人都很高兴,但是并非所有项目都适合每个人,有些错误比其他错误更复杂。 因此,如果您想与我们合作,请查找这些标签并寻求帮助。 这就是我们社区的增值方式。 我们重视帮助改善生态系统的每个人的工作。
分钟的广告。 Josh Long在Reactive Spring演讲中出席了Joker 2018会议。 门票可以在会议的官方网站上购买。