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