【问题标题】:Dependency injection without using spring framework不使用spring框架的依赖注入
【发布时间】:2014-03-19 15:26:46
【问题描述】:

我有一个相当幼稚的问题。我们可以像使用 Spring 框架注入一样使用核心 java 注入依赖项吗?

现在,我做这样的事情:

在 web.xml 中:

<context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

spring applicationcontext.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="mybean" class="com.test.app.MyService" />

</beans>

我将使用注入 bean 的类:

public class MyResource {

    @Autowired
    private MyService mybean;

     public MyResponse doService(MyRequest req) {
           mybean.doBusiness(req);
     }
}

}

那么,有没有一种方法可以使用核心 java 进行这种依赖注入?我一直在阅读有关 CDI 的内容,但不太了解。另外,它也感觉它不是 Spring 所做的直接替代。

如果我错了,请帮助并纠正我。

【问题讨论】:

  • “核心Java”是什么意思?这不是一个普遍认可的术语。
  • 我改了标题。是不是更合适?
  • 这样比较容易理解。

标签: java spring dependency-injection


【解决方案1】:

javax.inject (JSR-330) 和 CDI (JSR-299, JSR-346) 只是 API,而不是实现。这些 API 的一些实现可以在 Java SE 中工作(与 Java EE 不同,我想这就是你所说的“核心 Java”),例如Weld SE.

CDI 基于 JSR-330。

虽然javax.inject 仅涉及基本注入,不涉及范围和生命周期,但可以公平地说,CDI 和 Spring Core 或多或少是同等强大的。两者都可以在 Java SE 中使用。

【讨论】:

    【解决方案2】:

    @Autowired 是一个未标准化的 Spring 注解。对应的标准注解是来自 javax.inject 的@Inject

    除了 Spring,Google Guice 还支持 javax.inject

    另一个非常轻量级的依赖注入框架(不支持 javax.inject)是PicoContainer

    【讨论】:

      【解决方案3】:

      您还可以查看 HK2,它是一个完整的 JSR-330,并在基本 JDK 中运行。它具有基本 JDK 的功能,例如安全性。在这里查看更多:

      HK2 Main Page

      【讨论】:

        【解决方案4】:

        依赖注入是一种模式。你想要的,以及 Spring 的基础,是一个 Inversion of Control 容器。

        不,Java SE 和 Java EE 不提供这种控制反转容器。

        Java EE 确实以CDI 的形式提供了一个用于依赖注入的API。您可以使用一个名为 Weld 的参考实现。

        其他答案列出了许多其他 IoC 容器。

        【讨论】:

          【解决方案5】:

          也许你想看看javax.inject。 API 可作为单独的 jar 使用,并且存在一些依赖注入框架,它们依赖并使用此 jar。

          其中有Guava和更轻量级的Dagger

          您的@Autowired 在javax.inject 语言中将是@Inject;上面两个框架都允许在纯Java中注入(可能其他的,不知道,因为不感兴趣)。

          希望这会有所帮助...

          【讨论】:

          • Spring 也支持@Inject
          • 我听说过;然而,从什么时候开始? Spring 早于 javax.inject。
          • 至少从 3.1 开始。 Spring 增加了对大多数 Java EE 注释的支持;例如,它也支持所有生命周期注释。它将@Inject 视为与@Autowired 相同,只是@Inject 没有required 选项。
          【解决方案6】:

          是的,你可以! JSR 330 完全谈论这个。

          你也可以看看Spring documentation

          【讨论】:

          • 实际上这是规范又名标准,而不是真正的实现。所以这并不能证明你可以在 vanilla Java 中使用 DI :) Spring、Dagger、Guice 等是可以用于 DI 的实现。
          猜你喜欢
          • 2014-09-06
          • 1970-01-01
          • 2010-09-14
          • 1970-01-01
          • 2016-11-29
          • 2016-07-25
          • 2016-08-19
          • 2015-09-30
          • 2010-12-31
          相关资源
          最近更新 更多