• 请不要在回答技术问题时复制粘贴 AI 生成的内容
luxinfl
V2EX  ›  程序员

springboot,有个自动配置的问题

  •  
  •   luxinfl · Apr 30, 2020 · 2163 views
    This topic created in 2229 days ago, the information mentioned may be changed or developed.

    @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 replies    2020-04-30 17:57:55 +08:00
    luxinfl
        1
    luxinfl  
    OP
       Apr 30, 2020
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public DataSource dataSource(){
    return DataSourceBuilder.create().build();
    }
    luxinfl
        2
    luxinfl  
    OP
       Apr 30, 2020
    ds2.jdbcUrl=
    ds2.username=feb-dev
    ds2.password=feb-dev
    ds2.driverClassName=com.mysql.cj.jdbc.Driver
    luxinfl
        3
    luxinfl  
    OP
       Apr 30, 2020
    @ConfigurationProperties(prefix = "ds2") 注解是这个、。。
    wangyanrui
        4
    wangyanrui  
       Apr 30, 2020
    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
       Apr 30, 2020
    @wangyanrui 那如果要绑定 hikari 的参数,那应该怎么写?
    liyanggyang
        6
    liyanggyang  
       Apr 30, 2020
    大哥,首先 启动类需要 @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  
       Apr 30, 2020
    DataSourceProperties 有 jdbcUrl 这个属性吗,我咋记得是 url
    luxinfl
        8
    luxinfl  
    OP
       Apr 30, 2020
    @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
       Apr 30, 2020
    @Resource hikari 的 url 变量不太一样
    luxinfl
        10
    luxinfl  
    OP
       Apr 30, 2020
    @wangyanrui ds2 前面加了 prefix,只是配置的前缀
    wangyanrui
        11
    wangyanrui  
       Apr 30, 2020
    没有明白楼主到底要表达的是什么意思(手动沟通)
    wangyanrui
        12
    wangyanrui  
       Apr 30, 2020
    没有明白楼主到底要表达的是什么意思(手动狗头)
    wangyanrui
        13
    wangyanrui  
       Apr 30, 2020
    感觉楼主可能对 SpringBoot 的自动配置的原理不太明白,云里雾里的
    建议先了解一些基本概念
    说错了勿锤
    luxinfl
        14
    luxinfl  
    OP
       Apr 30, 2020
    @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  
       Apr 30, 2020
    DataSource 不吃这些配置,应该返回 DataSourceProperties 或者 HIkari 的配置类,配置参数才能加上去
    然后再注入给相关的 bean
    luxinfl
        16
    luxinfl  
    OP
       Apr 30, 2020
    @chendy 我还是看看配置是怎么加载的吧。。。
    Jrue0011
        17
    Jrue0011  
       Apr 30, 2020
    自己测了下,单数据源用你主楼贴的写法没什么问题,可能是多数据源结合自动配置后的问题
    luxinfl
        18
    luxinfl  
    OP
       Apr 30, 2020
    我又试了下。 @ConfigurationProperties 可以直接读到 application.properties 或者 application.yml 配置文件。但是如果数据源配置写在自定义文件的时候,要么用 @PropertySource 读取自定义配置文件,要么在主配置文件配置 spring.profiles.include..谢谢大佬们提供意见
    @Jrue0011
    @liyanggyang
    @wangyanrui
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2242 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 00:02 · PVG 08:02 · LAX 17:02 · JFK 20:02
    ♥ Do have faith in what you're doing.