Solon —— 容器

说明

Solon 的核心概念有 IoC、AOP 和本地事件总线。有人常常有误解以为 IoC 和 AOP 是 Spring 提出的,其实这两种思想在Spring 之前就已经有了,但 Spring 把这两个思想在技术上落地和推广做得很好,让 Ioc 和 AOP 广为人知。

核心概念

IoC

Ioc 的全称是 Inversion of Control,是控制反转或者反转控制的意思。它是一种思想,主要解决的是对象创建和管理的问题,用于解耦依赖。Ioc有时也被称为 DI (Dependency Injection),依赖注入。在使用 IoC 的过程中,我们是通过容器来创建和管理对象的,我们也是从容器中获取对象,所以,有时我们会听到 IoC 就是容器的说法,可能只是简化的一种说法。

AOP

AOP, 全称 Aspect Oriented Programming,是面向切面编程。AOP 的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。其中涉及的核心有代理,切点,切面。

本地事件总线

本地事件总线是 Solon 在应用生命周期提供的扩展机制,应用可以根据需要的事件时机点,订阅响应的事件。本地事件总线支持自定义的事件。

注意:

  1. 本地事件总线是基于应用生命周期的(应用的启停,插件的启停,bean 创建等),而不是基于业务,如果是涉及业务,可以使用使用作者的另一个作品 DamiBus。
  2. 要在事件发生前订阅事件,否则会错过时机,无法接收到事件消息。

应用生命周期

应用生命周期,是应用程序从 启动到最后停止的整个过程。应用生命周期当中存在一些关键点,可称为时机点。

SolonApp 的应用生命周期如下图所示,其中时机点包括有:一个初始化函数时机点 + 六个应用事件时机点 + 三个插件生命时机点 + 两个容器生命时机点。

作者的这张图画的很细致,一步步的把这个图走完,能加深对 Solon 的理解。

在这里插入图片描述

一个初始化函数时机点

应用开发时可扩展的时机。

