IOC
:全称是 Inversion Of Control,也就是控制反转,它的核心思想是把对象的管理权限交给容器。应用程序如果需要使用某个对象的实例,那么直接从 IOC 容器里面去获取就可以了。
传统应用程序 vs IOC控制反转:
这种设计的好处在于降低了对象与对象之间的耦合性,使得程序的整个体系结构变得更加灵活。
Spring 里面提供了很多方式去声明一个 Bean,比如说在 XML 配置文件里面通过
标签、 @Service
注解、@Configuration
配置类中的 @Bean
注解去声明等等。
Spring 在启动过程中会去解析这些 Bean,然后保存到 IOC 容器里面。
Spring 中 IOC 的工作流程大致可以分为三个阶段:
IOC 容器的初始化阶段: 这个阶段主要是根据程序里面定义的 XML
或者注解等 Bean 的声明方式,通过解析和加载后生成 BeanDefinition
实体,然后把 BeanDefinition 注册到 IOC 容器中。
生成的 BeanDefinition 实体中会包含 Bean 的一些定义和基本属性。最后,把这个 BeanDefinition 保存到一个 Map 集合里面,从而去完成 IOC 的初始化。
IOC 容器的作用就是对这些注册的 Bean 的定义信息进行处理和维护,这是 IOC 容器实现控制反转的核心。
完成 Bean 的初始化和依赖注入: 进入第二个阶段以后,这个阶段会做两件事:
1)通过反射去针对没有设置 lazy-init
属性的单例 Bean 进行初始化;
2)完成 Bean 的依赖注入。
Bean 的使用: 通常我们会通过 @Autowired
这样一个注解,或者通过 BeanFactory.getBean()
从 IOC 容器里面去获取一个指定的 Bean 实例。
另外,针对设置了 lazy-init
属性以及非单例 Bean 的实例化,是在每一次获取 Bean 对象的时候,调用 Bean 的初始化方法来完成实例化的。并且 Spring IOC 容器不会去管理这些 Bean。
整理完毕,完结撒花~