Spring Bean 的生命周期

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

执行顺序

  1. aware接口

  2. 注解初始化 @PostConstruct

  3. 接口初始化 实现 InitializingBean,

    1. afterPropertiesSer() 实现方法

  4. 执行自定义初始化 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 方法执行销毁

销毁顺序

  1. 优先销毁后处理器 @PreDestroy

  2. 实现了DisposableBean 接口销毁

  3. destroyMethod销毁(包含自定义名称,推断名称,AutoCloseable 接口 多选一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值