ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 上下文相关的依赖查找 应该理解为,有上下文的依赖查找。因为被 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(); } } ~~~