Spring Batch - java 配置与 xml

2023-12-23

我已经使用 Spring Batch 的 Xml 配置一段时间了,感觉它更简单、简洁。然而,如今,人们建议使用 javaconfig 而不是 xml。我用谷歌搜索了这个话题。

这个网站告诉我们为什么 javaconfig 更好https://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-1-a-comparison-to-xml/ https://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-1-a-comparison-to-xml/

选择 javaconfig 而不是 xml 的主要原因:

  1. 我们想要在框架中做一些基本的配置。人们添加 对我们的框架库的依赖并导入它们 根据自己的需要进行配置。如果这些配置 是用 XML 编写的,他们很难打开它们 看看他们在做什么。在Java中没问题。
  2. XML 中没有导航性。这可能没问题,只要你 没有太多 XML 文件并且所有这些文件都在您的工作区中, 因为这样您就可以利用 Spring IDE 支持。但一个 框架库通常不应作为项目添加到 工作区。当使用基于Java的配置时,你可以完美地 跳转到框架配置类。我会更多地谈论 这个主题在下面的博客文章中。
  3. 在框架中你经常有需求 图书馆的用户必须满足才能使一切 工作,例如需要一个数据源,一个 PlatformTransactionManager 和线程池。实施情况 从框架的角度来看并不重要,他们只需要 到那里。在 XML 中,您必须编写一些文档 框架的用户,告诉他们需要添加这个和这个以及 此 Spring bean 在此名称下添加到 ApplicationContext。爪哇语 你只需编写一个描述该合约的界面,然后人们 使用库实现该接口并将其添加为 ApplicationContext 的配置类。这就是我所做的 与接口。

这个网站告诉我们为什么 xml 更好https://dzone.com/articles/consider-replacing-spring-xml https://dzone.com/articles/consider-replacing-spring-xml

选择 xml 而不是 javaconfig 的主要原因

  1. 配置是集中的,它不会分散在所有不同的组件中,因此您可以在一个地方对 bean 及其连接有一个很好的概述。
  2. 如果您需要拆分文件,没问题,Spring 可以让您做到这一点。然后,它在运行时通过内部标签或外部上下文文件聚合重新组装它们。
  3. 只有 XML 配置允许显式连接——而不是自动连接。有时,后者对于我自己的口味来说有点太神奇了。它表面上的简单性隐藏了真正的复杂性:我们不仅需要在按类型和按名称自动装配之间切换,更重要的是,在所有符合条件的 bean 中选择相关 bean 的策略逃脱了经验丰富的 Spring 开发人员的责任。配置文件似乎使这变得更容易,但它相对较新并且很少有人知道。
  4. 最后但并非最不重要的一点是,XML 与 Java 文件完全正交:两者之间没有耦合,因此该类可以在具有不同配置的多个上下文中使用。

我的结论是,如果您要创建独立的批处理作业并且不通过与 Spring Batch 集成来创建任何新框架,则仍然可以使用 xml。

我错过了 xml 的任何缺点吗?


让我就这个主题添加一些额外的想法。

使用 javaconfig 时我真正喜欢的是动态创建作业的能力。例如,您可以有一个带有文件名的输入参数,然后创建一个作业,通过为每个接收到的文件名创建一个步骤来并行执行读取和处理该文件。 (使用 MultiResourceItemReader 将按顺序执行此操作)。此外,根据输入参数,您还可以不同地定义作业流程。

我对您选择 xml 而不是 javaconfig 的原因的看法: 第1点:我认为这并不重要。您可以拥有自己的配置类,可以定义自己的包。您甚至可以将它们放入自己的模块中。这只是一个问题,你如何组织你的代码。

第2点:同样,这也不算数。您可以根据需要将配置拆分为多个类。您可以使用 @Import 和 @ContextScan 注释将您想要的内容集成到您的上下文中。

第 3 点:如果您通过类而不是接口进行自动装配,那么自动装配也可以非常明确。而且,还可以直接调用@Bean注解的方法。一个例子:

