Spring,@ Autowired,@ Resource和<property> </property>

时间:2010-11-05 09:18:40

标签: java spring

本周我一直在努力学习Spring,JBoss,Maven,JPA和Hibernate,我对它有很多乐趣。我对在类中注入资源的许多不同方法感到有些困惑。直到本周,我甚至不知道你可以以任何其他方式注入资源,而不是在Spring XML配置中使用<property>标记。

<bean id="catalogService" class="com.idbs.omics.catalog.service.CatalogService">
    <property name="termDao" ref="termDao"></property>
</bean>

当我开始尝试使用JPA时遇到了@PersistenceContext,但这似乎是一个特殊情况。然后我开始阅读Spring的测试框架,我看到第一个使用@Resource(name="catalogService")的示例,然后在Web服务示例中@Autowired崩溃了派对!

**The Question!**

那么所有这些之间有什么区别,是否存在使用它们的对错情况?我想我在这里寻找最佳实践。

干杯全部

2 个答案:

答案 0 :(得分:13)

@Autowired@Resource@Inject

我认为您需要阅读的Spring Reference部分是

3.9 Annotation-based container configuration


有许多类似的注释。通常,有一个Spring和一个非Spring版本可以做同样的事情。 Spring会尽可能地接受标准,但是在标准出现之前,Spring会经常提出自己的想法。示例:Spring支持自己的@Autowired注释,但也支持JSR-330中的新@Inject注释,以及JSR-250 @Resource注释(所有注释都可用于执行此操作)同样的事情)。

这里的关键概念是Spring不会强迫您使用自己的代码,但是在不将应用程序与Spring耦合的情况下支持许多不同的方法。 (仍然有一些注释没有非Spring等价,如@Transactional,但如果你愿意,你可以通过XML添加该功能,这样你就可以保持你的应用程序100%Spring免费并仍然使用许多便利注释,当然还有幕后的Spring布线和生命周期管理。

答案 1 :(得分:2)

另一方面是何时使用注释以及何时使用XML spring连接文件。

我的观点是,这是代码可读性和重新配置能力之间的权衡。

  • 如果您使用注释,那么您可以从源代码中看到连接到什么的内容。相比之下,如果您使用XML布线文件,则需要查看两个位置。

  • 如果使用XML布线文件,则可以通过修改(或使用Maven覆盖)XML布线文件来进行配置更改。如果你是大胆的,你甚至可以在部署的webapp上执行此操作。相比之下,在使用注释时更改IoC接线需要您修改Java文件并重新编译。

(旁白:在第二个子弹的情况下,理想的情况是有一个很好的基于GUI的工具,用于重新配置可以在开发沙箱或部署的webapp文件夹中运行的接线。有谁知道这样的工具?)