ConfigurationPropertiesについてメソッド上でnullのデータソースを取得するこのピットを記録しましょう

2474 ワード

この件といえばちょっとエピソードがありますが、来たばかりの同僚がこの質問をしました.見ても大丈夫ですか.注入方法が間違っているのではないでしょうか.あるいはconfigurationは全然注入されていませんか?その場では解決しなかったが、このまっすぐなBOYは私が水だと言った.ああ、古い顔はどこに置いたのか.記録:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;

import javax.sql.DataSource;

@Configuration
public class MyConfigFactory {
    //     ConfigurationProperties          ,                    。            , ConfigurationProperties        DataSource=null
    @Value("${spring.datasource.username}")
    private String username;

    public String getUsername() {
        return username;
    }

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource", ignoreInvalidFields = true)
    public DataSource getDataSource(){
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }
}

確かにここで値をとるdatasource=nullは、configがまだ注入されていないためですが、RestControllerでリクエストした後、Autowriedを使用してServiceに注入すると取得できます.
==================Service  =========================
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.sql.DataSource;

@Service
public class MyDataSourceService {
    @Autowired
    MyConfigFactory myConfigFactory;

    public void getDataSource(){
        DataSource dataSource = myConfigFactory.getDataSource();
        System.out.println(dataSource);
    }
}

==================Controller  =========================
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Autowired
    private MyDataSourceService myDataSource;

    @RequestMapping(value = "/info", method = RequestMethod.GET)
    public String getInfo(){
        myDataSource.getDataSource();
        return  "AAAAA";
    }
}

インタフェースリクエスト後、データソースが取得できるようになりました.事務補償メカニズムに似ていると思いますよね?後続の記入方法.その後、エンティティbeanを使用して注入方法を試してみましたが、事前に入手できるかどうか試してみました.
結果は!奇跡的には、起動時にnullを表示するか、リクエスト時にプロファイルの結果が得られます.従って,この属性はlazy特性であると推定できる.使用する前に、この方法が許容できるかどうかをよく考えなければなりません.
具体的なコンフィギュレーションプロperties注入方式などはこの部分まで検討してから詳しく説明しましょう.