我从几个网页中注意到 Spring 3.0 显然支持来自 JSR-330 的 @Inject。由于我们确实希望在 Web 应用程序和独立应用程序的库中使用 JSR-299 语法进行依赖项注入,并且有 Weld 的替代方案,因此如果 Spring 能够做到这一点那就太好了。

作为 Spring 的新手,我尝试下载 Spring Framework 发行版并将所有 jar 放在 Eclipse 构建路径上。没有 Inject 注释,因此我使用 Weld 的现有测试项目无法编译。

这可以用 Spring 来完成吗?我需要做什么才能让它运行?

(我知道 Guice 最终也会支持这一点。目前仅在 SVN 中提供,如果有官方的 Spring 版本可以,那就更好了。)


可以办到。必须单独下载 JSR-330 jar,并使用 cglib 来解析手动编写的 @Configuration 类,以及公共日志记录实现。

与Weld最大的区别似乎在于,接线需要手动编写,而不是神奇地找到(有点麻烦,但可能会做出更健壮的应用程序),而且启动时间要少得多。我对 Spring 还是新手 - 有没有办法自动发现 @Configuration 类?

有帮助吗?

解决方案

来自 Spring 3.0.x 参考文档:

在下面的示例中,可以使用 JSR 330 的 @Inject 注释来代替 Spring 的 @Autowired。@Inject 没有必需的属性,这与 Spring 的 @Autowire 注释不同,后者有一个必需的属性来指示注入的值是否是可选的。如果类路径上有 JSR 330 JAR,则会自动启用此行为。

因此,您可以使用 @Inject 使您的代码与 DI 框架无关,但您仍然需要包含一个带有以下内容的 jar javax.inject 项目中的类,因为 Spring 本身不提供它们。您可以在下载部分找到相关的 jar JSR-330 的 Google 代码站点.

其他提示

javax.inject包不包括作为弹簧3的一部分,但它确实,如果它的存在。

支持它

如果你看一下源AutowiredAnnotationBeanPostProcessor,你会看到构造函数使用反射来定位javax.inject.Inject,如果它发现它记录一条消息。有上没有编译时依赖关系。

您需要从其他来源(例如,JavaEE的6 SDK)定位JSR-330的JAR文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top