这是我参与2022首次更文挑战的第6天,活动详情查看2022首次更文挑战
Spring IOC 控制反转、依赖注入
IOC的核心是DI,在于提供一种更简单的机制来设置组件依赖项,并在整个生命周期中管理这些依赖项,需要某些依赖项的组件被称为依赖对象,或者在IOC情况下称为目标对象,IOC分解为两种子类型:依赖注入和依赖查找,这些子类型被进一步分解为IOC服务的具体实现。
使用依赖查找时,组件必须获取对依赖项的引用,而使用依赖注入时,依赖项将通过IOC容器注入组件,依赖查找有两种类型:依赖拉取(DL)和上下文依赖查找(CDL)。依赖注入也有两种常见的风格:构造函数和setter依赖注入。
控制反转的类型
-
依赖拉取
依赖拉取是一种最常见的IOC类型。在依赖拉取中,根据需要从注册表中提取依赖项,通过查找机制进行依赖拉取的场景如下图所示:
Spring提供依赖拉取作为一种检索框架所管理组件的机制。
```java
public class DependencyPull(){
public static void main(String... args){
ApplicationContext context = new ClassPathXmlApplicationContext("spring/aop-context.xml");
MessageRenderer messageRender = context.getBean("renderer",MessageRenderer.class);
messageRender.render();
}
}
```
它广泛使用JNDI查找来获得注册表的依赖项。
2. 上下文依赖查找
上下文依赖查找(CDL)-查找是针对管理资源的容器执行的,而不是来自某个中央注册表,在某个设定点执行,显示CDL机制如下图所示
CDL通过让组件实现类似于如下接口来进行工作
public interface ManagaeComponent{
void performLookup(Container container);
}
通过实现该接口,一个组件向容器发送它想要获得依赖项的信号。容器由底层应用程序服务器或框架提供。
提供依赖查找服务的简单接口如下:
public interface Container{
Object getDependency(String key);
}
当容器准备将依赖项传递给组件时,会依次调用每个组件的performLookup()方法,然后组件可使用Container接口查找所需的依赖项,实现代码如下:
public class ContextualizedDependencyLookup implements ManagedComponent{
private Dependency dependency;
@Override
public void performLookup(Container container){
this.dependency = container.getDependency("myDependency");
}
@Override
public String toString(){
return dependency.toString();
}
}