【问题标题】:Can Spring understand @Inject replacing Weld as a JSR-299 implementation?Spring 能否理解 @Inject 将 Weld 替换为 JSR-299 实现?
【发布时间】:2011-03-04 14:23:20
【问题描述】:

我从几个网页中注意到 Spring 3.0 显然支持来自 JSR-330 的 @Inject。因为我们真的很想在我们的库中为 Web 应用程序和独立应用程序使用 JSR-299 语法进行依赖注入,并且有 Weld 的替代品,如果 Spring 可以做到这一点会很好。

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

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

(我知道Guice最终也会支持这个。它现在只在SVN中,如果有官方的Spring版本可以,那就更好了。)


这是可以做到的。 JSR-330 jar 必须单独下载,cglib 来解析手动编写的@Configuration 类,外加一个公共日志实现。

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

【问题讨论】:

    标签: java spring dependency-injection jsr299


    【解决方案1】:

    来自Spring 3.0.x Reference documentation:

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

    因此,您可以使用 @Inject 使您的代码与 DI 框架无关,但是您仍然需要在项目中包含一个带有 javax.inject 类的 jar,因为 Spring 不会自己发布它们。你可以在JSR-330's Google Code site的下载部分找到相关的jar。

    【讨论】:

    • 我找到了相同的 sn-p,但我无法让它工作。如果可以,请分享您是如何做到的。
    • 今晚我才能查看该代码。你是从 JSR 的网站上得到这个罐子的吗? code.google.com/p/atinject
    • 显然我无法阅读。我没有单独下载 JSR-330 jars。我明天试试。
    • 我需要 JSR-330 jar、cglib 和 commons 日志记录,以及一些手动接线。
    【解决方案2】:

    javax.inject 包不包含在 Spring 3 中,但如果存在,它确实支持它。

    如果您查看AutowiredAnnotationBeanPostProcessor 的源代码,您会看到构造函数使用反射来定位javax.inject.Inject,并在找到时记录一条消息。它没有编译时依赖。

    您需要从其他来源(例如 JavaEE 6 SDK)找到 JSR-330 JAR。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多