虽然我已经在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本身是作为应用程序的依赖提供。
任何详细的解释都有助于消除这些疑虑。
答案 0 :(得分:1)
依赖注入的工作原理是通过一种方式(配置)来提供类中的依赖关系。您可以从外部传递所需的对象,而不是让类创建其依赖项。这使您的代码可以测试,并且您可以利用对象可重用性。
Spring中的依赖注入与其他DI框架的工作方式类似。 您可以通过其构造函数或通过成员字段注入类的依赖项(私有字段也可以在Spring中工作)。
您正在做的是调用spring上下文来定位依赖项。一旦你这样做,Spring将尝试找到你想要的依赖项的bean(提供者)。一旦找到它,它将创建对象(通过解析它自己的依赖项)或使用它的现有实例,它将返回给你的实例。
Spring提供@Autowired注释,作为使用上下文的替代,您可以使用它来在类中注入依赖项,它使您的代码更清晰,更安全,因为您不会使用bean名称注入依赖性。
您还可以查看spring的基于Java的配置,以避免在XML文件中配置bean并使用@Bean批注。
我强烈建议您查看Spring网站上的指南,特别是使用Spring Boot的指南,因为它们为您提供了使用Java注释设置基本示例所需的所有信息。