まず、なぜこの注釈の定義を思うだろう@SpringCloudProfile
注@Profileホーム言及:これは主にのみ、指定の環境でクラスの効果を指定し、マルチ環境設定春ブーツと一緒に使用され、このよう闊歩構成としてのみ、開発者が開発することができますし、テスト環境、オンラインニーズの使用を禁止。
次のように@Profile使用:
@設定 @ EnableSwagger2
@Profile({ "DEV"、 "テスト"}) パブリック クラスSwagger2Config { @豆 公共ドケットドケット(){ リターン 新しいドケット(DocumentationType.SWAGGER_2).apiInfo(apiInfo())。選択() // 当前包路径 .apis(RequestHandlerSelectors.basePackage(" com.zbq.springbootbase.controller " )) 。.paths(PathSelectors.any())ビルド(); } // ビルドのAPIドキュメントは、機能の詳細を プライベートApiInfo apiInfo(){ 返す 新しい新しいApiInfoBuilderを() // ページタイトル .TITLE(" RESTfulなを構築するためにspringboot-ベース・フレーム、Swagger2使用API " ) // 創始者 が.contact(新しい新しい名刺(" ボー清"、" [email protected] "、"" )) // バージョン番号 .version(" 1.0 " ) // 説明 .DESCRIPTION(" API描述" ) .build()。 } }
しかし、物流センターの使用で春クラウド、ノート@Profile障害のために、プロジェクトのリードを開始するときに無指定spring.profiles.activeプロパティで結果では、その理由は、プロパティ値spring.profiles.active環境変数を取得することにより、@Profileをされ、注釈を設定します値は、それが力に含まれて、比較されます。
達成するための環境変数で春の雲の変化にすべての必要性は、まさに一般的にこれらの値を、DEV、テスト、PRODを持って、設定環境を読み込み、指定された中央部を構成するために使用され、この変数を、spring.cloud.config.profile
第二に、達成するためのカスタム注釈@SpringCloudProfile
1)@SpringCloudProfileコメントの定義を
/ * * * @author zhangboqing * @date 2019年11月12日 * / @Target({ElementType.TYPE、ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional(SpringCloudProfileCondition。クラス) パブリック@interface SpringCloudProfile { / * * *注釈付きコンポーネントを登録する必要のあるプロファイルのセット。 * / 文字列[]の値(); }
2)SpringCloudProfileConditionクラスのための整合条件を達成
/ * * * @author zhangboqing * @date 2019年11月12日 * / パブリック クラスSpringCloudProfileConditionが実装条件{ 公共の 静的な最終文字列ACTIVE_PROFILES_PROPERTY_NAME = 「spring.cloud.config.profile 」。 @オーバーライド パブリックブールマッチ(ConditionContextコンテキスト、AnnotatedTypeMetadataメタデータ){ MultiValueMap <文字列、オブジェクト> ATTRS = metadata.getAllAnnotationAttributes(SpringCloudProfile クラス.getName())。 もし(!attrsを= ヌル){ のために:(。ATTRSオブジェクトの値を取得(" 値" {)) であれば(acceptsProfiles(文脈、(String []型)値)){ 返す 真。 } } リターン はfalse ; } 返す 真; } パブリックブールacceptsProfiles(ConditionContextコンテキスト、文字列...プロファイル){ Assert.notEmpty(プロファイルは、「少なくとも一つのプロファイルを指定する必要があります」); 以下のための{:(プロファイル文字列プロファイル) の場合(StringUtils.hasLength(プロファイル)&& profile.charAt(0)== ' !' ){ 場合(!(profile.substring isProfileActive(コンテキスト、1 ))){ 返す 真。 } } それ以外の 場合(isProfileActive(コンテキスト、プロファイルは)){ 返す 真。 } } リターン はfalse ; } 保護されたブールisProfileActive(ConditionContextコンテキスト、文字列プロファイル){ validateProfile(プロファイル)。 文字列プロパティ = context.getEnvironment()のgetProperty(ACTIVE_PROFILES_PROPERTY_NAME)。 リターンproperty.equals(プロファイル)。 } 保護された 無効validateProfile(文字列プロファイル){ 場合(!StringUtils.hasText(プロファイル)){ スロー 新しい例外:IllegalArgumentException(" 無効なプロファイル[ " +プロフィール+ " ]:テキストが含まれている必要があります" ); } もし(profile.charAt(0)== ' !' ){ スロー 新しい(、IllegalArgumentExceptionを" 無効なプロファイル[ " +プロフィール+ " :]!とオペレータ開始してはなりません" ;) } } }