Solon2 之基础:四、应用启动过程与完整生命周期
串行的处理过程(含六个事件扩展点 + 两个函数扩展点),代码直接、没有什么模式。易明
提醒:
- 启动过程完成后,项目才能正常运行(启动过程中,不能把线程卡死了)
- AppBeanLoadEndEvent 之前的事件,需要启动前通过
EventBus.subscribe(...)
订阅
1、事件订阅示例
- AppLoadEndEvent
@Component
public class AppLoadEndEventListener implements EventListener<AppLoadEndEvent>{
@Override
public void onEvent(AppLoadEndEvent event) throws Throwable {
//event.app(); //获取应用对象
}
}
- AppStopEndEvent,v2.1.0 后支持
@Component
public class AppStopEndEventListener implements EventListener<AppStopEndEvent>{
@Override
public void onEvent(AppStopEndEvent event) throws Throwable {
//event.app(); //获取应用对象
}
}
2、插件在应用生命周期里的时机点
插件的本质,即在应用生命周期中获得关键执行时机的接口。从而有效获得应用扩展能力。
- 插件接口 Plugin
@FunctionalInterface
public interface Plugin {
void start(AopContext context) throws Throwable;
default void prestop() throws Throwable{}
default void stop() throws Throwable{}
}
- 执行时机
接口 | 执行时机 | 说明 |
---|---|---|
start | 在 7 时机点执行 | 启动 |
prestop | 在 ::stop 前执行 | 预停止 |
stop | 在 ::ShutdownHook 时执行 | 停止(启用安全停止时,prestop 后等几秒再执行 stop) |
3、注解能力注册的合适时机点
- 比如,时机点5
public class DemoApp{
public void static main(String[] args){
Solon.start(DemoApp.clas, args, app->{
//比如注册Demo注解
Solon.context().beanAroundAdd(DemoAop.class, new DemoInterceptor());
});
}
}
- 比如,时机点6(借用 SolonBuilder,提前注册事件)
public class DemoApp{
public void static main(String[] args){
new SolonBuilder().onAppInitEnd(e -> {
//...时机点6
}).onAppLoadEnd(e->{
//...时间点e
}).start(JobApp.class, args);
}
}
- 比如,时机点7,通过插件机制。(如果是独立插件,请另参考 《插件扩展机制》)
定义一个插件
public class DemoPluginImp implements Plugin {
@Override
public void start(AopContext context) {
//比如注册Demo注解
context.beanAroundAdd(DemoAop.class, new DemoInterceptor());
}
}
//可通过[时机点5]注册插件
public class DemoApp{
public void static main(String[] args){
Solon.start(DemoApp.clas, args, app->{
app.pluginAdd(0, new DemoPluginImp()); //此处注册的插件,会在[时机点7]运行
});
}
}
//或可通过 app.yml 的配置,借用[时机点4]申明插件
//solon.plugin: "xxx.xxx.DemoPluginImp"
Solon2 之基础:四、应用启动过程与完整生命周期的更多相关文章
- 【IOS6.0 自学瞎折腾】(五)应用程序的启动过程和Application生命周期
一 :main函数入口 看下项目资源结构,其实程序的入口也是在main.m里面. #import <UIKit/UIKit.h> #import "BvinAppDelegate ...
- SpringBoot IoC启动流程、初始化过程及Bean生命周期各个阶段的作用
目录 SpringBoot IoC启动流程.初始化过程及Bean生命周期各个阶段的作用 简述 首先明确IoC容器是啥 准备-SpringApplication的实例化 启动-SpringApplica ...
- 小程序基础知识点讲解-WXML + WXSS + JS,生命周期
小程序基础 小程序官方地址,小程序开发者工具,点击此处下载.在微信小程序中有一个配置文件project.config.json,此文件可以让开发者在不同设备中进行开发. 微信小程序共支持5种文件,wx ...
- JavaEE基础(01):Servlet实现方式,生命周期执行过程
本文源码:GitHub·点这里 || GitEE·点这里 一.Servlet简介 Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用S ...
- Android基础_1 四大基本组件介绍与生命周期
Android四大基本组件分别是Activity,Service(服务),Content Provider(内容提供者),BroadcastReceiver(广播接收器). 一.四大基本组件 Acti ...
- 1. spring5源码 -- Spring整体脉络 IOC加载过程 Bean的生命周期
可以学习到什么? 0. spring整体脉络 1. 描述BeanFactory 2. BeanFactory和ApplicationContext的区别 3. 简述SpringIoC的加载过程 4. ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- JavaEE基础(01):Servlet实现方式,生命周期执行...
一.Servlet简介Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库 ...
- SpringBean容器启动流程+Bean的生命周期【附源码】
如果对SpringIoc与Aop的源码感兴趣,可以访问参考:https://javadoop.com/,十分详细. 目录 Spring容器的启动全流程 Spring容器关闭流程 Bean 的生命周期 ...
- 【Android基础】Fragment 详解之Fragment生命周期
上一篇文章简单介绍了一下Fragment,这一篇文章会详细的说一下Fragment的生命周期和创建一个用户界面. Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的 ...
随机推荐
- [Python急救站]打印菱形
打印菱形程序 row = int(input("请输入要打印的列数: ")) #打印上面三角 for i in range(row): # i控制行数 for j in range ...
- 一起来探索CSS中margin属性的奥秘吧!!
作者:WangMin 格言:努力做好自己喜欢的每一件事 众所周知 margin属性 是用来声明当前所设置或者指定元素所有外边距的宽度,或者设置各边上外边距的宽度.一直以来我认为它是一个很简单的属性,但 ...
- postgresql 去重计数改写案例
最近帮忙在搞一个内网报表系统的项目,里面的逻辑比较复杂,很多视图套视图的语句. 最多的一个视图除了它本身以外,一层层嵌套了7个视图在里面,贼恶心. SQL遇到性能问题只能每一层视图捋清对象关系来排查缓 ...
- C/C++字符函数库<ctype.h>/<cctype>(常用)
头文件:<ctype.h> 形式:int 函数(int c) 参数:传入的一定是一个字符或者EOF 返回值:满足条件返回非0(true),否则返回0: int isalnum(int c ...
- 支持向量机SVM:从数学原理到实际应用
本篇文章全面深入地探讨了支持向量机(SVM)的各个方面,从基本概念.数学背景到Python和PyTorch的代码实现.文章还涵盖了SVM在文本分类.图像识别.生物信息学.金融预测等多个实际应用场景中的 ...
- .NET 8 Video教程介绍(开篇)
教程简介 本文将简单描述视频网站教程,视频网站是一个类似于腾讯视频一样的网站,视频资源用户自己上传,然后提供友好的界面查看视频和搜索视频,并且提供管理页面对于视频进行管理,我们将使用Blazor作为前 ...
- Flask 运用Xterm实现交互终端
Xterm是一个基于X Window System的终端仿真器(Terminal Emulator).Xterm最初由MIT开发,它允许用户在X Window环境下运行文本终端程序.Xterm提供了一 ...
- 一文搞定K8S监控告警平台选型
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享 前言 最近在搞K8S的监控告警平台选型,对比了目前比较流行两款开源平台kube-prometheus.夜莺,也踩了一些坑分享 ...
- 使用汇编和反汇编引擎写一个x86任意地址hook
最简单的Hook 刚开始学的时候,用的hook都是最基础的5字节hook,也不会使用hook框架,hook流程如下: 构建一个jmp指令跳转到你的函数(函数需定义为裸函数) 保存被hook地址的至少5 ...
- ez_curl【代码审计】
ez_curl[代码审计][难度:4] 题目描述 代码审计类题目,附上代码: <?php highlight_file(__FILE__); $url = 'http://back-end:30 ...