首页 > 其他分享 >Solon2 开发之容器,四、注入依赖与初始化

Solon2 开发之容器,四、注入依赖与初始化

时间:2023-02-12 22:00:09浏览次数:37  
标签:容器 初始化 init ds Bean Inject Solon2 public

Solon 强调 有克制的注入 + 手动控制 结合的模式。好处是,代码用料少、启动快。

Bean 的关键生命节点:

节点 说明
1. Constructor(构造方法) 不支持参数注入
2. @Inject(注入) 基于订阅,不确定具体依赖什么时候会被注入
3. @Init(初始化) 在容器扫描完成时执行,所有的依赖注入已完成

下面讲几种基于注入的初始化依赖,以助了解以上特性:

1、基于关系的简单初始化依赖:

@Configuration
public class DsConfig {
    @Bean
    public DataSource ds(@Inject("${demo.ds1}") HikariDataSource ds){
        return ds;  //构建数据源bean
    }
    
    @Bean
    public void init(@Inject DataSource ds){
        //初始化结构。数据源bean产生后,才会触发这个函数。从而形成简单的强制依赖关系。
        SchemaUtils.init(ds);  
    }
}

2、基于关系的初始化依赖(反例):

2.1、不适合的场景:

@Component
public void DsHelper{
    @Inject 
    DataSource ds; //注入数据源Bean //提示:@Inject 是异步的。DsHelper 组件生成时,ds 有可能并未完成注入
}

@Configuration
public class DsConfig {
    @Bean
    public DataSource ds(@Inject("${demo.ds1}") HikariDataSource ds){
        return ds;  //构建数据源bean
    }
    
    @Bean
    public void init(@Inject DsHelper helper){
        //初始化结构。此时 helper.ds 可能还是 null(因为ds是异步注入的)
        SchemaUtils.init(helper.ds);  
    }
}

2.2、借用顺序的初始化依赖:

上例的“不适合的场景”,可以通过如下改造(但也显复杂和别扭):

@Component
public void DsHelper{
    @Inject 
    DataSource ds; //注入数据源Bean //提示:@Inject 是异步的。DsHelper 组件生成时,ds 有可能并未完成注入
}

@Configuration
public class DsConfig {
    @Bean
    public DataSource ds(@Inject("${demo.ds1}") HikariDataSource ds){
        return ds;  //构建数据源bean
    }
    
    @Inject
    DsHelper helper;
    
    @Init
    public void init(){
        //初始化结构。此处,所有的Bean注入都已完成
        SchemaUtils.init(helper.ds);  
    }
}

如果结构初始化后,再跟一个数据初始化

@Configuration
public class DataConfig {
    @Inject
    DsHelper helper;
    
    @Init(index = 1) //默认为自动,也可以手动指定初始化执行顺序
    public void init(){
        //初始化数据
        DataUtils.init(helper.ds);  
    }
}

注意:这个样例是故意设计出来的,不一定适合生产应用。

标签:容器,初始化,init,ds,Bean,Inject,Solon2,public
From: https://www.cnblogs.com/noear/p/17114820.html

相关文章

  • Solon2 开发之容器,一、注入或手动获取配置
    约定resources/app.yml(或app.properties)#为应用配置文件配置样例track:name:xxxurl:http://a.a.adb1:jdbcUrl:"jdbc:mysql://..."username:......
  • Solon2 开发之容器,二、构建一个 Bean 的三种方式
    1、手动简单的构建://生成普通的BeanSolon.context().wrapAndPut(UserService.class,newUserServiceImpl());//生成带注解的Bean(比如:@Controller)Solon.context().be......
  • SpringMVC源码(三):九大内置组件初始化
    在源码(二):MVC容器启动的分析中,MVC容器刷新完成后,通过发布事件及事件监听处理器来初始化MVC的九大组件,下面来分析下这九大组件初始化的细节。概览初始化MVC组件,D......
  • 容器部署分布式zabbix
    之前有写过docker-compose部署zabbix的博客这里再总结下分布式部署zabbix的笔记,这里重点是部署zabbix-proxy同样需要准备数据库配置文件数据库配置文件差不多这里是doc......
  • Docker consul的容器服务更新与发现
    一、Consul概述(1)什么是服务注册与发现服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的......
  • 初始化列表
    初始化列表构造函数的执行可以分成两个阶段:初始化阶段和计算阶段(初始化阶段先于计算阶段)。l初始化阶段:全部的成员都会在初始化阶段初始化。l计算阶段:一般是指用于执行......
  • Go语言学习11-数据初始化
    数据初始化书接上篇,我们了解了Go语言的指针类型。那到目前为止,Go的数据类型就差不多介绍完了,下面就是讲解更优雅地对Go数据的初始化了。这里的数据初始化是指对某个......
  • Java 初始化块
    目录1、初识初始化块2、实例初始化块和构造器3、类初始化块1、初识初始化块Java使用构造器来对单个对象进行初始化操作,使用构造器先完成对整个Java对象的状态初始化,然......
  • react hook学习4-usestate的惰性初始化
     ......
  • C++中的默认初始化
    当没有通过初始化器构造一个对象时,那么将会执行默认初始化。语法Tobject;newT;默认初始化出现在以下几种情况中当一个自动,静态,或者线程存储周期的变量声明......