什么是依赖查找?有人可以澄清这两个概念。
答案 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)
依赖关系查找是更传统的方法:
我们可以通过两种方法实现这一目标:
1.Dependency Pull
ApplicationContext ctx = new ClassPathXmlApplicationContext
("META-INF/spring/app-context.xml");
SimpleBean mr = ctx.getBean("renderer", SimpleBean.class);
&#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");
}
}
依赖注入更违反直觉(但更灵活,可扩展):
有两种方法可以做到这一点:
构造
Setter Dependency Injection。