使用Spring boot yaml配置,我有一个看起来像这样的数据源:
datasource:
url: jdbc:postgresql://somehost/somedb
username: username
password: password
hikari:
connection-timeout: 250
maximum-pool-size: 1
minimum-idle: 0
我可以根据配置文件成功指向不同的数据库,但我想设置一个根本不使用此数据源的配置文件。 但是,当我使用该配置文件时,我得到以下结果:
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no embedded datasource could be auto-configured.
Reason: Failed to determine a suitable driver class
如何在某些配置文件中使用此数据源,而不在其他配置文件中使用此数据源?
您可以使用 '@Profile("!dev"( 注释跳过特定配置文件的 Bean
配置文件名称也可以以 NOT 运算符为前缀,例如"!dev"以将其从配置文件中排除
从文档这里
如果给定配置文件以 NOT 运算符 (!( 为前缀,则在配置文件未处于活动状态时将注册注释组件 — 例如,给定 @Profile({"p1", "!p2"}(,如果配置文件 'p1' 处于活动状态或配置文件 'p2' 未处于活动状态,则将进行注册。
配置文件也可以在XML中配置 - 标签具有"profiles"属性,该属性采用适用配置文件的逗号分隔值:here
<beans profile="dev">
<bean id="devDatasourceConfig"
class="org.baeldung.profiles.DevDatasourceConfig" />
</beans>
更改为:
spring:
datasource:
url: jdbc:postgresql://somehost/somedb
username: username
password: password
hikari:
connection-timeout: 250
maximum-pool-size: 1
minimum-idle: 0
默认情况下,Springboot 使用自动配置,但您可以自定义排除某些自动配置类
编辑配置以跳过自动配置:
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
按配置文件创建自己的数据源
@Bean
@Profile("dev")
DataSource dataSourceDevProfile(org.springframework.core.env.Environment environment) throws Exception {
return DataSourceBuilder.create().url("").driverClassName("").password("").username("").build();
}
@Bean
@Profile("!dev")
DataSource dataSourceNoDev(org.springframework.core.env.Environment environment) throws Exception {
return DataSourceBuilder.create().url(environment.getProperty("spring.datasource.url")).driverClassName("").password(environment.getProperty("spring.datasource.password")).username(environment.getProperty("spring.datasource.username")).build();
}
或完全以编程方式
@Bean
DataSource dataSource2(org.springframework.core.env.Environment environment) throws Exception {
if (environment.acceptsProfiles("dev")){
//return datasource dev
}else{
//return datasource prod
}