IoC(Inversion of Control)控制反转,包含了两个方面:一、控制。二、反转
我们可以简单认为:
- 控制指的是:当前对象对内部成员的控制权。
- 反转指的是:这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。
使用IOC的好处:
- 不用自己组装,拿来就用。
- 享受单例的好处,效率高,不浪费空间。
- 便于单元测试,方便切换mock组件。
- 便于进行AOP操作,对于使用者是透明的。
- 统一配置,便于修改
IOC原理
IOC容器其实就是一个大工厂,它用来管理我们所有的对象以及依赖关系
- 原理就是通过Java的反射技术来实现的!通过反射我们可以获取类的所有信息(成员变量、类名等等等)!
- 再通过配置文件(xml)或者注解来描述类与类之间的关系
- 我们就可以通过这些配置信息和反射技术来构建出对应的对象和依赖关系
Spring IOC容器是怎么实现对象的创建和依赖的:
- 根据Bean配置信息在容器内部创建Bean定义注册表
- 根据注册表加载、实例化bean、建立Bean与Bean之间的依赖关系
- 将这些准备就绪的Bean放到Map缓存池中,等待应用程序调用
Spring容器(Bean工厂)可简单分成两种:
BeanFactory
- 这是最基础、面向Spring的
ApplicationContext
- 这是在BeanFactory基础之上,面向使用Spring框架的开发者。提供了一系列的功能!
几乎所有的应用场合都是使用ApplicationContext!
简要总结:
- BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个
<bean>
解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中; - 容器扫描BeanDefinitionRegistry中的BeanDefinition;调用InstantiationStrategy进行Bean实例化的工作;使用BeanWrapper完成Bean属性的设置工作;
- 单例Bean缓存池:Spring 在DefaultSingletonBeanRegistry类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用HashMap实现的缓存器,单实例的Bean以beanName为键保存在这个HashMap中。
依赖注入方式
依赖注入的方式有3种方式:
- 属性注入–>通过
setter()
方法注入 - 构造函数注入
- 工厂方法注入
一个接口两个实现类,怎么在调用的时候优先调用某个实现类呢?
使用
@Primary
注解设置为首选的注入Bean使用
@Qualifier
注解设置特定名称的Bean来限定注入!- 也可以使用自定义的注解来标识