### 上下文相关的依赖查找
应该理解为,有上下文的依赖查找。因为被 Contextualized,即被限定了一个上下文。而在这里,它的上下文就是容器(Container),就是说让它就是在容器的范围内进行依赖查找。但是示例代码里面通过实现接口的方式去获得查找能力,
然后还要提供一个容器的引用。
Contextualized dependency lookup (CDL) 是面向容器而不是注册中心查找依赖。
![](https://img.kancloud.cn/20/8a/208a11fcdcb83336162ed24cec4ae202_300x235.png)
项目代码结构
![](https://img.kancloud.cn/1a/06/1a06075bfcbdf18d73d69dac530010c9_394x261.png)
类图
![](https://img.kancloud.cn/91/f0/91f0468fc33488880c848ca8fe4d0da1_704x232.png)
~~~
public class CDLDemo {
public static void main(String... args) {
// 得先创建个容器
Container container = new DefaultContainer();
// 然后查找依赖
ManagedComponent managedComponent = new ContextualizedDependencyLookup();
managedComponent.performLookup(container);
// 调用的是实现类的 toString 方法。
System.out.println(managedComponent);
}
}
~~~
~~~
/**
* 管理依赖的容器
*/
public interface Container {
/**
*
* @param key 查找依赖所使用的 key,根据这个 key 去找到需要的依赖
* @return 返回依赖项对象实例
*/
Object getDependency(String key);
}
~~~
~~~
/**
* 容器接口的一个默认实现,写死了依赖查找的逻辑
*/
public class DefaultContainer implements Container {
/**
*
* @param key 查找依赖所使用的 key,根据这个 key 去找到需要的依赖
* @return 如果提供的 key 的值等于 "myDependency" 则返回新的依赖项实例,
* 否则抛出异常
*/
@Override
public Object getDependency(String key) {
if ("myDependency".equals(key)) {
return new Dependency();
}
throw new RuntimeException("Unknown dependency: " + key);
}
}
~~~
~~~
/**
* 这个类作为依赖项
*/
public class Dependency {
@Override
public String toString() {
return "Hello from " + getClass();
}
}
~~~
~~~
/**
* 被管理的组件,通过向容器查找依赖
*/
public interface ManagedComponent {
void performLookup(Container container);
}
~~~
~~~
/**
* 被管理的组件的一个实现
*/
public class ContextualizedDependencyLookup implements ManagedComponent {
// 想要的依赖项
private Dependency dependency;
// 从容器中找到依赖
@Override
public void performLookup(Container container) {
this.dependency = (Dependency) container.getDependency("myDependency");
}
@Override
public String toString() {
return dependency.toString();
}
}
~~~