Spring IOC
Bean 的生命周期
- 实例化 Bean 对象。
- 通过反射创建对象,分配内存,此时属性值都是默认值。
- 属性注入:
- 解析自动装配(自动注入)( autowire 的值: byName, byType, constructor, no),设置对象的属性。
- no: 不使用自动装配,通过手工设置 ref 属性来装配。也就是自行使用
<property>, <construct-arg>
标签,设置ref, value
值。 - byName:不是按照属性里面的名字,是按照Bean的名字,在类里面就是set方法后面的名字。
- byType:感觉参数类型装配,就是setter 的参数类型。
- constructor:找到构造函数,然后根据构造函数中的参数类型来找,如果类型匹配到多个再根据名字来找。
- no: 不使用自动装配,通过手工设置 ref 属性来装配。也就是自行使用
- 可能会出现循环依赖。
- 解析自动装配(自动注入)( autowire 的值: byName, byType, constructor, no),设置对象的属性。
- 初始化:
- 检查Aware相关接口,如果实现了相关的Aware接口,就调用相关回调方法。
- 调用 BeanPostProcessors 的前置处理函数。
- 调用初始化生命周期回调函数,有三种方法实现初始化生命周期的回调函数:
- 使用注解:
@PostConstruct
。 - 实现
InitializingBean
接口,重写afterPropertiesSet()
方法。 - 指定
init-method
。- 使用
@Bean(init-method=xxx)
- 在
<bean>
标签中指定 init-method。
- 使用
- 使用注解:
- 如果 Bean 实现了 AOP,那么会创建动态代理类。
- 需要代理的话,则创建代理。
- 调用 BeanPostProcessors 的后置处理方法。
- 销毁:
- 在 Spring 容器关闭的时候进行调用。
- 调用销毁生命周期的回调方法。
Spring IOC
什么是 Spring IOC 容器
-
什么是 IOC 容器:负责管理 Bean。
- IOC 容器的核心设计是 BeanFactory 接口 与 ApplicationContext 接口。
- 在
new ApplicationContext()
会加载。
-
BeanFactory 接口 提供了 IOC 容器最基本的功能。如:
getBean()
从容器中获得Bean。- Bean 的加载时机:BeanFactory 的实现类采用的是延迟加载(容器启动时,不会对Bean 进行实例化,有需要使用 Bean 时才进行实例化)。
- 使用场景:资源宝贵的移动设备中,可能会优先选择 BeanFactory。
-
ApplicationContext 接口 扩展了 BeanFactory。ApplicationContext 接口继承了 BeanFactory,并且继承了MessageSource,ResourceLoader, ApplicationEventPublisher 接口,在简单的IOC容器基础上添加了许多高级容器的特性。
-
实现的接口
-
MessageSource:支持信息源,可以实现国际化?
-
ResourceLoader:访问资源。
-
ApplicationEventPublisher :支持应用事件。
-
-
实现:
-
FileSystemXmlApplicationContext:需要传入文件位置。
-
ClassPathXmlApplicationContext:需要传入 CLASSPATH
-
XmlWebApplicationContext
-
-
Bean 的加载时机:IOC 容器创建时,就进行 Bean 的加载。(因此需要更多的系统资源)
-
使用场景:包含了 BeanFactory 的所有功能,一般使用 ApplicationContext 而不是 BeanFactory。
-
Spring IOC 启动流程
-
阶段1:容器启动阶段。
-
从 new 一个 ApplicationContext 实例开始。
-
调用
invokeBeanFactoryPostProcessors
BeanFactoryPostProcessors 的后置处理方法,读取配置,创建 BeanDefinition 用来存放 Bean 的基本信息。- BeanDefinitionReader 接口,?
- 解析
@ComponentScan
,扫描包下面的类有没有@Component
注解,有的话就生成对应的 BeanDefinition。 - 将 BeanDefinition 对象放入 beanDefinitionMap 中。
-
判断 是否符合 BeanFactory 的
getBean()
的生产标准。- 要为单例,不能是 懒加载。
-
-
阶段2:Bean 创建阶段。
-
推断构造函数。由于Spring 实例化对象是通过构造方法反射,因此需要知道使用哪个构造方法。
-
实例化:反射(根据 BeanDefinition 中的信息)+工厂。
-
属性注入。
- 可能出现循环依赖。
-
初始化。
- 检查 Aware 相关接口,如果实现了就调用相应的回调方法。
- 生产代理对象。(包括 AOP)
- 调用初始化生命周期的回调方法。(三种方式)
-
加入单例池:就是加入三级缓存中的一级缓存,即名为
singletonObjects
的 HashMap。
-
Spring IOC 实现原理
-
IOC 容器是通过:工厂 + 反射 实现的。
-
基于 XML 配置文件的 Spring IOC 原理。
-
创建 Spring IOC 容器。
ApplicationContext context = new ClassPathApplicationContext("Beans.xml")
-
解析器解析 xml 文件,获得 id 以及 class 属性对应的值。
-
使用反射机制,获得对象。
-
准备 IOC容器,存放对象。
-