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

For dependency Injection to work, what is the prerequisite

虽然我在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。这是怎么回事?为什么在网络应用程序中,我们可以使用类似的方式注入实现?

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

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

任何详细的解释都会对消除这些疑惑有很大的帮助。

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

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

您正在做的是调用 spring 上下文来定位依赖项。执行此操作后,Spring 将尝试为您想要的依赖项找到一个 bean(提供者)。一旦找到它,它将创建对象(也通过解析它自己的依赖项)或使用它的现有实例,并且它将 return 实例给你。

Spring 提供 @Autowired 注释,作为使用上下文的替代,您可以使用它在 classes 中注入依赖项,它使您的代码更干净、更安全,因为您不需要'使用 bean 名称来注入依赖项。

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

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