深入Spring源码专题(3)

129 阅读2分钟

这是我参与2022首次更文挑战的第6天,活动详情查看2022首次更文挑战

Spring IOC 控制反转、依赖注入

IOC的核心是DI,在于提供一种更简单的机制来设置组件依赖项,并在整个生命周期中管理这些依赖项,需要某些依赖项的组件被称为依赖对象,或者在IOC情况下称为目标对象,IOC分解为两种子类型:依赖注入和依赖查找,这些子类型被进一步分解为IOC服务的具体实现。

使用依赖查找时,组件必须获取对依赖项的引用,而使用依赖注入时,依赖项将通过IOC容器注入组件,依赖查找有两种类型:依赖拉取(DL)和上下文依赖查找(CDL)。依赖注入也有两种常见的风格:构造函数和setter依赖注入。

控制反转的类型

  1. 依赖拉取

    依赖拉取是一种最常见的IOC类型。在依赖拉取中,根据需要从注册表中提取依赖项,通过查找机制进行依赖拉取的场景如下图所示:

image-20220125214423600.png

  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机制如下图所示

 

image-20220125220032687.png

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();
      }
      
  }