依赖注入和依赖查找有什么区别?

时间:2015-01-20 06:44:25

标签: spring

什么是依赖查找?有人可以澄清这两个概念。

3 个答案:

答案 0 :(得分:6)

依赖关系查找是指对象本身试图找到依赖关系,例如:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
MyBean bean = applicationContext.getBean("myBean")

这里,类本身正在通过XML初始化ApplicationContext,它正在上下文中搜索myBean

中名为ApplicationContext的bean。

依赖注入是指在初始化istance时自动绑定属性的时间。例如:

application-context.xml中,我们有一行初始化bean而另一行初始化对象,比方说MyClass

<bean id="myBean" class="org.mypackage.MyBean"/>
<bean id="myClass" class="org.mypackage.MyClass"/>

然后在MyClass中,你有类似的东西:

@Component
public class MyClass{
       @AutoWire
       MyBean myBean;

在这种情况下,您已指定初始化两个bean的两个istances。并且myClass bean有一个名为myBean的属性,由于注入

,它已经初始化了

答案 1 :(得分:5)

由于@Michael Zucchetta解释了Spring背景的不同之处,我将尝试给你一个更一般的解释。这两种方法的主要区别在于“谁负责检索依赖关系”。

通常,在DI(依赖注入)中,组件不知道DI容器和“自动”出现依赖关系(例如,您只需声明一些setter /构造函数参数,并且DI容器为您填充它们)。

在,DL(依赖查找)中,你必须具体询问你需要什么。这在实践中意味着你依赖于上下文(在春天的应用程序上下文中)并从中检索你需要的任何内容。

您可以查看M. Fowler的ServiceLocator vs DependencyInjection以获得更好的解释,但我会给你一个引用:

  

关键区别在于,使用服务定位器,服务的每个用户都对定位器具有依赖性。定位器可以隐藏其他实现的依赖关系,但您确实需要查看定位器。因此,定位器和注入器之间的决定取决于该依赖性是否是一个问题。

     

使用依赖项注入可以帮助您更轻松地查看组件依赖项。使用依赖注入器,您可以查看注入机制,例如构造函数,并查看依赖项。使用服务定位器,您必须在源代码中搜索定位器的调用。具有查找引用功能的现代IDE使这更容易,但它仍然不像查看构造函数或设置方法那么容易。

希望这有帮助。

答案 2 :(得分:1)

依赖关系查找是更传统的方法:

  • 组件必须要求来自JNDI注册表的依赖引用

我们可以通过两种方法实现这一目标:

1.Dependency Pull

&#13;
&#13;
 ApplicationContext ctx = new ClassPathXmlApplicationContext
           ("META-INF/spring/app-context.xml");

        SimpleBean mr = ctx.getBean("renderer", SimpleBean.class);
&#13;
&#13;
&#13;

2.Contextualized Dependency Lookup(查找是直接从容器中提取的,而不是从注册表中提取的)。组件必须实现特定的接口才能执行查找

public interface Container {
     Object dependencyLookup(String key);}


public class CDL implements Container {
     private Dependency dependency;

   @Override
   public void performLookup(Container container) {
    this.dependency = (Dependency) container.dependencyLookup("myDependency");
}

}

依赖注入更违反直觉(但更灵活,可扩展):

  • 依赖关系被注入组件

有两种方法可以做到这一点:

  1. 构造

  2. Setter Dependency Injection。