草庐IT

java - 基于 Spring 注释的 DI 与 xml 配置?

coder 2023-05-10 原文

最近在我们的团队中,我们开始讨论在代码中使用 spring 注释来定义 spring 依赖项。目前我们正在使用 context.xml 来定义我们的依赖项。你能给我一些关于这两种方法的线索吗,什么时候使用哪种方法更好?

编辑:我知道这对于更一般的问题来说似乎是重复的问题,但我只对依赖注入(inject)的注释与配置的影响感兴趣,我相信这与一般问题会有不同的答案和态度。

最佳答案

在阅读了这里的一些相关帖子并在团队中进一步讨论后,我们得出以下结论。我希望这对这里的其他人有用。

关于 XML 配置 (到目前为止我们一直在使用),我们决定保留它用于库定义的依赖项(无论是由我们开发还是由第三方开发)。
库,根据定义,提供特定的功能,可用于各种场景,不一定涉及 DI。因此,在我们自己开发的库项目中使用注解,会创建 DI 框架(在我们的例子中是 Spring)对库的依赖,使库在非 DI 上下文中无法使用。在我们的团队中,拥有额外的依赖项不被认为是一种好的做法(恕我直言)。

当我们组装应用程序时,应用程序上下文将定义必要的依赖项。这将简化依赖关系跟踪,因为应用程序成为组合所有引用组件的中心单元,通常这确实应该发生所有连接。

在为许多组件提供模拟实现时,XML 对我们也有好处,而无需重新编译将使用它们的应用程序模块。这为我们在本地或生产环境中测试运行提供了灵 active 。

关于注释 ,我们决定当注入(inject)的组件不会改变时,我们可以受益于使用它们——例如,只有某个组件的特定实现将在整个应用程序中使用。

注释对于不会立即更改或支持依赖项的不同实现的小组件/应用程序非常有用,并且不太可能以不同的方式组合(例如,对不同的构建使用不同的依赖项)。简单的微服务就属于这一类。

由注释组成的足够小的组件可以在不同的项目中开箱即用,而无需各自的应用程序在其 XML 配置中覆盖它们。这将简化应用程序的应用程序依赖连接并减少重复设置。

但是,我们同意这些组件应该具有我们的技术文档中详细描述的依赖项,以便在组装整个应用程序时,无需滚动代码,甚至无需在 IDE 中加载模块即可了解这些依赖项。

注解配置组件的一个负面影响是,不同的组件可能会带来冲突的传递依赖关系,再次由最终应用程序来解决冲突。当这些依赖项没有在 XML 中定义时,冲突解决方法变得非常有限,并且与最佳实践相去甚远,如果它们可能的话。
因此,在使用注解时,组件必须足够成熟,知道它将使用哪些依赖项。

一般来说,如果我们的依赖可能因不同的场景而有所不同,或者一个模块可以与不同的组件一起使用,我们决定坚持使用 XML。显然,这两种方法之间必须有一个适当的平衡,并且对用法有一个清晰的想法。

关于混合方法的重要更新。最近,我们有一个案例,其中包含我们为 QA 团队创建的测试框架,它需要来自另一个项目的依赖项。该框架旨在使用注释方法和 Spring 配置类,而引用的项目有一些我们需要引用的 xml 上下文。不幸的是,测试类(我们使用 org.testng 和 spring 支持)只能使用 xml 或 java 配置类,不能混合使用。

这种情况说明了混合方法会发生冲突的情况,很明显,必须丢弃一种方法。在我们的例子中,我们迁移了测试框架以使用 spring xml 上下文,但其他用途可能意味着相反。

关于java - 基于 Spring 注释的 DI 与 xml 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8428439/

有关java - 基于 Spring 注释的 DI 与 xml 配置?的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