spring bean生命周期
spring采用的是懒加载模式,在尝试获取没有才会创建bean,所以是doGetBean
1、处理名称,检查缓存
1、处理别名
bean可以有多个名字
2、FactoryBean名字规范
factoryBean是spring中的工厂bean,我们想要获取工厂,而不是产品bean,在名称前面加&;
3、三级缓存中查看是否有单例对象;
2、处理父子容器
配置了父容器,父容器的查找规则:
spring父子容器名称可以重复;
优先查找子容器,找不到才会查找父容器;
3、检查DependsOn
有dependsOn时的bean初始化顺序;
总结
A和B没有依赖关系,想让A先创建,用dependsOn控制;
4、按Scope创建bean
scope可以理解为从一个范围找到bean
Singleton scope:从单例池范围查找,如果没有,创建放入单例池;
prototype scope:从不缓存,每次都创建新的;
5、创建bean实例
创建bean的方式
需要注意的是,如果没有发现后处理器,会采用默认策略,即使是私有的;
测试bean注入
依赖注入时的优先级
具体匹配 > byname/byType >注解Autowired
初始化bean的方式
测试bean初始化
结果4213
bean初始化优先级
Aware接口 > 注解PostConstruct > initialzingBean > 指定method
6、类型转换
requiredType
如果我们getBean的requiredType参数与实际得到的对象类型不同,会尝试进行类型转换;
7、销毁bean
标记销毁bean
- 判断并登记可销毁的bean
判断依据
- 实现了AutoCloseabe接口
- 自定义了destroyMethod
- 有@PreDestory标记等等
singleton bean的销毁在context.close之后,此时会找到所有的DisposableBean的名字,逐一销毁;