IoC控制反转
-
控制反转是一种思想
-
控制反转是为了降低程序耦合度,提高程序扩展力,到达OCP原则(开闭原则,软件开发七大原则之一)。 例如:MVC三层架构,如果不使用控制反转,那么我们在控制层调用数据,在业务层就需要创建控制层的对象,以便于程序之间的交互,但这样两个层级之间的耦合性就提高了!但如果我们只给业务层一个控制层的字段,而实例化对象的具体过程交给第三方,那么他们之间的耦合性是否就降低了?
-
那么控制反转,到底反转的是什么东西?
1. 将对象的创建权利交出去,交给第三方容器负责
2.将对象和对象之间关系的维护权交出去,交给第三方容器负责。 -
控制反转的思想是如何实现的呢?
通过DI(Dependency Injection):依赖注入 来实现控制反转
依赖注入
依赖注入实现了控制反转的思想
Spring通过依赖注入的方式来完成Bean管理(Bean对象的创建,bean对象之间的维护统称为bean管理)的。
Bean管理说的是:Bean对象的创建,以及Bean对象中属性的赋值(或者叫做Bean对象之间关系的维护)。
- 依赖是指对象和对象之间的关联关系。
- 注入值得是一种数据传递行为,通过注入行为来让对象和对象产生关系。
依赖注入常见的实现方式包括两种:
第一种:set注入
第二种:构造注入
set注入:
set注入,基于set方法实现的,底层会通过反射机制调用属性对应的set方法然后给属性赋值。因此这种方法必须要求属性对外提供set方法。
UserService的UserDao属性提供了一个set方法,我们以后可以利用反射机制来通过set方法给这个属性一个具体的UserDao对象。
需要注意的是使用set注入,需要将set方法的set去掉剩下的属性名首字母小写,其他的和之前一样,如果不这么干,spring是无法给bean的属性赋值的。
构造注入
通过调用构造方法来给属性赋值。
构造注入有两种方式给属性赋值:
1.通过参数下标来指定参数赋值。
2.通过传入的参数名来指定参数赋值.
不指定下标也不指定参数名,让spring自己做类型匹配。