当前位置: 首页 > 工具软件 > Solon > 使用案例 >

Solon 框架详解(二)- Solon的核心

田德馨
2023-12-01

Solon详解系列文章:
Solon详解(一)- 快速入门
Solon详解(二)- Solon的核心
Solon详解(三)- Solon的web开发
Solon详解(四)- Solon的事务传播机制
Solon详解(五)- Solon扩展机制之Solon Plugin
Solon详解(六)- Solon的校验框架使用、定制与扩展
Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330
Solon详解(八)- Solon的缓存框架使用和定制
Solon详解(九)- 渲染控制之定制统一的接口输出
Solon详解(十)- 怎么用 Solon 开发基于 undertow jsp tld 的项目?

Solon 的核心

在上篇中我们成功运行了一个简单的web应用;本篇将对它的启动过程、扩展体系和应用属性配置进行介绍。

(一)Solon.start(source, args, builder) 内部执行过程(即Solon的启动过程)

  • 1.实例化 Solon.global() 并加载配置
  • 2.加载扩展文件夹
  • 3.扫描插件并排序
  • 4.运行 initialize 函数
  • 5.推送 AppInitEndEvent [事件]
  • 6.运行插件
  • 7.推送 PluginLoadEndEvent [事件]
  • 8.导入java bean(@Import)
  • 9.扫描并加载java bean
  • a.推送 BeanLoadEndEvent [事件]
  • b.加载渲染印映关系
  • c.执行bean加完成事件
  • d.推送 AppLoadEndEvent [事件]
  • e.结束

了解这个过程非常之重要,尤其是有兴致开发插件的同学:你的插件在运行之前,配置已经存在了,但java bean仍未加载。

(二)Plugin 插件体系

Solon 的插件也可以叫扩展组件,相当于Spring 的 starter。Solon已经提供了大量的基础插件,但对第三方的框架适配目前较少。

