【実践済み】Springboot読み出しプロファイルのコンフィギュレーション・アイテムを静的定数に割り当てる

6206 ワード

Springboot読み出しプロファイルのコンフィギュレーション・アイテムを静的定数に割り当てる
実際の応用では、グローバル変数を設定する必要があるシーンがあります.一般的な方法は、定数クラスを書き、グローバル変数を定数クラスの静的メンバー変数として保存することです.この方法の欠点は、定数を変更する必要がある場合や、マルチ環境(dev、test、prod)プロジェクトで環境によって定数が異なる場合です.この場合、この定数はプロファイルに書くことができます.これにより,問題のようにコンフィギュレーションファイル内のコンフィギュレーション項目を静的定数に初期化する必要がある.
文書ディレクトリ
  • Springboot読み出しプロファイルのコンフィギュレーション・アイテムは、静的定数
  • に割り当てられます.
  • @[toc]
  • 背景紹介
  • 1. ロードするプロファイルの決定方法
  • 2. 異なる環境の切り替え方式
  • 3. プロファイル内のコンフィギュレーションアイテムをロードする方法
  • 4. ここではsprintbootの起動順序とプロファイルのロード順序
  • について説明する必要があります.
  • 1. sprintbootの起動順序:上から下まで
  • 2. プロファイルのロード順序:上から下へ
  • ==注意=:本稿では、定数クラスファイルとspringbootプロジェクト起動クラスが同じmoduleである場合にのみ実現し、マルチmoduleプロジェクトでは、moduleにまたがって定数クラスを初期化する方法については、まだ探求する必要があります.
  • 具体的な方法
  • 1. 読み込むプロファイル
  • を決定する.
  • 2. 定数クラス
  • の記述
  • コード部
  • 実行結果
  • 背景紹介
    1.ロードするプロファイルの決定方法
  • 本明細書では、各種のプロファイルのロード方法を参照し、springbootが起動パラメータに基づいて指定されたプロファイルを自動的に見つけることを実現するために、指定されたパスの下で指定された名前のプロファイルをハードコーディングで読み取るのではなく、@Value注釈を使用してプロファイル
  • をロードする.
    2.異なる環境の切り替え方式
  • 本明細書では、様々な環境の切り替え方法を参照し、完全に同じコードセットを使用して異なる環境を切り替える(コードにプロファイル情報を書くのではなく)ことを実現するために、本明細書では、プロジェクトの起動時に起動パラメータ--spring.profiles.active=devを設定する方法を選択して、読み出すプロファイル
  • を決定する.
  • 本明細書では修正pomは使用する.xml方式
  • 3.プロファイル内の構成項目をロードする方法
  • 本明細書では、定数クラスのコンストラクタに構成項目
  • をロードするために使用する.
    4.ここではsprintbootの起動順序とプロファイルのロード順序について説明する必要があります.
    1.sprintbootの起動順序:上から下へ

  • Bean
  • を作成
  • Beanを初期化し、Beanの各メンバー変数に
  • を割り当てる.
    2.プロファイルのロード順序:上から下へ
  • application.yml
  • application.yaml
  • application.properties

  • 注意:本稿では、定数クラスファイルとspringbootプロジェクト起動クラスが同じmoduleの場合にのみ実現します.マルチmoduleプロジェクトでは、moduleにまたがって定数クラスを初期化する方法については、まだ探求する必要があります.
    具体的な方法
    1.読み込むプロファイルの決定
    この文書では、sprintbootプロジェクトを例に挙げます.このプロジェクトのプロファイルは4つあります.
  • application.properties–プライマリプロファイル
  • アプリケーション-dev.properties–dev環境のプロファイル
  • application-test.properties–test環境のプロファイル
  • アプリケーション-prod.properties–prod環境のプロファイル
  • 2.定数クラスの作成
    springbootプロジェクトの起動を要求すると、構成項目が自動的にロードされ、定数クラスの静的メンバー変数に値が割り当てられます.
  • 定数クラスのclass宣言に逐次@Component
  • を追加
  • 静的メンバー変数
  • を初期化
  • コンストラクションメソッドを作成し、メソッドに注記@Autowired
  • を追加します.
  • メソッド宣言のパラメータセクションで、クラスの静的メンバー変数
  • に付与する構成アイテムの値を取得するために@Value注記を使用します.

    プロジェクトが開始されると、定数クラスが自動的に初期化され、プロジェクト内のあちこちで呼び出されるように、プロファイル内の各構成項目がクラスの静的メンバー変数に割り当てられます.
  • 注意:本稿では、定数クラスファイルとspringbootプロジェクト起動クラスが同じmoduleである場合にのみ実現し、マルチmoduleプロジェクトでは、moduleにまたがって定数クラスを初期化する方法については、まだ探求が必要である.


  • コードセクション
  • application.properties
  • # Tomcat
    server.tomcat.max-threads=1000
    server.tomcat.min-spare-threads=30
    server.port=8080
    
    # prod|test|dev             
    spring.profiles.active=${spring.profiles.active}
    
  • application-dev.properties
  • # env flag
    env.flag=dev
    
  • application-test.properties
  • # env flag
    env.flag=test
    
  • application-prod.properties
  • # env flag
    env.flag=prod
    
  • プロジェクト起動クラス:DemoProjectApplication
  • @SpringBootApplication
    public class AdRestApplication {
        public static void main(String[] args) {
            SpringApplication.run(AdRestApplication.class, args);
            System.out.println("Current env :【 " + Constant.env + " 】 ");
        }
    }
    
  • 定数クラス:Constant
  • @Component
    public class Constant {
       public static String env;
    
        @Autowired
        private Constant(@Value("${spring.profiles.active}") String env,
                         @Value("${ldap.url}") String ldapUrl) {
            Constant.env = env;
        }
    }
    

    実行結果
    起動コマンド--spring.profiles.Active=devを例に挙げます.
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.2.4.RELEASE)
    
    2020-03-15 16:45:38.075 [main] INFO  com.xyy.ops.ad.rest.AdRestApplication - Starting AdRestApplication on arthas with PID 9272 (D:\Java_Project\ad-interface\ad-rest\target\classes started by c8 in D:\Java_Project\ad-interface)
    2020-03-15 16:45:38.077 [main] INFO  com.xyy.ops.ad.rest.AdRestApplication - The following profiles are active: dev
    2020-03-15 16:45:39.082 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 55070 (http)
    2020-03-15 16:45:39.089 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-55070"]
    2020-03-15 16:45:39.090 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
    2020-03-15 16:45:39.090 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.30]
    2020-03-15 16:45:39.202 [main] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
    2020-03-15 16:45:39.202 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 1067 ms
    2020-03-15 16:45:39.673 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
    2020-03-15 16:45:39.728 [main] INFO  o.s.b.a.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html]
    2020-03-15 16:45:39.837 [main] INFO  o.s.ldap.core.support.AbstractContextSource - Property 'userDn' not set - anonymous context will be used for read-write operations
    2020-03-15 16:45:39.889 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-55070"]
    2020-03-15 16:45:39.911 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 55070 (http) with context path ''
    2020-03-15 16:45:39.914 [main] INFO  com.xyy.ops.ad.rest.AdRestApplication - Started AdRestApplication in 2.24 seconds (JVM running for 3.03)
    Current env :【 dev 】