继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

spring源码分析(一)bean的生命周期之Bean的初始化

不脱发的小Java
关注TA
已关注
手记 7
粉丝 0
获赞 7

一,如何把对象注入到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) 中。

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP