Solon2 的 Bean 生命周期
Solon 框架的 Bean 是被容器托管的,所以它的生命周期只限定在容器内部:
| 时机点 | 说明 | 补充 |
|---|---|---|
| AopContext::new() 是在应用初始化时执行 | ||
| ::new() | AopContext::beanScan() 时,符合条件的才会被构造 | 此时,未登记到容器 |
| afterInjection() | 所有字段注入后执行(需要实现 InitializingBean 接口) | v2.2.0 后支持 |
| ::登记到容器;并发布通知;订阅它的注入会被执行 | ||
| @Init | AopContext::start() 时执行。会根据依赖关系自动排序 | |
| start() | 同上(需要实现 LifecycleBean 接口) | v2.2.0 后支持 |
| stop() | AopContext::stop() 时执行(需要实现 LifecycleBean 接口) | v2.2.0 后支持 |

1、时机点介绍
::new()
即构建函数。是在 Bean 被扫描时,且符合条件才会执行。此时,还未入进容器
afterInjection()
需要实现 InitializingBean 接口。当所有字段完成注入后,才会执行。提示:
- 只能确保同步注入的内容是绝对可用
- 字段注入的 Bean ,它自身的 Bean 注入字段有可能未完成(可能仍在订阅等待中)
- 如果有字段一直未注入,则函数不会被触发!!!
@Init 和 start() 效果相同
都是在 AopContext::start() 时被执行。其中 start() 需要 实现 LifecycleBean 接口。此时 Bean 扫描已完成,一般的 Bean 都已进入容器。理论上:
- 所有的 Bean 都已产生
- 所有 Bean 的字段,都已完成注入
偶有些 Bean 是在 AopContext.start() 时才生产的,例外!
stop()
是在 AopContext::stop() 时被执行。也就是应用停止时被执行。时机时,比插件的 stop() 要晚一点。
2、应用
a)一般的组件
@Component
public class DemoCom{
}
b)实现 InitializingBean 接口的组件
@Component
public class DemoCom implements InitializingBean{
@Override
public void afterInjection(){
//当所有字段完成注入后,才会执行(如果有字段一直未注入,则函数不会被触发)
}
}
c)实现 LifecycleBean 接口的组件
这个接口,只对单例有效。非单例,仅扫描时产生的实例会被纳管。其它实例的生命周期要自己处理。
@Component
public class DemoCom implements LifecycleBean{
@Override
public void afterInjection(){
//当所有字段完成注入后,才会执行(如果有字段一直未注入,则函数不会被触发)
}
@Override
public void start(){
//在 AopContext:start() 时被调用。此时所有bean扫描已完成,订阅注入已完成
}
@Override
public void stop(){
//在 AopContext:stop() 时被调用。一般做些释放或停止类的工作
}
}
d)带 @Init 注解的组件
@Init 注解函数,与 LifecycleBean::start() 时机点相同。
@Component
public class DemoCom{
@Init
public void init(){
//在 AopContext:start() 时被调用。此时所有bean扫描已完成,订阅注入已完成
}
}
Solon2 的 Bean 生命周期的更多相关文章
- Spring之BeanFactory及Bean生命周期
1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...
- Bean生命周期及BeanFactory
1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...
- Spring Bean配置默认为单实例 pring Bean生命周期
Bean默认的是单例的. 如果不想单例需要如下配置:<bean id="user" class="..." scope="singleton&q ...
- Spring Bean 生命周期2
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...
- Spring bean 生命周期验证
一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...
- Spring:Bean生命周期
关于Bean生命周期,我在网上找了两张图: 图1: 图2: 总结起来就是: Bean构建: Bean对象创建 > @Autowired | @Resource> @PostConstruc ...
- Spring事务,Bean生命周期
一.事务相关: 1.Spring事务基于Spring AOP切面编程: 2.AOP基于代理模式,得到需要开启事务的代码的代理对象: 3.而没有开启事务的Service方法里调用了开启事务 @Trans ...
- 【不懂】spring bean生命周期
完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...
- spring(二、bean生命周期、用到的设计模式、常用注解)
spring(二.bean生命周期.用到的设计模式.常用注解) Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的. ...
- spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理
1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...
随机推荐
- Idea单窗口导入多个项目模块
现在我们比较流行微服务,但是服务一旦多了,项目打开也是很麻烦的,运行内存16个G的电脑,基本上打开4,5个项目模块就顶不住了.那么,我们怎么把多个项目导入到一个idea窗口中呢? 实现效果 导入步骤 ...
- 高性能队列——Disruptor(转)
https://tech.meituan.com/disruptor.html 背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中 ...
- JUC并发编程学习(十三)ForkJoin
ForkJoin 什么是ForkJoin ForkJoin在JDK1.7,并发执行任务!大数据量时提高效率. 大数据:Map Reduce(把大任务拆分成小任务) ForkJoin特点:工作窃取 为什 ...
- cookie、session、web storage
cookie与session的区别 首先,使用cookie和session的目的都是为了跟踪记录用户状态,因为http协议是无状态的协议,而某些场景服务端需要记录用户的状态,如购物车,需要来识别具体的 ...
- 【Android】学习day05|RadioButton
注意事项:当使用默认选中标签:check时,必须要给标签加id,否则失效. 这个没什么,挺简单的,就记录一下代码[监听事件] package com.example.app02; import and ...
- nacos 安装和使用
Nacos 是阿里巴巴开源项目,用于构建微服务应用的服务发现.配置管理和服务管理. 在微服务项目中不同模块之间服务调用时,实现服务注册与发现. Nacos 使用: Nacos 是java开发的,依赖 ...
- [ARC161F] Everywhere is Sparser than Whole (Judge)
Problem Statement We define the density of a non-empty simple undirected graph as $\displaystyle\fra ...
- [ABC266G] Yet Another RGB Sequence
Problem Statement You are given integers $R$, $G$, $B$, and $K$. How many strings $S$ consisting of ...
- bash shell笔记整理——which和whereis命令
which和whereis命令作用 which:显示给定命令所在路径 whereis:相比which更完善,显示命令路径.man文件路径(如果有).源代码路径 which语法 which [optio ...
- C#与数据库访问技术之ExecuteNonQuery方法
ExecuteNonQuery方法主要用来更新数据. 通常使用它来执行Update.Insert和Delete语句. 该方法返回值意义如下: 对于Update.Insert和Delete语句,返回值为 ...