JAva springbootコメント属性パラメータに動的に値を割り当てる


シーン:
最近システムを作って、Elasticsearchを使って全文検索をして、システムは開発環境と正式環境に分けて、正式な環境は会社の内部で使用して、サーバーの資源があまり余裕がないため、開発環境と正式な環境は1つのElasticsearchを共用することを決定して、異なる環境はインデックス名(indexName)で区別します.すなわち、2つのシステムで使用できるElasticsearchです.
実装:
1.プロファイルにインデックス名を定義する
開発環境の構成:アプリケーション-dev.yml
spring:
  data:
    elasticsearch:
      repositories:
        enabled: true
      cluster-nodes: 172.16.11.109:9300
      cluster-name: elasticsearch
      article-index-name: article

本番環境の構成:アプリケーション-prod.yml
spring:
  data:
    elasticsearch:
      repositories:
        enabled: true
      cluster-nodes: 172.16.11.109:9300
      cluster-name: elasticsearch
      article-index-name: article-prod

 以上のプロファイルから、2つの環境はインデックス名のみが異なることがわかります(インデックス名article-index-nameは、独自に定義された構成項目に属し、ここでは統合管理を容易にするためにElasticsearchの構成と一緒に配置します).
2.プロファイル内のインデックス名の値を読み込む構成クラスを作成する
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ArticleIndexConfig{
  @Value("${spring.data.elasticsearch.article-index-name}")
  private String articleIndexName;

  @Bean
  public String articleIndexName(){
    return articleIndexName;
  }
}

3.Elasticsearchのエンティティークラスの注記で使用
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;

@Document(indexName = "#{@articleIndexName}", type = "java")
public class ArticleModel implements Serializable{

  private static final long seriaVersionUID = 6320548148250372656L;

  @Id
  private String rowId;

  @Field(type = FieldType.text)
  private String title;

  @Field(type = FieldType.text)
  private String content;

  //getter setter  
  //...
}

4.以上の動作により、2つの環境(開発環境と正式環境)が1つのElasticsearchを共用することができ、相互間のデータは隔離され、互いに影響しない.