@Configuration
public MyBeanFactory {
   @Bean
   public MyBeanInterface bean1() {
       return ...;
   }

   @Bean
   public MyBeanInterface bean2() {
       return ...;
   }
}

@Component
public MyBeanuser {

  @Autowired
  private MyBeanFactory beanFactory;

  @PostConstruct
  public void afterPropertiesSet() {
     // this will actually set the bean that was created an registered in the
     // spring context and not simply call the the method and create a new
     // instance. So  this wiring is very explicitly
     setProperty1(beanFactory.bean1());
     setProperty2(beanFactory.bean2());
 }

最后,我想这也是一个品味问题。我在 Spring Batch 的背景下使用 xml 配置已经超过 5 年了。两年前,我们完全改用 javaconfig 而不是 xml。老实说,我还没有找到任何一个理由让我想回去使用 xml。然而,这是我的“品味问题”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Batch - java 配置与 xml 的相关文章

  • 如何使用 IO Codenameone 发布图片/图像

    因为 codenameone 不能使用外部库 HttpConnection 所以我必须使用 Codenameone 提供的内部库 API 只是我已经设法使用 ConnectionRequest 将数据发布到格式化文本 字符串 我想知道是否有
  • 使用SimpleMailMessage类发送邮件时如何使java字符串着色

    我正在使用 java 中的 SimpleMailMessage 类发送邮件 我将 spring 与 hibernate 结合使用 我想在发送邮件时将特定字符串设置为彩色 Code String emailBody Dear username
  • java中如何围绕另一个移动对象旋转一个对象?

    我对 Java 很陌生 想要编写一个简单的太阳系统 其中月球绕地球旋转 地球绕太阳旋转 一切正常 除了月亮不想正确移动 由于地球偏离月球的初始位置 月球的自转半径会根据该距离而增大 同样 当地球接近月球惯性位置时 自转半径会减小 如果初始位
  • 仅使用 ServletContext 查找应用程序的 URL

    我正在使用 Spring MVC 编写一个 Java Web 应用程序 我有一个后台进程 它会遍历数据库并查找必须通过电子邮件发送给我的用户的通知 这些电子邮件需要包含应用程序的超链接 对于网络应用程序来说 这似乎是相当常见的模式 但我遇到
  • Android - Java - 发送 facebook 聊天消息的意图(facebook 禁用 xmpp)

    Facebook 已弃用 xmpp API 有没有办法打开意图 或将数据传递到fb 以在Android设备上发送聊天消息 设备上安装的 Facebook 和 Messenger 应用 谢谢 您需要将 uri 传递给意图 这里10000572
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • 如何用java对jpg进行像素化?

    我正在尝试使用 Java 6 对 JPEG 进行像素化 但运气不佳 它需要使用 Java 而不是像 Photoshop 这样的图像处理程序 并且它需要看起来像老派 像这样 有谁能够帮助我 使用java awt image javadoc h
  • java.sql.SQLException: - ORA-01000: 超出最大打开游标数

    我收到 ORA 01000 SQL 异常 所以我有一些与之相关的疑问 最大打开游标是否与 JDBC 连接数完全相关 或者它们也与我们为单个连接创建的语句和结果集对象相关吗 我们正在使用连接池 有没有办法配置数据库中语句 结果集对象的数量 如
  • 使用 javax.mail 和 CentOS 的邮件服务器

    我有一个 Java 程序 安装在一台旧的 Ubuntu 机器上 并使用 javax mail 发送邮件 然而 那台机器宕机了 我现在在新的 CentOS 机器上运行相同的 Java 应用程序 但是 当我尝试使用 mail smtp host
  • 如何在最短的时间内克隆java中的输入流

    有人可以告诉我如何克隆输入流 并花费尽可能少的创建时间吗 我需要多次克隆输入流以使用多种方法来处理 IS 我尝试了三种方法 但由于这样或那样的原因 事情不起作用 方法 1 感谢 stackoverflow 社区 我发现以下链接很有帮助 并将
  • java3d 中的面部着色

    使用java3d 如何不在每个顶点基础上着色 而是在每个面基础上着色 我尝试学习 java3d 但我生成的 Shape3d 看起来并不符合预期 我想用不同的颜色给不同的三角形着色 但我不知道该怎么做 纹理看起来有点大材小用 而且我根本没有掌
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • 无法运行简单的 doclet 程序:包 com.sun.javadoc 不存在

    我正在尝试运行一个简单的 doclet 程序 但无法编译它 javac cp cygdrive c Progra 2 Java jdk1 8 0 65 lib tools jar A java 但它抛出 A java 1 错误 包 com
  • 如何实现再次播放功能?

    我希望在游戏结束时得到提示 如果我还想再玩一次的话 并使用 Y N 输入 退出游戏或重复游戏 我该如何以最有效的方式解决这个问题 编辑 描述资源路径位置类型 类型 Main Main java ScaredyCat src se grupp
  • 在调试模式下,哪些代码更改会自动反映在 Eclipse 中?

    我使用 eclipse 用于编写 调试 作为 IDE 在调试模式下 当我进行一些更改 例如初始化局部变量 时 它们会自动反映 但其他更改例如更改静态变量的值 有时我会收到一条消息 说我需要重新启动虚拟机 有时则不需要 现在的问题是哪些类型的
  • Google OR-Tools:无法运行 java 示例,java.lang.UnsatisfiedLinkError:java.library.path 中没有 jniortools

    我是java新手 我想尝试google or tools来解决车辆路由问题 只是尝试运行 java 示例here https developers google com optimization introduction run progr
  • SAXParseException:找不到元素“定义”的声明

    我对 camunda 和 DMN 完全陌生 我试图在 spring boot 中运行 DMN 示例 链接在这里 https github com camunda camunda bpm examples tree master dmn en
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多
  • 1° 夏令时 Java 和 JS 表现出不同的行为

    假设巴西利亚 GMT 0300 夏令时于 21 10 2012 00 00 00 此时时钟应提前一小时 Java new Date 2012 1900 9 21 0 0 0 Sun Oct 21 01 00 00 BRST 2012 Chr
  • Spring JMS开始根据请求监听jms队列

    Spring提供 JMSListener用于监听来自特定队列的消息的注释 还有一个替代方案实施JmsListenerConfigurer http docs spring io spring docs current spring fram

随机推荐

  • 将列数据映射到值 (Oracle)

    我有一个 Oracle 数据库 并且有一个名为Car 我可以选择Mileage像这样的汽车 SELECT MILEAGE FROM CAR 这给了我 100 500 1000 etc 但是 我希望 1000 以上的值标记为High其余的为L
  • 如何在spaCy中强制使用某个标签?

    我正在使用 spaCy 3 0 0rc2 与定制模型 不幸的是 我的训练数据的连字符 较少 因此连字符经常被标记为NOUN 有什么方法可以强制某些tag or pos 以确保all the 令牌被标记为PUNCT 基本上我正在寻找一个像在这
  • 如何处理 AOSP 存储库同步上的curl clone.bundle 错误

    从 AOSP 下载 master 分支后 出现以下错误 curl 22 The requested URL returned error 404 Not Found Server does not provide clone bundle
  • 如何使用机器人框架在多个 Facebook 页面上使用同一个机器人

    我有几个 Facebook 页面 我想在每个页面上运行相同的机器人 我正在使用机器人框架 现在一页的一切都完美运行 如何关联多个页面 当您调用 Facebook Send API 时 您通过access token范围 您可以通过修改此访问
  • 递归调用函数对象

    如何从函数对象内部调用函数对象 看来我不能使用this 例子 class factorial public int operator int n if n 0 return 1 return n n 1 我该放在什么地方 include
  • 对于如何使用 VB.NET 在 ASP.NET 中创建按钮单击事件,为什么选择私有与受保护?

    我从来没有认真思考过一些事情 但我很好奇并且想了解实际的推理 在 ASP NET 中使用VB NET 您可以通过 2 种不同的方式定义连接按钮单击事件 到 ASP NET 服务器控件 出于本次对话的目的 通过按钮属性手动连接 这里不讨论 双
  • Mongoose 聚合 $match 与 ids 不匹配

    我想按 ids 显示产品 56e641d4864e5b780bb992c6 and 56e65504a323ee0812e511f2 并显示减去折扣后的价格 如果有 我可以使用聚合来计算最终价格 但这会返回集合中的所有文档 如何使其仅返回匹
  • 为什么epoch太多会导致过拟合?

    我正在阅读 Python 深度学习 一书 读完第 4 章 对抗过度拟合 后 我有两个问题 为什么增加纪元数可能会导致过度拟合 我知道增加纪元数将涉及更多的梯度下降尝试 这会导致过度拟合吗 在对抗过拟合的过程中 准确率会降低吗 我不确定您正在
  • 动态加载脚本后访问变量

    首先 这个项目不使用 JQuery 我们有一些第三方 JavaScript 它又大又多 不需要经常使用 因此我们仅在需要时才动态加载它 function loadBigHairyCode var file document createEl
  • 是否可以在 TypeScript 中断言编译错误?

    例如 在 Scala 中 可以执行以下操作 ScalaTest assertDoesNotCompile val a String 1 assertTypeError val a String 1 assertCompiles val a
  • 是否建议在客户端使用Web SQL数据库进行存储[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • application/* Content-Type 和字符集属性

    The RFC 2616 https www ietf org rfc rfc2616 txt3 7 1 中规定 当发送方没有提供明确的字符集参数时 媒体 text 类型的子类型被定义为具有默认字符集 通过 HTTP 接收时的 ISO 88
  • CMake 的 CUDA 12 C++20 支持不起作用

    我正在尝试使用 CMake 3 25 在 Visual Studio 2022 的 CUDA 12 中启用新的 C 20 支持 如果我设置这些变量 set CMAKE CUDA STANDARD 20 works with 17 but n
  • 如何保证进程运行在特定的物理CPU核心和线程上?

    这个问题 https stackoverflow com questions 4664668 how to force two process to run on the same cpu询问确保两个进程在同一 CPU 上运行 使用sche
  • “viewable_range”概念有什么意义?

    范围 细化 https eel is c draft range refinements viewable range 概念指定了可以安全转换为视图的范围类型的要求 它的强制实施大致规定range进一步满足viewable range如果其
  • NSAutoreleasePool 内存泄漏

    使用仪器 我在这段代码上出现了内存泄漏 我不明白为什么 void goToThisUrl id targetUrl NSAutoreleasePool pool NSAutoreleasePool alloc init if someCon
  • 使用ajax选择2个默认选项

    我有下一个 html 结构
  • Vertx 连接超时未捕获 JDBCClient (.getConnection)

    我无法处理 JDBCClient 中连接失败的情况 例如 没有主机可路由 连接超时等 因为方法 getConnection 不会返回 failedFuture 但它在监视器中显示原因 然后它将保持沉默 我认为当连接超时或其他原因时 它应该发
  • 正则表达式:如果包含特定字符串则不匹配

    我有两个字符串 Some Stuff S00E00 HDTV x264 2HD mp4 Some Stuff S00E00 720p HDTV X264 这个正则表达式 ome tuff mp4 HDTV x264 我需要的是只匹配第一个
  • Spring Batch - java 配置与 xml

    我已经使用 Spring Batch 的 Xml 配置一段时间了 感觉它更简单 简洁 然而 如今 人们建议使用 javaconfig 而不是 xml 我用谷歌搜索了这个话题 这个网站告诉我们为什么 javaconfig 更好https bl