深入Spring源码专题(4)

138 阅读2分钟

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

控制反转的类型

  1. 构造函数依赖注入

    当在组件的构造函数中提供依赖项时,就会发生构造函数依赖注入,组件声明一个或者一组构造函数,将其依赖项作为参数,在组件实例化时由IOC容器将依赖项传递给组件, 实现代码如下:

    public class ConstructorInjection(){
        private Dependency dependency;
        public ConstructorInjection(Dependency dependency){
            this.dependency = dependency;
        }
        @Override
        public String toString(){
            return dependency.toString();
        }
    }
    

    使用构造函数注入,如果没有依赖项,就不能创建对象,因此,必须要有依赖项。

    1. setter依赖注入

      在setter依赖注入中,IOC容器通过JavaBean样式的setter方法注入组件的依赖项,组件的setter方法公开了IOC容器可管理的依赖项。

      public  class SetterInjection{
          private Dependency dependency;
          public void setDependency(Dependency dependecy){
              this.dependency = dependency;
          }
          @Override
          public String toString(){
              return dependency.toString();
          }
      }
      

      使用setter注入的一个结果,可在没有依赖项的情况下创建对象,然后可通过调用setter来提供依赖项。

      在容器中,setDependency()方法所公开的依赖需求由JavaBeans风格的名称dependency引用,setter注入是使用最广泛的注入机制,也是最简单的IOC机制之一。

      1. 注入与查找

      在许多情况下,所使用IoC类型由使用的容器确定,对于注入与查找选择哪种方法,注入优先被选择,一方面,使用注入对组件的代码没有任何影响,另一方面,依赖拉取代码必须主动获取对注册表的引用并与其交互以获取依赖项。使用注入,可自由地使用与IoC容器完全分离的类,而Ioc容器通过手动为它们的协作者提供依赖对象,而如果使用查找,类总是依赖于容器定义的类和接口,查找的另一缺点是难以独立于容器来测试类。而使用注入则可以很容器测试自己组件,因为可通过使用适当的构造函数或setter来简单提供依赖项。