IoC和DI

IoC控制反转

IoC(Inversion of Control)即:控制反转,是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的”控制反转”就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。

IoC是一种理念,一种思想,不拘泥于具体形式。

IoC主要的实现方式有两种:依赖查找,依赖注入。依赖注入是一种更可取的方式。

容器替我们做了哪些工作呢?

DI依赖注入

DI(Dependency Injection)即:依赖注入,将实例变量传入到一个对象中去。

依赖注入的方式

  • 基于接口。实现特定接口以供外部容器注入所依赖类型的对象。

  • 基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。

  • 基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。

  • 基于注解。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问)。

Spring装配Bean的4种策略

彻底搞明白Spring中的自动装配和Autowired - 掘金

  • byName:按名称装配
  • byType:按类型装配
  • constructor:构造器装配
  • autodetect:Spring3.0之后已经被标记为@Deprecated

Autowired和Resource

  • Autowired默认按类型装配,但不是说就不能按名称装配了,如果默认按照类型装配,发现多个实例,则可以使用@qulifier@Primary进行过滤
  • Resource默认按名称装配

推荐优先使用构造器装配,但我比较喜欢用Resource。

Reference

什么是IoC和DI?DI是如何实现的?-阿里云开发者社区