protected<T> T doGetBean(
String name,@Nullable Class<T> requiredType,@Nullable Object[] args,boolean typeCheckOnly)
-
阶段: 处理名称,检测缓存
-
阶段2: 检查父工厂
-
阶段3: 检查DependsOn
-
阶段4: 按Scope 创建 bena
-
创建 singleton
-
创建prototype
-
创建其他 scope
-
-
阶段5: 创建bean
-
创建bean实例
-
依赖注入
-
初始化
-
登记可销毁bean
-
-
阶段6: 类型转换
-
阶段7: 销毁bean
阶段1 处理名称,检查缓存
先把别名解析为实际名称,再进行后续处理
若要FactoryBean 本身,需要使用 & 名称获取
-
三级缓存
-
singletonObjects 一级缓存,放单列成品对象
-
singletonFactories 三级缓存 放单列工厂
-
earlySingletonObjects 二缓存 放单列工厂的产品,可称为提取单列对象
-
阶段2 处理父子容器
父子容器的bean 名称可以重复
优先找子容器的bean,找到了直接返回,找不到继续到父容器中寻找
阶段3 dependsOn
依赖关系 如a依赖 b bean的依赖创建顺序需要保障
a 和b 没有依赖关系,需要先创建b a dependsOn b //b先创建 a在创建
阶段4 按Scope 创建 Bean
理解从 xxx范围 来寻找bean
singleton scope 表示从单列池范围内获取bean ,如果没有,则创建并放入单列池
prototype scope 表示不缓存bean ,每次都创建新的
request scope 表示从request 对象范围内获取bean,如果没有,则创建并放入 request
阶段5 创建bean
创建阶段
-
AutowiredAnnotationBeanPostProcessor 选择构造
-
优先选择@Autowired 注解的构造
-
若有唯一带参构造,也会选入
-
-
默认构造
-
后处理和,BeanDefiniation 都没找到构造,采用默认构造,即使是私有的
-
依赖注入
-
AutowiredAnnotationBeanPostProcessor(注解匹配)
-
识别@Autowired 及@Value 标注的成员,封装为 lnjectionMetadata 镜像依赖注入
-
-
CommonAnnotationBeanPostProcessor(注解匹配)
-
识别@Ressource 标注的成员,封装为lnjectionMetadata 进行依赖注入
-
-
AUTOWIRE_BY_NAME (根据名字匹配)
-
根据成员名字找bean对象,修改mbd 的propertyValues 不会考虑简单的类型的成员
-
-
AUTOWIRE_BY_TYPE(根据类型匹配)
-
根据成员类型执行 resolveDependency 找到依赖注入的值,修改mbd 的 propertyValues
-
初始化
要点 | |
---|---|
内置Aware接口装配 | 包括BeanNameAware,BeanFactoryAware 等 |
扩展Aware 接口配置 | 由ApplicationContextAwareProcessor 解析执时机在 postProcessBeforelnitalization |
@PosConstruct | 由CommonAnnotationBeanPostProcessor解析 执行时机在postProcessBeforelnitalization |
lnitalizingBean | 通过接口回调执行初始化 |
initMethod | 根据BeanDefinition 得到初始化方法执行初始化 |
创建AOP代理 | 由 AnnotationAwareAspectjAutoProxyCreator创建,执行时机在 postProcessAfterlnitialization |
执行顺序
-
aware接口
-
注解初始化 @PostConstruct
-
接口初始化 实现 InitializingBean,
-
afterPropertiesSer() 实现方法
-
-
执行自定义初始化 initMethod
注册可销毁的bean
实现了 DisposableBean 或 AutoCloseable 接口 是可销毁的bean
自定义了destroyMethod 是可销毁的bean
采用了@Bean 没有指定 destroyMethod ,则采用自动推断方式获取销毁方法名(close(),shutdown() bean里面提供了这个两个方法之一,视为可销毁)
@PreDestroy 标注的方法
存储位置
singletion scope 的可销毁bean 会存储于 beanFactory 的成员当中
自定义的scope 的可销毁bean 会存储于对应的域对象中
prototype scope 不会存储,需要自己找到此对象销毁
—— 存储时都会封装为 DiposableBeanAdapter 类型对销毁方法的调用进行适配
阶段6 类型转换
如果 getBean 的 requiredType 参数与实际得到的对象类型不同,会尝试进行类型转换
阶段7 销毁
singleton bean 的销毁在 ApplicationContext.close 时,此时会找到所有的DisposableBean的名字逐一销毁
自定义的scope bean 的销毁在作用域对象生命周期结束时
prototype bean 的销毁 可以通过自己手动调用 AutowireCapableBeanFactory,destroyBean 方法执行销毁
销毁顺序
-
优先销毁后处理器 @PreDestroy
-
实现了DisposableBean 接口销毁
-
destroyMethod销毁(包含自定义名称,推断名称,AutoCloseable 接口 多选一)