IoC控制反转
IoC(Inversion of Control)即:控制反转,是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的”控制反转”就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。
IoC是一种理念,一种思想,不拘泥于具体形式。
IoC主要的实现方式有两种:依赖查找,依赖注入。依赖注入是一种更可取的方式。
容器替我们做了哪些工作呢?
DI依赖注入
DI(Dependency Injection)即:依赖注入,将实例变量传入到一个对象中去。
依赖注入的方式
基于接口。实现特定接口以供外部容器注入所依赖类型的对象。
基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。
基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。
基于注解。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问)。
Spring装配Bean的4种策略
- byName:按名称装配
- byType:按类型装配
- constructor:构造器装配
- autodetect:Spring3.0之后已经被标记为
@Deprecated
Autowired和Resource
- Autowired默认按类型装配,但不是说就不能按名称装配了,如果默认按照类型装配,发现多个实例,则可以使用
@qulifier
、@Primary
进行过滤 - Resource默认按名称装配
推荐优先使用构造器装配,但我比较喜欢用Resource。