一,如何把对象注入到springIoc容器中
1. 扫包 + 注解 (@ComponentScan
+ @Controller, @Service, @Repository, @Component
)
2. @Configuration
+ @Bean
(此方法生效的前提是@ComponentScan
存在)
3. 开关类@EnableAutoConfiguration
启用Import机制 (通常此注解注入的多为maven引入的依赖以及sdk中需要ioc容器管理的对象)他的原理是扫描jar包中的META-INF/spring.factories 把这下面标注的类通过扫描加入到数组中,然后统一注入到ioc容器中。
4.(不常用)通过@ImportResource("xxx.xml")
引入老项目的xml配置文件实现ioc容器的注入。
二,以上四种是注入方式,bean的注入到销毁的这个过程则被称为bean的生命周期
1.运行main方法的时候,首先会通过类加载器把全部的类加载到虚拟机中(是全部加载不是按需加载)。
2.初始化spring容器的时候(此处为按需加载) 他会找到符合上面四种注入方式的类
这时候不是立马new一个对象, 他会先对对象进行解析看是否需要创建bean(因为他拿到这个类的时候,不确定他是不是单例singleton只有单例在创建容器的时候创建,原型Prototype和懒加载模式@lazy(true)
是在getBean("xxx.class")
的时候创建bean的)
3.这时候他会循环创建BeanDefinition的实现类的对象(根据注入进来的类) 他会给每个类都创建一个BeanDefinition的实现类的对象,把各个属性注入到BeanDefinition(包含当前像创建bean对象的所有信息) 中
他会把spring创建的BeanDefinition放入到一个map中去同时把类名放进一个list,此处的list是保证对象创建的顺序的因为list是有序的
3.1 在这一步可以对spring进行扩展,这也是我们学习源码的主要目的之一
在这里可以通过实现接口BeanFactoryPostProcessor 的方式可以对这个类的各种属性进行修改这一步是在放入map之后调用一个方法preInstantiateSingletons new Object
去创建bean之前执行的 接口BeanFactoryPostProcessor 接管这个存放BeanDefinition的map 然后去处理。
3.2 判断是否需要现在就去创建这个bean。
4.怎么判断 :这个map里面的各种属性符合创建bean的条件,它会调用一个方法preInstantiateSingletons new Object
去创建bean,BeanDefinition这里相当于根据一个类的元数据去创建bean
5.创建成功的bean会被放进一个spring单例池(一个map) 中。