springboot,有个自动配置的问题

2020-04-30 16:19:11 +08:00
 luxinfl

@Bean @ConfigurationProperties(prefix = "ds2") public DataSource dataSource(){ return DataSourceBuilder.create().build(); }

-----------properties 文件-------------- ds2.jdbcUrl=xxx ds2.username=111 ds2.password=222 ds2.driverClassName=com.mysql.cj.jdbc.Driver

为什么生成数据源的时候,没有自动把配置文件的参数带进去啊?是我哪里设置错了么?

1649 次点击
所在节点    程序员
18 条回复
luxinfl
2020-04-30 16:19:59 +08:00
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
luxinfl
2020-04-30 16:20:22 +08:00
ds2.jdbcUrl=
ds2.username=feb-dev
ds2.password=feb-dev
ds2.driverClassName=com.mysql.cj.jdbc.Driver
luxinfl
2020-04-30 16:21:22 +08:00
@ConfigurationProperties(prefix = "ds2") 注解是这个、。。
wangyanrui
2020-04-30 16:29:44 +08:00
Binding is either performed by calling setters on the annotated class or, if {@link ConstructorBinding @ConstructorBinding} is in use, by binding to the constructor parameters.
来自于 源码里备注的一部分

你的 datasource 里面,有 ds2 这个属性吗?
luxinfl
2020-04-30 16:31:48 +08:00
@wangyanrui 那如果要绑定 hikari 的参数,那应该怎么写?
liyanggyang
2020-04-30 16:33:06 +08:00
大哥,首先 启动类需要 @EnableConfigurationProperties;其次自动注解是解析 @Bean 的入参类;最后,也是根据成员变量的 setter ( DataSourceBuilder 的 username 这些,不是 DataSourceBuilder 的成员变量);

-------我觉得可以这样----
1. 启动类
@EnableConfigurationProperties({
DataProperties.class,
})
2. 配置类:
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ConfigurationProperties(prefix = "ds2")
public class DataProperties {
private String username;
。。。
}
3. 注册 bean
@Bean
public DataSource dataSource(DataProperties dataProperties){
return DataSourceBuilder.create().username(dataProperties.getUserName).build(); }
Resource
2020-04-30 16:37:30 +08:00
DataSourceProperties 有 jdbcUrl 这个属性吗,我咋记得是 url
luxinfl
2020-04-30 16:43:30 +08:00
@liyanggyang 我觉的 setter 应该不需要,因为这样写我可以获取到配置信息
@Configuration
@PropertySource(value= "classpath:application-ds.yml",factory = PropertySourceConfig.class)
@EnableConfigurationProperties
public class TransactionConfig {


@Bean
@ConfigurationProperties(prefix = "ds2")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}

}
luxinfl
2020-04-30 16:43:57 +08:00
@Resource hikari 的 url 变量不太一样
luxinfl
2020-04-30 16:46:42 +08:00
@wangyanrui ds2 前面加了 prefix,只是配置的前缀
wangyanrui
2020-04-30 16:51:07 +08:00
没有明白楼主到底要表达的是什么意思(手动沟通)
wangyanrui
2020-04-30 16:51:17 +08:00
没有明白楼主到底要表达的是什么意思(手动狗头)
wangyanrui
2020-04-30 16:54:00 +08:00
感觉楼主可能对 SpringBoot 的自动配置的原理不太明白,云里雾里的
建议先了解一些基本概念
说错了勿锤
luxinfl
2020-04-30 16:55:49 +08:00
@wangyanrui 是不太懂,但是为啥我换了个写法就能读取到了呢?

@Configuration
@PropertySource(value= "classpath:application-ds.yml",factory = PropertySourceConfig.class)
@EnableConfigurationProperties
public class TransactionConfig {


@Bean
@ConfigurationProperties(prefix = "ds2")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}

}
chendy
2020-04-30 16:58:12 +08:00
DataSource 不吃这些配置,应该返回 DataSourceProperties 或者 HIkari 的配置类,配置参数才能加上去
然后再注入给相关的 bean
luxinfl
2020-04-30 17:04:23 +08:00
@chendy 我还是看看配置是怎么加载的吧。。。
Jrue0011
2020-04-30 17:08:30 +08:00
自己测了下,单数据源用你主楼贴的写法没什么问题,可能是多数据源结合自动配置后的问题
luxinfl
2020-04-30 17:57:55 +08:00
我又试了下。 @ConfigurationProperties 可以直接读到 application.properties 或者 application.yml 配置文件。但是如果数据源配置写在自定义文件的时候,要么用 @PropertySource 读取自定义配置文件,要么在主配置文件配置 spring.profiles.include..谢谢大佬们提供意见
@Jrue0011
@liyanggyang
@wangyanrui

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667670

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX