Iva*_*vov 47 java configuration spring annotations dependency-injection
最近在我们的团队中,我们开始讨论在代码中使用spring注释来定义spring依赖项.目前我们使用context.xml来定义依赖项.你能不能给我一些线索,哪一种更好用?
编辑:我知道这对于更一般的问题来说似乎是一个重复的问题,但我对注释与配置对依赖注入的影响感兴趣,我相信它会比一般问题有不同的答案和态度.
Iva*_*vov 32
在阅读了一些相关的帖子并在团队中进一步讨论后,我们得出以下结论.我希望这对其他人有用.
关于XML配置(我们到目前为止使用),我们决定将它保留在库定义的依赖项中(无论是由我们开发还是由第三方开发).
根据定义,库提供特定功能,并且可以在各种场景中使用,不一定涉及DI.因此,在我们自己开发的库项目中使用注释会创建DI框架(在我们的例子中是Spring)与库的依赖关系,使得库在非DI上下文中不可用.拥有额外的依赖关系并不是我们团队(一般恕我直言)的良好做法.
在组装应用程序时,应用程序上下文将定义必要的依赖项.这将简化依赖性跟踪,因为应用程序成为组合所有引用组件的中心单元,通常这确实是所有连接都应该发生的地方.
在为许多组件提供模拟实现时,XML对我们也有好处,而无需重新编译将使用它们的应用程序模块.这使我们在测试在本地或生产环境中运行时具有灵活性.
关于注释,我们决定当注入的组件不会变化时我们可以使用它们 - 例如,只有组件的某个实现将在整个应用程序中使用.
注释对于不会一次更改或支持依赖项的不同实现的小组件/应用程序非常有用,并且不太可能以不同的方式组合(例如,对于不同的构建使用不同的依赖项).简单的微服务就属于这一类.
由注释组成的足够小的组件可以在不同的项目中直接使用,而不需要在XML配置中使用相应的应用程序来覆盖它们.这将简化应用程序的应用程序依赖性布线并减少重复设置.
但是,我们同意这些组件应具有我们的技术文档中描述的依赖关系,以便在组装整个应用程序时,可以了解这些依赖关系而无需滚动代码,甚至可以在IDE中加载模块.
注释配置组件的负面影响是,不同的组件可能会带来冲突的传递依赖关系,并且由最终的应用程序来解决冲突.当这些依赖关系没有在XML中定义时,冲突解决方法变得非常有限,并且如果它们尽可能地远离最佳实践则偏离.因此,在使用注释时,组件必须足够成熟,以了解它将使用哪些依赖项.
通常,如果我们的依赖关系可能因不同的场景而异,或者模块可以与不同的组件一起使用,我们决定坚持使用XML.显然,两种方法之间必须保持适当的平衡,并且对于用法有明确的想法.
有关混合方法的重要更新.最近我们有一个案例,我们为QA团队创建了一个测试框架,它需要来自另一个项目的依赖项.该框架旨在使用注释方法和Spring配置类,而引用的项目有一些我们需要引用的xml上下文.不幸的是,测试类(我们使用org.testngspring支持)只能使用xml或java配置类,而不能同时使用两者.
这种情况说明了混合方法会发生冲突和清楚的情况,必须丢弃.在我们的例子中,我们将测试框架迁移到使用spring xml上下文,但其他用途可能意味着相反的方式.
Ara*_*d A 11
根据我的经验,我更愿意(或者更确切地说是受限制)使用XML和基于注释的DI的组合.如果我需要在bean中注入一个元素Map,我将不得不定义一个util:map并自动装配它.另外,如果我有多个数据源,我需要使用XML DI将数据源注入sessionFactory,依此类推.因此,两者的组合将被要求.
我更喜欢使用组件扫描来自动检测服务和Dao.这减少了很多配置(我们将配置文件减少了约50%,切换到组件扫描).基于注释的DI支持byName(@Resource)和byType(@Autowired).
总之,我的建议是去寻找两者.我觉得在未来的Spring版本中肯定会有更多的注释支持.
在这里看看这个答案:Xml配置与基于注释的配置
直接来自那里的简短引用:
注释有其用途,但它们不是杀死XML配置的银弹.我建议混合两个!
例如,如果使用Spring,那么将XML用于应用程序的依赖注入部分是完全直观的.这使得代码的依赖性远离将要使用它的代码,相反,在代码中使用某种类型的注释需要依赖关系使代码知道这种自动配置.
但是,不使用XML进行事务管理,将方法标记为带有注释的事务是非常有意义的,因为这是程序员可能希望知道的信息.
编辑:另外,看看这里的答案:Java依赖注入:XML或注释他们很可能更好地针对你感兴趣的领域.
使用XML配置的一些优点:
因此,简而言之,XML配置需要更多的努力,但它可以为您节省大量时间,并在以后的大项目中让您头疼.
| 归档时间: |
|
| 查看次数: |
40225 次 |
| 最近记录: |