Spring IOC 容器
一、概念
1.理念:让别人为你服务。
-
原来是需要什么东西自己去拿,现在是需要什么东西就让别人送过来。 当然,想要让 IOC 提供服务,并将所需要的被依赖对象送过来,就需要通过某种方式通知对方
2.三种注入方式
-
构造方法注入 :对象在构造完成之后,即进入就绪状态。但是构造方法无法被继承
-
setter方法注入:可对象构造完后再注入。setter方法可以被继承,但是对象无法在构造完成后进入就绪状态
-
接口注入:强制被注入对象实现不必要的接口,带有侵入性
3.IOC容器的作用
-
资源的集中管理,实现了资源的可配置和易管理
-
降低了使用资源双方的依赖程度
-
构造对象,管理其生命周期(scope 为 prototype的只负责构建,不负责管理生命周期)
4.容器类型
-
BeanFactory:默认采取延迟初始化策略,只有当客户端对象需要访问容器中的某个受管对象的时候,才会进行初始化 及 依赖注入操作
-
ApplicationContext:在启动的时候完成所有初始化
- 下图是 BeanFactory 与 ApplicationContext 的继承关系
-
二、BeanFactory
1. BeanFactory定义:
-
BeanFactory 是一个接口,基础类型的 IOC 容器,提供完整的 IOC 服务。
2. BeanFactory、BeanDefinitionRegistry 以及 DefaultListableFactory 的关系
-
BeanDefinition 的实例负责保存对象的所有信息
-
BeanDefinitionRegistry 保存了一组 BeanDefinition,就像是图书馆的书架,所有的书都是放在书架上的。其定义了Bean的注册逻辑
- BeanFactory:负责Bean的注册以及管理工作
3. 配置文件方式
-
当采用外部配置文件时,spring ioc 容器有一个统一的处理方式。通常情况下,需要根据不同的外部配置文件格式,给出相应的 BeanDefinitionReader 实现类,有 BeanDefinitionReader 的相应实现类负责将相应的配置文件内容读取并映射到BeanDefinition,然后将映射后的BeanDefinition 注册到一个BeanDefinitionRegistry,BeanDefinitionRegistry 完成Bean的注册 和 加载
4. 注解方式
-
用 @Component、@Autowired、@Service、@Controller 告知 spring容器需要为当前对象注入哪些依赖对象。在 spring 的配置文件中 用<context:component-scan/> 指定扫描标注有以上4个注解的类,如果找到,则将它们添加到容器进行管理,并为其注入符合条件的依赖对象
5. spring 配置文件bean的配置
1. <beans> :对管辖的<bean> 进行统一的默认行为设置
-
default-lazy-init :标志是否对所有的bean进行延迟初始化