将Java应用迁移至Micronaut时如何编程获取配置的数据源
编程方式获取Micronaut配置数据源方案
完全可以通过编程方式获取application.yml中定义的数据源,不需要依赖@Inject注解,以下是两种常用实现方式:
方式1:通过ApplicationContext实例获取
如果你的代码可以拿到Micronaut启动时返回的ApplicationContext对象,直接从中获取DataSource Bean即可:
// 启动Micronaut时保存上下文实例 ApplicationContext context = Micronaut.run(Application.class); // 获取默认数据源 DataSource defaultDataSource = context.getBean(DataSource.class); // 多数据源场景下,指定数据源名称获取对应实例 DataSource secondaryDataSource = context.getBean(DataSource.class, Qualifiers.byName("secondary"));
方式2:非托管类中通过BeanLocator静态获取
如果你的遗留代码无法拿到ApplicationContext实例,可使用BeanLocator的静态方法全局获取已注册的Bean,该方法要求Micronaut上下文已完全初始化完成:
import io.micronaut.context.BeanLocator; import io.micronaut.inject.qualifiers.Qualifiers; import javax.sql.DataSource; public class LegacyDbService { public void execQuery() { // 获取默认数据源 DataSource defaultDs = BeanLocator.getInstance().getBean(DataSource.class); // 获取指定名称的多数据源 DataSource customDs = BeanLocator.getInstance().getBean(DataSource.class, Qualifiers.byName("custom")); } }
可选:直接读取数据源配置参数
如果需要获取application.yml中配置的原始数据源参数,可获取DatasourceConfiguration Bean读取对应属性:
DatasourceConfiguration defaultConfig = BeanLocator.getInstance().getBean(DatasourceConfiguration.class); String jdbcUrl = defaultConfig.getUrl(); String username = defaultConfig.getUsername(); String password = defaultConfig.getPassword();
注意事项
- 所有编程获取Bean的操作必须在Micronaut上下文初始化完成后执行,否则会抛出上下文未就绪异常
- 多数据源场景必须配合
Qualifiers.byName()指定配置中定义的数据源名称,否则只会返回默认数据源实例 - 不推荐手动读取Environment配置拼接数据源,直接获取框架初始化完成的DataSource Bean可自动继承连接池、事务等全局配置
内容的提问来源于stack exchange,提问作者Z2S
相关产品推荐
相关产品推荐