@SolonMain
public class App {public static void main(String[] args) {Solon.start(App.class, args, (app) -> {//应用初始化时机点});} 
}

六个应用事件时机点

应用开发时可扩展的时机。

事件说明备注
6.AppInitEndEvent应用初始化完成事件只支持手动订阅
8.AppPluginLoadEndEvent应用插件加载完成事件只支持手动订阅
b.AppBeanLoadEndEvent应用Bean加载完成事件(即扫描完成)
e.AppLoadEndEvent应用加载完成事件(即启动完成)
::运行
g.AppPrestopEndEvent应用预停止事件
j.AppStopEndEvent应用停止事件

三个插件生命时机点

插件开发时可扩展的时机。

接口执行时机说明
7.start在应用初始化完成后执行启动
f.prestop在 ::stop 前执行预停止
h.stop在 Solon::stop 时执行停止(启用安全停止时,prestop 后等几秒再执行 stop)

两个容器生命时机点

Solon 内部的时机点,应用开发不可扩展。

接口执行时机说明
d.start在扫描完成之后执行启动
i.stop在 Solon::stop 时执行,在插件(h.stop)后执行停止

Bean 生命周期

在这里插入图片描述

被容器托管的 Bean,它的生命周期只限定在容器内部。

::new()

就是调用构造函数,是在 Bean 被扫描时,且符合条件才会执行。

注意,这个时候,Bean 还注册到容器中,还不能使用注入的字段(还未注入)。如果要初始化,推荐使用@Init 函数。

@Inject

开始执行注入。之后就会注册到容器,并通知订阅者。

start() 或 @Init

执行初始化动作,在 AppContext::start() 开始处被执行。如果使用 start() 需要实现 LifecycleBean 接口。此时 Bean 扫描已完成,理论上所有的 Bean 都已进入容器(某些特殊的 Bean 是在 AppContext.start() 时才生产的),并且所有 Bean 的字段都已完成注入。

postStart()

开始之后,AppContext::start() 结束处被执行,一般用于启动一些任务。如果使用 postStart() 需要实现 LifecycleBean 接口。

preStop()

预停止,AppContext::preStop() 时被执行。一般用来做分布式服务注销之类。如果使用 preStop() 需要实现 LifecycleBean 接口。

stop() 或 @Destroy

停止,AppContext::stop() 时被执行。一般用来做安全停止。如果使用 stop() 需要实现 LifecycleBean 接口。

容器应用

在 Solon 中,我们可以自由的选择用注解的方式,还是手动的方式来实现想要的功能。但在这里我们主要讲解注解的使用方式。

扫描

扫描一般是深度遍历指定“包名”下的 .class 文件获取类名,再通过类名从类加载器里获取元信息。

默认情况下,主类所在包名新的类都会扫描。如果需要修改导入的范围可以使用 @Import 注解,增加扫描的包名,或者导入需要的类名。

构建 / 注入

在 Solon 中,我们通过Singleton,Configuration,Bean,Component,Controller,Remoting等方式产生Bean,在Bean 对象中,我们可以 @Inject 注解注入字段。在构建和注入中需要注意的可能是条件构建和依赖注入的部分了。

注解说明
@Inject *注入托管对象(by type)
@Inject(“name”)注入托管对象(by name)
@Inject(“${name}”)注入配置(可由基础类型或结构体接收)
@Singleton单例申明(Solon 默认是单例)
@Singleton(false)非单例
@Configuration托管配置组件类(与 @Inject, @Bean 共同完成初始化配置、构建托管对象等)
@Bean配置托管对象(作用在 @Configuration 类的函数上,才有效)
@Component托管组件(支持自动代理,v2.5.2 开始支持自动代理)
@Controller控制器组件类(支持函数拦截)
@Remoting远程控制器类(有类代理;即RPC服务端)
条件构建

条件构建的意思是满足了指定条件才会构建。通过使用 @Condition 来实现,它包含如下的属性:

属性说明
onClass有类(只能一个;其实没必要多个)
onClassName有类名
onProperty有属性
onMissingBean没有 Bean
onMissingBeanName没有 Bean Name
onBean有 Bean
onBeanName有 Bean Name

更多细节,查看官网 https://solon.noear.org/article/434 。

依赖注入

依赖注入的意思是,在构建时需要使用到其他 Bean 对象。依赖注入通常使用@Configuration,配合@Bean 来实现,其中 @Bean 的函数通过参数注入的方式来获取需要的 Bean 对象。另外就是使用手动模式通过异步订阅的方式获取依赖的 Bean 对象。

以下注入的例子来自官网,更多细节,查看官网 https://solon.noear.org/article/587 。

@Configuration
public class DemoConfig {@Bean(name="db1", typed=true)public DataSource db1(@Inject("${demo.db1}") DataSource ds){ return ds;}@Beanpublic void db1Test(@Db("db1") UserMapper mapper) { //这个注入,依赖“db1”的数据源return mapper.initUsers();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20849.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL: CREATE DATABASE dbname; 人大金仓(Kingbase): 在人大金仓中,CREATE DATABASE 的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持…

《DeepSeek 一站式工作生活 AI 助手》

最近国产AI工具DeepSeek在全球火出圈,登顶多个国家应用商店,下载量一路飙升。这匹AI “黑马” 到底凭什么征服全球用户?让我们全方位解锁DeepSeek——从基础入门到高阶玩法,从实用技巧到隐藏功能。 DeepSeek是一款功能强大的国产A…

php-fpm

摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI进程,提升PHP应用的性能和稳定性 php-fpm是一个高性能的php FastCGI管理器,提供了更好的php进程管理方式,可以有效的控制内存和进程,支…

istio实现灰度发布,A/B发布, Kiali网格可视化(二)

代码发布是软件开发生命周期中的一个重要环节,确保新功能和修复能够顺利上线。以下是几种常见的代码发布流程。在学习灰度发布之前。我们首先回忆下代码发布常用的几种方法。 A/B(蓝绿)发布: 蓝绿部署是一种通过维护两套独立的环…

从零搭建微服务项目Base(第7章——微服务网关模块基础实现)

前言: 在前面6章的学习中已经完成了服务间的调用实现,即各微服务通过nacos或eureka服务器完成服务的注册,并从nacos中拉取配置实现热更新。当某个服务接口需要调用其他服务时,通过feign定义接口,并通过注解配置服务名…

【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示

异常问题: 这个是在新版的pycharm中出现的,出现的问题,点击view后不全部显示,而是以...折叠显示 在setting中这么设置一下就好了: 解决办法: https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

LearnOpenGL——高级OpenGL(下)

教程地址:简介 - LearnOpenGL CN 高级数据 原文链接:高级数据 - LearnOpenGL CN 在OpenGL中,我们长期以来一直依赖缓冲来存储数据。本节将深入探讨一些操作缓冲的高级方法。 OpenGL中的缓冲本质上是一个管理特定内存块的对象,它…

nodejs及搭建

java项目可以运行在tomcat服务器,开始完成前后端完全分离。前端有自己独立的工程。我们需 要把前端独立的工程运行起来。---运行在nodejs服务器下。 1.安装nodejs 检验是否安装过 node --version 2.安装npm java项目需要依赖jar,安装maven。 前端项目…

Jenkins插件管理切换国内源地址

安装Jenkins 插件时,由于访问不了国外的插件地址,会导致基本插件都安装失败。 不用着急,等全部安装失败后,进入系统,修改插件源地址,重启后在安装所需插件。 替换国内插件更新地址 选择:系统…

关于uniApp的面试题及其答案解析

我的血液里流淌着战意!力量与智慧指引着我! 文章目录 1. 什么是uniApp?2. uniApp与原生小程序开发有什么区别?3. 如何使用uniApp实现条件编译?4. uniApp支持哪些平台,各有什么特点?5. 在uniApp中…

2025年2月9日(数据分析_2)

散点图 from matplotlib import pyplot as plt from matplotlib import font_manager # 字体相关# 字体 font_path = r"C:\Windows\Fonts\msyh.ttc" my_font = font_manager.FontProperties(fname=font_path)x = list(range(31)) x2 = list(range(31, 62)) a3 = [11…

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件,已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …

【插件】前端生成word 文件

文章目录 1、背景2、方式一:html-docx-js2.1 具体代码2.2 前端生成word文件的样式2.3 总结 3、方式二:pizzip docxtemplater3.1 具体代码3.2 前端生成word文件的样式3.3 总结 4、参考链接 1、背景 在实际开发中,业务需要,需要把数…

大道至简 少字全意 易经的方式看 缓存 mybatis缓存 rendis缓存场景 案例

目录 介绍 mybatis缓存 一级缓存 1.是什么 2.特点 3.场景 mybatis 二级缓存 1.是什么 2.特点 3.配置步骤 注意 一级缓存问题 二级缓存问题 扩展 1.MyBatis集成 Redis 2.直接使用Redis redis 缓存 一、String 字符串 二、Llst 列表 三、Hash 哈希 四、Set…

RocketMQ消息是如何储存的?

前言 之前有写过关于kafka的存储结构的文章。RocketMQ大部分是借鉴了Kafka的设计原理,但是副本集群机制和存储结构有些差异。看完本篇文章可以看看这篇。消息中间件之kafka RocketMQ 的消息存储机制是其高吞吐、高可用和高可靠性的关键。以下将介绍 RocketMQ 消息存…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Coze扣子怎么使用更强大doubao1.5模型

最近,豆包刚刚发布了最新的doubao1.5系列模型,并且加量不加价。 在性能极大进步的情况下,价格还与之前一致。真是业界良心了。 在同样的价格下,肯定要使用性能更强大的模型嘛 于是我准备把所有的智能体和工作流切换到doubao1.5…

UEditorPlus v4.3.0 已知问题修复,表格自适应,全屏编辑优化

UEditor 是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更…

【核心算法篇十四】《深度解密DeepSeek量子机器学习:VQE算法加速的黑科技与工程实践》

在经典计算机逼近物理极限的今天,量子计算正以指数级加速潜力颠覆传统计算范式。想象一下,一个需要超级计算机运算千年的化学分子模拟问题,用量子计算机可能只需几分钟——这就是DeepSeek团队在VQE(Variational Quantum Eigensolver)算法加速实践中创造的奇迹。根据,VQE作…