插件说明
Boot 插件::说明
org.noear:solon.boot.jlhttp*boot插件,对jlhttp适配,提供http服务(不自带session state)
org.noear:solon.boot.jetty*boot插件,对jetty适配,提供http服务(网友@khb提供)
org.noear:solon.boot.undertow*boot插件,对undertow适配,提供httpwebsocket服务(网友@tyk提供)
org.noear:solon.boot.websocketboot插件,对java-websocket适配,提供websocket服务
org.noear:solon.extend.jetty.jsp扩展插件,为jetty添加jsp支持包(不建议使用jsp)(网友@khb提供)
org.noear:solon.extend.jetty.websocket扩展插件,为jetty添加websoekct支持包
org.noear:solon.extend.undertow.jsp扩展插件,为undertow添加jsp支持(不建议使用jsp)(网友@tyk提供)
SocketD boot插件::说明
org.noear:solon.boot.socketd.jdksocketboot插件,对jdk-socket适配,提供socketd服务
org.noear:solon.boot.socketd.nettyboot插件,对netty适配,提供socketd服务
org.noear:solon.boot.socketd.rsocketboot插件,对rsocket适配,提供socketd服务
org.noear:solon.boot.socketd.smartsocketboot插件,对smartboot-socket适配,提供socketd服务
org.noear:solon.boot.socketd.websocketboot插件,对java-websocket适配,提供socketd服务
静态文件支持插件::说明
org.noear:solon.extend.staticfiles扩展插件,添加静态文件支持(监视 resources/static 文件夹)
切面支持插件::说明
org.noear:solon.extend.aspect扩展插件,添加Dao、Service注解支持;进而支持类的代理模式
数据操作支持插件::说明
org.noear:solon.extend.data扩展插件,实现事务和缓存的注解支持
验证操作支持插件::说明
org.noear:solon.extend.validation扩展插件,实现验证类注解支持
Yaml配置支持插件::说明
org.noear:solon.extend.properties.yaml扩展插件,添加yml配置文件支持
定时任务支持插件::说明
org.noear:solon.extend.schedule扩展插件,实现定时任务支持(和 cron4j-solon-plugin 风格不同)
远程关闭支持插件::说明
org.noear:solon.extend.stop扩展插件,实现远程关闭支持
Session插件::说明(可将boot插件的session state服务,自动换掉)
org.noear:solon.extend.sessionstate.local扩展插件,本地session
org.noear:solon.extend.sessionstate.redis扩展插件,分布式session(其于redis构建)
org.noear:solon.extend.sessionstate.jwt扩展插件,分布式session(其于jwt构建)
序列化插件::说明
org.noear:solon.serialization.fastjson*序列化插件,对 fastjson 适配,提供json视图输出 或 序列化输出
org.noear:solon.serialization.snack3*序列化插件,对 snack3 适配,提供json视图输出 或 序列化输出
org.noear:solon.serialization.jackson序列化插件,对 jackson 适配,提供json视图输出 或 序列化输出
org.noear:solon.serialization.hession*序列化插件,对 hession 适配,提供 hession 序列化输出
org.noear:solon.serialization.protostuff*序列化插件,对 protostuff 适配,提供 protostuff 序列化输出
视图插件::说明(可置多个视图插件)
org.noear:solon.view.freemarker*视图插件,对 freemarker 适配,提供html视图输出
org.noear:solon.view.jsp视图插件,对 jsp 适配,提供html视图输出
org.noear:solon.view.velocity视图插件,对 velocity 适配,提供html视图输出
org.noear:solon.view.thymeleaf视图插件,对 thymeleaf 适配,提供html视图输出
org.noear:solon.view.beetl视图插件,对 beetl 适配,提供html视图输出
org.noear:solon.view.enjoy视图插件,对 enjoy 适配,提供html视图输出
Solon 与 Springboot 融合适配插件::说明
org.noear:solon-springboot-starterspringboot 适配插件
Solon 第三方框架适配插件::说明
org.noear:beetlsql-solon-pluginbeetlsql 适配插件
org.noear:mybatis-solon-pluginmybatis 适配插件
org.noear:mybatis-sqlhelper-solon-pluginmybatis-sqlhelper 适配插件
org.noear:weed3-solon-pluginweed3 适配插件
org.noear:cron4j-solon-plugincron4j 适配插件
org.noear:quartz-solon-pluginquartz 适配插件
org.noear:dubbo-solon-plugindubbo 适配插件
org.noear:feign-solon-pluginfeign 适配插件
org.noear:hasor-solon-pluginhasor 适配插件
org.noear:luffy-solon-pluginluffy 适配插件
org.noear:sureness-solon-pluginsureness 适配插件
Solon Cloud 第三方框架适配插件::说明(提供分布式与微服务开发支持)
org.noear:consul-solon-pluginconsul 适配插件(支持Solon cloud 配置服务、注册与发现服务)
org.noear:nacos-solon-pluginnacos 适配插件(支持Solon cloud 配置服务、注册与发现服务)
org.noear:zookeeper-solon-pluginzookeeper 适配插件(支持Solon cloud 配置服务、注册与发现服务)
org.noear:water-solon-pluginwater 适配插件(支持Solon cloud 配置服务、注册与发现服务、事件总线服务、日志服务、跟踪服务、锁服务)
org.noear:rabbitmq-solon-pluginrabbitmq 适配插件(支持Solon cloud 事件总线服务)
org.noear:rocketmq-solon-pluginrocketmq 适配插件(支持Solon cloud 事件总线服务)
org.noear:mqtt-solon-pluginmqtt 适配插件(支持Solon cloud 事件总线服务)
org.noear:kafka-solon-pluginkafka 适配插件(支持Solon cloud 事件总线服务)
org.noear:guava-solon-pluginguava 适配插件(支持Solon cloud 融断服务)
org.noear:sentinel-solon-pluginsentinel 适配插件(支持Solon cloud 融断服务)
org.noear:semaphore-solon-pluginsemaphore 适配插件(支持Solon cloud 融断服务)
org.noear:aliyun-oss-solon-pluginaliyun-oss 适配插件(支持Solon cloud 分布式文件服务)
org.noear:aws-s3-solon-pluginaws-s3 适配插件(支持Solon cloud 分布式文件服务)
org.noear:snowflake-id-solon-pluginsnowflake 算法适配插件(支持Solon cloud 分布式ID服务)
Nami框架(Remoting client)::说明(通道 + 编码器)
org.noear:namiNami内核(支持http, socket, web socket)
org.noear:nami.channel.http.hutoolNami http通道
org.noear:nami.channel.http.okhttpNami http通道
org.noear:nami.channel.socketd.jdksocketNami socketd通道-基于bio实现
org.noear:nami.channel.socketd.nettyNami socketd通道-基于nio,netty实现
org.noear:nami.channel.socketd.rsocketNami socketd通道-基于rsocket实现
org.noear:nami.channel.socketd.smartsocketNami socketd通道-基于aio实现
org.noear:nami.channel.socketd.websocketNami socketd通道-基于websocket实现
org.noear:nami.coder.fastjsonNami json编码器
org.noear:nami.coder.hessianNami hessian编码器
org.noear:nami.coder.jacksonNami jackson编码器
org.noear:nami.coder.protostuffNami protostuff编码器
org.noear:nami.coder.snack3Nami json编码器

