V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luxinfl
V2EX  ›  程序员

springboot,有个自动配置的问题

  •  
  •   luxinfl · 2020-04-30 16:19:11 +08:00 · 1732 次点击
    这是一个创建于 1672 天前的主题,其中的信息可能已经有所发展或是发生改变。

    @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

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

    18 条回复    2020-04-30 17:57:55 +08:00
    luxinfl
        1
    luxinfl  
    OP
       2020-04-30 16:19:59 +08:00
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public DataSource dataSource(){
    return DataSourceBuilder.create().build();
    }
    luxinfl
        2
    luxinfl  
    OP
       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
        3
    luxinfl  
    OP
       2020-04-30 16:21:22 +08:00
    @ConfigurationProperties(prefix = "ds2") 注解是这个、。。
    wangyanrui
        4
    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
        5
    luxinfl  
    OP
       2020-04-30 16:31:48 +08:00
    @wangyanrui 那如果要绑定 hikari 的参数,那应该怎么写?
    liyanggyang
        6
    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
        7
    Resource  
       2020-04-30 16:37:30 +08:00
    DataSourceProperties 有 jdbcUrl 这个属性吗,我咋记得是 url
    luxinfl
        8
    luxinfl  
    OP
       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
        9
    luxinfl  
    OP
       2020-04-30 16:43:57 +08:00
    @Resource hikari 的 url 变量不太一样
    luxinfl
        10
    luxinfl  
    OP
       2020-04-30 16:46:42 +08:00
    @wangyanrui ds2 前面加了 prefix,只是配置的前缀
    wangyanrui
        11
    wangyanrui  
       2020-04-30 16:51:07 +08:00
    没有明白楼主到底要表达的是什么意思(手动沟通)
    wangyanrui
        12
    wangyanrui  
       2020-04-30 16:51:17 +08:00
    没有明白楼主到底要表达的是什么意思(手动狗头)
    wangyanrui
        13
    wangyanrui  
       2020-04-30 16:54:00 +08:00
    感觉楼主可能对 SpringBoot 的自动配置的原理不太明白,云里雾里的
    建议先了解一些基本概念
    说错了勿锤
    luxinfl
        14
    luxinfl  
    OP
       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
        15
    chendy  
       2020-04-30 16:58:12 +08:00
    DataSource 不吃这些配置,应该返回 DataSourceProperties 或者 HIkari 的配置类,配置参数才能加上去
    然后再注入给相关的 bean
    luxinfl
        16
    luxinfl  
    OP
       2020-04-30 17:04:23 +08:00
    @chendy 我还是看看配置是怎么加载的吧。。。
    Jrue0011
        17
    Jrue0011  
       2020-04-30 17:08:30 +08:00
    自己测了下,单数据源用你主楼贴的写法没什么问题,可能是多数据源结合自动配置后的问题
    luxinfl
        18
    luxinfl  
    OP
       2020-04-30 17:57:55 +08:00
    我又试了下。 @ConfigurationProperties 可以直接读到 application.properties 或者 application.yml 配置文件。但是如果数据源配置写在自定义文件的时候,要么用 @PropertySource 读取自定义配置文件,要么在主配置文件配置 spring.profiles.include..谢谢大佬们提供意见
    @Jrue0011
    @liyanggyang
    @wangyanrui
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:43 · PVG 17:43 · LAX 01:43 · JFK 04:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.