CrazyAirhead

疯狂的傻瓜,傻瓜也疯狂——傻方能执著,疯狂才专注!

0%

Solon —— 配置

说明

Spring Boot 流行起来的一个原因是简化了配置,其中约定优于配置减少了开发者的配置负担,无需配置或者少量的配置就可以启动项目;自动化配置根据项目依赖自动配置应用程序,简化了开发流程。Solon 作为后起之秀也是采用了约定优于配置和自动配置的方式来简化配置。

约定

配置分类

启动参数

启动参数,在应用启动后会被静态化,也就是不能再修改。在Java 启动时指定,通过--key=value的形式指定。

系统属性

系统属性,在应用启动后会被静态化,也就是不能再修改。在Java 启动时指定,通过-Dkey=value的形式指定。

环境变量

操作系统的环境变量。”solon” 开头的环境变量,会被框架同步到系统属性(System::getProperties)与应用属性(Solon::cfg)。

应用配置

应用通过配置文件加载进来的配置。

主配置文件

应用配置文件为 resources/app.yml 或者 app.properties,文件名不能修改也不能配置。

配置加载规则

应用配置的加载主要分了六个层级,其加载规则为:

  • 越静态的越前面
  • 越动态的越后面

因为配置是以“键”为单位,且后面加载的会盖掉前面加载的,所以最终效果就是配置以最后加载为准。

加载顺序为:

  1. 主配置文件,先是主配置文件(app.yml),之后是带环境的主配置(app-{env}.yml),这里不特别区分(yml或者properties)。
  2. 内部配置文件,通过 solon.config.load加载的 classpath 目录下的配置文件。
  3. 外部配置文件,通过 solon.config.add 加载的配置文件。
  4. 动态配置,启动应用时的配置,先是启动参数(–key=value),之后是系统属性(-Dkey=value),最后是环境变量(系统环境设置,或者docker -e 等方式指定)
  5. 启动时加载,通过 app.cfg().loadAdd 或者 app.cfg().loadEnv加载。
  6. 云端配置,通过分布式配置获取,如nacos。

配置引用规则

配置文件(或配置块)解析时,Solon.cfg() 已经存在的变量(或者配置块内的变量),可以被引用。属性之间的引用,使用 ${...}

1
2
3
4
test.demo1: "${db1.url}"                          #引用应用属性
test.demo2: "jdbc:mysql:${db1.server}" #引用应用属性并组合
test.demo3: "jdbc:mysql:${db1.server}/${db1.db}" #引用多个应用属性并组合
test.demo4: "${JAVA_HOME}" #引用环境变量test.demo5: "${.demo4}" #引用本级其它变量(v2.9.0 后支持)

常用配置

配置可能变更,所以直接看官网 https://solon.noear.org/article/174

注入配置

配置注入使用 ${...}的表达式,支持如下具体的配置:

  • ${xxx} 注入字段。
  • ${xxx:def} 注入字段,如果没有则提供 def 默认值,此时只支持单值接收,不支持集合或实体。
  • ${classpath:xxx.yml} 注入资源目录下的配置文件 xxx.xml

注入字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Component
public class DemoService{
//注入值(带默认值:demoApi),并开启自动更新(注意:如果不是单例,请不要开启自动刷新)
@Inject(value="${track.name:demoApi}", autoRefreshed=true)
static String trackName; //v3.0 后支持静态字段注入//注入值(没有时,不覆盖字段初始值)

@Inject("${track.url}")
String trackUrl = "http://x.x.x/track";

//注入配置集合
@Inject("${track.db1}")
Properties trackDbCfg;

//注入Bean(根据对应的配置集合自动生成并注入)
@Inject("${track.db1}")
HikariDataSource trackDs;
}

注入类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Inject("${user.config}")  
@Configuration
public class UserProperties{
public String name;
public List<String> tags;
...
}

@BindProps(prefix="user.config") //或者用绑定属性注解。v3.0.7 后支持
@Configuration
public class UserProperties{
public String name;
public List<String> tags;
...
}

@Configuration
public class DemoConfig {
@BindProps(prefix="user.config") //或者用绑定属性注解。v3.0.7 后支持
@Bean
public UserProperties userProperties(){
return new UserProperties();
}
}

注入参数

当注入到参数的时候,不支持自动刷新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configurationpublic class DemoConfig{
//提示:@Bean 只能与 @Configuration 配合@Bean
public DataSource db1(@Inject("${track.db1}") HikariDataSource ds) {
return ds;
}

@Beanpublic DataSourceWrap db1w(@Inject DataSource ds, @Inject("${wrap}") WrapConfig wc) {
return new DataSourceWrap(ds, wc);
}

//也可以带条件处理@Bean@Condition(onProperty="${cache.enable} = true") //有 "cache.enable" 属性值,且等于truepublic CacheService cache(@Inject("${cache.config}") CacheServiceSupplier supper){
return supper.get();
}
}

自动更新

自动刷新只适合于字段注入,以及单例的类。注意:如果不是单例,请不要开启自动刷新

1
2
3
4
5
6
7
8
9
10
@Componentpublic class DemoService{
//注入值(带默认值:demoApi),并开启自动更新
@Inject(value="${track.name:demoApi}", autoRefreshed=true)
String trackName;

//通过函数时时获取最新的(静态或动态,按需设定)
public static String trackName2(){
return Solon.cfg().get("track.name:demoApi");
}
}

手动配置

通过 Solon.cfg() 获取 SolonProps 后进行操作。这里不做过多的描述,如果需要可以参看官网文档。

示例

配置本身相关简单,记住对应的配置加载规则和注入的方法,基本不会有什么太多的问题。这里不对示例做过多说明,更多需要参看,参看具体的代码 demo-solon01 。

小结

本文主要主要介绍了 Solon 的配置配置规则和自动化配置的方法。在理解了 Solon 的配置后,就可以更动态的做部署的配置。

欢迎关注我的其它发布渠道