要使依赖注入工作,先决条件是什么

时间:2016-04-11 16:11:24

标签: spring dependency-injection inversion-of-control

虽然我已经在Spring框架中工作了一段时间,但我相信我还是不完全理解它。我想知道依赖注入的工作方式和位置。

为了强化这些概念,我创建了一个独立的Java程序,并希望了解如何使用Spring框架注入实现。

以下是spring bean文件的片段:

<beans .....>

    <bean id="CommomImpl" class="com.example.common.impl.CommomImpl">
    </bean>

    <bean id="SimpleImpl" class="com.example.simple.impl.SimpleImpl">
    </bean>
</beans>

现在,下面是独立的Java程序,我想看看DI是如何工作的。

public class MainApp {

    Resource(name = "SimpleImpl")    -------------------> (1)
    static SimpleTasks simpleTasks1;

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("spring-bean-config.xml");

        SimpleTasks simpleTasks = null;
        CommonTasks commonTasks = null;

        simpleTasks = (SimpleTasks) context.getBean("SimpleImpl"); ----->(2)
        simpleTasks.print("USER");

        commonTasks = (CommonTasks) context.getBean("CommomImpl"); ----->(3)
        commonTasks.add(3,3);

        simpleTasks1.print("USER"); ---------(4)
    }
}

关于上述计划,我有以下问题:

Q1:(1)处的代码不提供任何注入,即simpleTasks1为null。这是怎么回事?为什么在Web应用程序中,我们可以使用类似的方式注入实现?

Q2:是(2)和(3)依赖注入?

Q3:(4)处的代码给出空指针异常,因为(1)没有注入实现。这让我很困惑。在什么情况下DI工作?当我们创建web应用程序时,我们将.war部署在web容器中而不是在Spring容器中,那么@Resouce(name =&#34; xyz&#34;)如何工作,当spring框架jars本身是作为应用程序的依赖提供。

任何详细的解释都有助于消除这些疑虑。

1 个答案:

答案 0 :(得分:1)

依赖注入的工作原理是通过一种方式(配置)来提供类中的依赖关系。您可以从外部传递所需的对象,而不是让类创建其依赖项。这使您的代码可以测试,并且您可以利用对象可重用性。

Spring中的依赖注入与其他DI框架的工作方式类似。 您可以通过其构造函数或通过成员字段注入类的依赖项(私有字段也可以在Spring中工作)。

您正在做的是调用spring上下文来定位依赖项。一旦你这样做,Spring将尝试找到你想要的依赖项的bean(提供者)。一旦找到它,它将创建对象(通过解析它自己的依赖项)或使用它的现有实例,它将返回给你的实例。

Spring提供@Autowired注释,作为使用上下文的替代,您可以使用它来在类中注入依赖项,它使您的代码更清晰,更安全,因为您不会使用bean名称注入依赖性。

您还可以查看spring的基于Java的配置,以避免在XML文件中配置bean并使用@Bean批注。

我强烈建议您查看Spring网站上的指南,特别是使用Spring Boot的指南,因为它们为您提供了使用Java注释设置基本示例所需的所有信息。