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 生命周期的更多相关文章

  1. Spring之BeanFactory及Bean生命周期

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

  2. Bean生命周期及BeanFactory

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

  3. Spring Bean配置默认为单实例 pring Bean生命周期

    Bean默认的是单例的. 如果不想单例需要如下配置:<bean id="user" class="..." scope="singleton&q ...

  4. Spring Bean 生命周期2

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...

  5. Spring bean 生命周期验证

    一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...

  6. Spring:Bean生命周期

    关于Bean生命周期,我在网上找了两张图: 图1: 图2: 总结起来就是: Bean构建: Bean对象创建 > @Autowired | @Resource> @PostConstruc ...

  7. Spring事务,Bean生命周期

    一.事务相关: 1.Spring事务基于Spring AOP切面编程: 2.AOP基于代理模式,得到需要开启事务的代码的代理对象: 3.而没有开启事务的Service方法里调用了开启事务 @Trans ...

  8. 【不懂】spring bean生命周期

    完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...

  9. spring(二、bean生命周期、用到的设计模式、常用注解)

    spring(二.bean生命周期.用到的设计模式.常用注解) Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的. ...

  10. spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理

    1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...

随机推荐

  1. Go语言基准测试(benchmark)三部曲之一:基础篇

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于基准测试(benchmark) Go的标准库内置的 ...

  2. CSS 也能实现 if 判断?实现动态高度下的不同样式展现

    最近在群里,有个小伙伴问了这么一道很有趣的问题: CSS 能否实现,容器再某个高度下是某种表现,一旦超出某个高度,则额外展示另外一些内容 为了简化实际效果,我们看这么一张示意效果图: 可以看到,当容器 ...

  3. 01Java学习_概述

    概述 目录 概述 三个阶段 概述 历史(了解) Java 重要特点 开发工具 Java 运行机制及运行过程 下载和安装 JDK 配置环境变量 java 快速入门 博客中的图片内容全部采用 github ...

  4. Linux socket API

    socket是进程通信机制的一种,与PIPE.FIFO不同的是,socket即可以在同一台主机通信(unix domain),也可以通过网络在不同主机上的进程间通信(如:ipv4.ipv6),例如因特 ...

  5. python之封装及私有方法

    目录 封装 简洁 私有方法 封装:提高程序的安全性 将属性和方法包装到类对象中,在方法内部对属性进行操作,在类对象外部调用方法,使得程序更加简洁 在python中,如果该属性不希望在类对象外部被访问, ...

  6. Kubernetes 漫游:etcd

    概述 etcd 是一个基于 Raft 协议实现.开源的.分布式的键值存储系统.主要用于在分布式系统中提供强一致性和高可用性的数据存储. etcd 在 Kubernetes 中的作用如下: 集群状态数据 ...

  7. MySQL运行在docker容器中会损失多少性能

    前言 自从使用docker以来,就经常听说MySQL数据库最好别运行在容器中,性能会损失很多.一些之前没使用过容器的同事,对数据库运行在容器中也是忌讳莫深,甚至只要数据库跑在容器中出现性能问题时,首先 ...

  8. java当中组件和窗口的相容问题(里面包含了这些方法的作用)

    窗口也称为容器,在书中大部分称为容器,这里主要讲的是底层容器. JFrame():创建一个无标签的窗口. JFrame(String s):创建标题为s的窗口 setBounds(int a,int ...

  9. [USACO2007NOVG] Telephone Wire G

    题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...

  10. 【Postman&JMeter】使用Postman和JMeter进行signature签名

    使用Postman和JMeter进行signature签名 目录 使用Postman和JMeter进行signature签名 一.前言 二.v0接口 1.Postman 2.JMeter 三.v1接口 ...