Solon2 开发之IoC,一、注入或手动获取配置

约定

resources/app.yml( 或 app.properties ) #为应用配置文件

配置样例

track:
  name: xxx
  url: http://a.a.a
  db1:
    jdbcUrl: "jdbc:mysql://..."
    username: "xxx"
    password: "xxx"

1、如何通过注入获得配置?

  • 注入到字段
@Service
public class DemoService{
    //注入值(带默认值:demoApi),并开启自动更新(注意:如果不是单例,请不要开启自动刷新)
    @Inject(value="${track.name:demoApi}", autoRefreshed=true)
    String trackName;
    
    //注入值(没有时,不覆盖字段初始值)
    @Inject("${track.url}")
    String trackUrl = "http://x.x.x/track";
    
    //注入配置集合
    @Inject("${track.db1}")
    Properties trackDbCfg;
    
    //注入Bean(根据对应的配置集合自动生成并注入)
    @Inject("${track.db1}")
    HikariDataSource trackDs;
    
    public DemoService(){
       //注入的配置,不能在构造函数里使用。在生命周期时,构建先于注入
    }
    
    @Init
    public void init(){
        //注入的配置,需要进一步做初始化,请在处理
    }
}
  • 注入到配置器的构建参数(与注入字段的方式差不多)
@Configuration
public class DemoConfig{
    //提示:@Bean 只能与 @Configuration 配合
    @Bean 
    public DataSource db1(@Inject("${track.db1}") HikariDataSource ds) {
        return ds;
    }
    
    @Bean
    public DataSourceWrap db1w(@Inject DataSource ds, @Inject("${wrap}") WrapConfig wc) {
        return new DataSourceWrap(ds, wc);
    }
    
    //也可以带条件处理
    @Bean
    public CacheService cache(@Inject("${cache.enable}") boolean enable, 
                              @Inject("${cache.config}") CacheServiceSupplier supper){
        if(enable){
            return supper.get();
        }else{
            return null;
        }
    }
}

注意一下,配置名是通过${...}模式去表示的。

2、如何手动获得配置?

  • 给字段赋值
public class DemoService{
    //获取值(带默认值:demoApi)
    static String trackName = Solon.cfg().get("track.name", "demoApi");
    //获取值
    static String trackUrl = Solon.cfg().get("track.url");
    
    //获取配置集合
    Properties trackDbCfg = Solon.cfg().getProp("track.db1");
    //获取bean(根据配置集合自动生成)
    HikariDataSource trackDs = Solon.cfg().getBean("track.db1", HikariDataSource.class);
}
  • 构建Bean给配置器用
@Configuration
public class DemoConfig{
    @Bean
    public DataSource db1() {
        return Solon.cfg().getBean("track.db1", HikariDataSource.class);
    }
    
    @Bean
    public DataSourceWrap db1w(@Inject DataSource ds) {
        WrapConfig wc = Solon.cfg().getBean("wrap", WrapConfig.class);
        
        return new DataSourceWrap(ds, wc);
    }
}
posted @ 2023-02-12 21:45  带刺的坐椅  阅读(59)  评论(0编辑  收藏  举报