怎么使用?直接在pom.xml中添加依赖即可。

(三)应用属性配置文件

Solon项目会使用一个全局的属性配置文件 application.properties 或者是 application.yml,在resources目录下。

Solon会根据在pom.xml中依赖的jar包进行自动配置,当我们要对这些jar包对应的框架进行配置又该怎么办呢?没错,可以在全局配置文件(application.properties 或者是 application.yml)中进行配置,如http server的端口配置等。

a.基础约定(不能改,为了简化套路)
//资源路径说明(不用配置;也不能配置)
resources/application.properties(或 application.yml) 为应用配置文件
resources/static/ 为静态文件根目标
resources/WEB-INF/view/ 为视图模板文件根目标(支持多视图共存)

//调试模式:
启动参数添加:-debug=1 或 --debug=1
b.端口配置(以使用 application.yml 为例)
server.port: 8080
c.请求包大小限制
server.request.maxRequestSize: 2Mb
d.会话超时
server.session.timeout: 3600 #单位:s
e.视图引擎配置(可多引擎共享)

原则上不要加这些配置,更不要修改;想用哪个模板,加哪个组件即可(有利于简化套路)

#默认的配置(不需要改配置,除非要修改)
solon.view.mapping.htm: BeetlRender #简写
solon.view.mapping.shtm: EnjoyRender
solon.view.mapping.ftl: FreemarkerRender #默认的模板引擎
solon.view.mapping.jsp: JspRender
solon.view.mapping.html: ThymeleafRender
solon.view.mapping.vm: org.noear.solon.view.velocity.VelocityRender #引擎全名(一般用简写)
f.分布式session配置

当添加org.noear:solon.extend.sessionstate.redis组件时,即切换为分布式session,需要以下配置了(它基于redis包装;也可以基于接口自己造一个):

# 当使用 sesstionstate.redis 的配置
server.session.state.redis.server: 127.0.0.1:6379
server.session.state.redis.password: xxx
server.session.state.redis.db: 31
server.session.state.redis.maxTotaol: 200
g.统一的日志

Solon默认没有对接外部日志框架,而是通过事件总线接收应用内所有的异常。

Solon.start(...).onEerror(err-> ..)
i.页面跳转
ctx.redirect("http://www.noear.org");
//or
Context.current().redirect("http://www.noear.org");

(四)其它配置说明

a.自定义属性

只要名字不冲突,随便加。例:

user.name: "lie lai"
b.属性引用(这个不支持;为了简化套路)
user.name: "lie lai"
message: "${user.name} 你好!" #这个不支持(有需要的时候,自己替换)
c.如何获取属性配置
//注解模式
@Inject("${user.name}")

//代码模式
Solon.cfg().get("user.name")
d.属性转对象

这个功能用起来会很方便,简化不少的代码编写。

//注解模式
//
@Configuration  // Configuration或别的类注解,都可
public class test{
    //注入字段,在任何托管Bean里有效
    //
    @Inject("${user}")
    UserModel user;
    
    //注入参数,只在@Configuration类有效
    //
    @Bean
    public Xxxxx buildXxxx(@Inject("${test.db1}") HikariDataSource dataSource){    
    
    }
}

//代码模式
UserModel user = Solon.cfg().getBean("user", UserModel.class);
HikariDataSource dataSource =  Solon.cfg().getBean("test.db1", HikariDataSource.class);

本篇到此结束,主要介绍了Solon中几个的问题:1,启动过程;2,扩展体系,3,应用属性配置,同时解决上篇中的几个问题,从下篇开始,将针对Solon的web开发进一步展开介绍。

附:Solon项目地址

 类似资料: