SpringBoot 2.7.4:无需CONFIG_DIR环境变量初始化数据源的替代方案
无需CONFIG_DIR环境变量初始化数据源的替代方案
方法一:利用Spring Boot默认的Profile配置机制
Spring Boot原生支持按环境Profile加载配置文件,你可以把不同环境的数据源配置直接放在src/main/resources目录下,命名为application-{profile}.properties(或YAML格式),比如application-dev.properties、application-prod.properties。
在配置文件里直接定义HikariCP相关参数:
# application-dev.properties spring.datasource.url=jdbc:mysql://localhost:3306/dev_db spring.datasource.username=dev_user spring.datasource.password=dev_pass spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Hikari连接池配置 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.connection-timeout=30000
之后要么让Spring自动装配DataSource:
@Autowired private DataSource dataSource;
要么手动构建HikariConfig时,直接从Environment读取配置项,不用自己拼接文件路径:
HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl(env.getProperty("spring.datasource.url")); hikariConfig.setUsername(env.getProperty("spring.datasource.username")); hikariConfig.setPassword(env.getProperty("spring.datasource.password")); hikariConfig.setMaximumPoolSize(Integer.parseInt(env.getProperty("spring.datasource.hikari.maximum-pool-size")));
方法二:直接读取类路径下的独立配置文件
如果想保留单独的datasource-{profile}.properties文件(比如datasource-dev.properties),放在src/main/resources下,可以通过类加载器或Spring的ResourceLoader直接读取,完全不需要CONFIG_DIR:
用类加载器读取:
String configFileName = "/datasource" + propertyName + env.getProperty("spring.profiles.active") + ".properties"; InputStream inputStream = getClass().getResourceAsStream(configFileName); Properties props = new Properties(); props.load(inputStream); HikariConfig hikariConfig = new HikariConfig(props);
用Spring ResourceLoader读取:
@Autowired private ResourceLoader resourceLoader; // 初始化逻辑 String configPath = "classpath:datasource" + propertyName + env.getProperty("spring.profiles.active") + ".properties"; Resource resource = resourceLoader.getResource(configPath); HikariConfig hikariConfig = new HikariConfig(resource.getFile());
方法三:通过@ConfigurationProperties绑定配置
创建一个配置类,用@ConfigurationProperties绑定数据源参数,再手动构建HikariConfig,这种方式更规范,也便于维护:
首先定义配置类:
@ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProps { private String url; private String username; private String password; private String driverClassName; private Hikari hikari; // 生成getter、setter public static class Hikari { private int maximumPoolSize; private long connectionTimeout; // 生成getter、setter } }
然后在配置类中注册并使用:
@Configuration @EnableConfigurationProperties(DataSourceProps.class) public class DataSourceConfig { @Autowired private DataSourceProps dataSourceProps; @Bean public DataSource dataSource() { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl(dataSourceProps.getUrl()); hikariConfig.setUsername(dataSourceProps.getUsername()); hikariConfig.setPassword(dataSourceProps.getPassword()); hikariConfig.setDriverClassName(dataSourceProps.getDriverClassName()); hikariConfig.setMaximumPoolSize(dataSourceProps.getHikari().getMaximumPoolSize()); hikariConfig.setConnectionTimeout(dataSourceProps.getHikari().getConnectionTimeout()); return new HikariDataSource(hikariConfig); } }
之后只需在对应Profile的application配置文件中配置spring.datasource前缀的参数即可,无需关注文件路径。
内容的提问来源于stack exchange,提问作者OTUser
相关产品推荐
相关产品推荐

