チュートリアルの春BOOT2シリーズ(7)は、自動化された構成の原理を理解します

確かに非常に魅力的な春ブーツの自動設定、発言は少し誇張に聞こえるが、いくつかのも、それが再び生活に戻ってJavaの春ブーツを聞かせて言うが、一度肥大化面倒なSpring構成は、人々が大きな頭を感じさせるん、ということは否めません春ブーツは、新しい自動化設定をもたらしながら、実際にこの問題を軽減します。

あなたが自動化されて、この構成を実現する方法を尋ねる場合、多くの人がスターターの事だと思います!そして、それは何であるのスターター原理?歌Geが以前にカスタムスターターについての記事を書きました:

この辺は非常に重要なポイントがあり、それはある条件のメモにも条件注釈が全体春ブーツの礎石であると言うことができます。

条件コメントは新しいものではありません、それは存在の春のことだ、私たちは春のプロファイルで使用することは、実際に専門の条件注釈です。

原則春ブーツので、今日私たちが来て、歌のGe条件のコメントをチャットします、conditionアノテーションを使用する必要が知りたいです。

定義

我々は、自動化された構成の多数の条件注釈によって達成され、この配置は広く春ブーツに使用されてきたさまざまな条件を満たすことでさまざまな豆を作成できるようにSpring4は、より一般的な条件の注釈を提供します歌のGe春ブーツは、すべての条件のメモなしで行うことはできません基本的には、記事のソースの解釈に関連する以前の記事を見ます:

いくつかのパートナーは、小さなノート条件を使用することはできませんが、開発環境、本番環境は、プロファイル以下切り替えるそれを使用していますか?実際には、これは条件注釈の特殊なケースです。

練習

春ブーツにもかかわらず、のは単に条件春の注釈の使用状況を見てみましょう。

まず、次のように我々は、一般的なMavenプロジェクト、春・コンテキストの後、導入を作成します。

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.5.RELEASE</version>
    </dependency>
</dependencies>

そして、食品・インタフェースを定義します。

public interface Food {
    String showName();
}

食品・インターフェースは、2つのクラスを実装showName方法があります。

public class Rice implements Food {
    public String showName() {
        return "米饭";
    }
}
public class Noodles implements Food {
    public String showName() {
        return "面条";
    }
}

米や麺類は、2つのクラスは、クラスが2つのshowNameメソッドを実装し、異なる値を返しています。

次のように再作成する条件は、米や麺のようなものでした:

public class NoodlesCondition implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("people").equals("北方人");
    }
}
public class RiceCondition implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("people").equals("南方人");
    }
}

プロパティシステムの人々は「北」時間の属性値際、NoodlesConditionの条件が満たされ、人々は属性値をシステムが「南」の時間で、条件が一致したが、判定処理を行う属性、RiceCondition条件が満たされています言い換えれば、どのような条件は、しばらくの間、ビーンが作成される、満たされています。

次は米と麺を設定します。

@Configuration
public class JavaConfig {
    @Bean("food")
    @Conditional(RiceCondition.class)
    Food rice() {
        return new Rice();
    }
    @Bean("food")
    @Conditional(NoodlesCondition.class)
    Food noodles() {
        return new Noodles();
    }
}

このコンフィギュレーションクラスは、我々は二つの場所に注意を集中します:

  • ビーンは、食品用の2つの名前である、これは偶然ではありませんが、取ることを意図しています。豆は、2つの値は、親クラスのオブジェクト食品です返します。
  • 豆各注釈戻り値は、プロセス条件の真の一致クラスはBeanの対応@Conditional注釈を有効にするに配置されたときに、より@Conditionalです。

設定が完了すると、我々は、mainメソッドをテストすることができます。

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.getEnvironment().getSystemProperties().put("people", "南方人");
        ctx.register(JavaConfig.class);
        ctx.refresh();
        Food food = (Food) ctx.getBean("food");
        System.out.println(food.showName());
    }
}

まず、Javaクラスをロードするために使用AnnotationConfigApplicationContextインスタンス構成を作成し、我々は中に環境へのプロパティを追加し、添加が完了した後、コンテナを更新し、私たちのクラスを登録した構成に進みます。コンテナのリフレッシュが完了した後、我々はコンテナインスタンスから食料を得るために行くことができ、この例では、異なる食品インスタンスの外に作成された、さまざまな人々の属性に基づいて行われます。

これは、条件春のコメントです。

進化

条件はそのプロフィール進化を指摘もあります。開発環境と本番環境の間の迅速な切り替えを実現するために、我々は一般的にプロファイルを使用しています。実際には、プロファイルの注釈は、達成するための条件を使用することです。

以前の例では、我々はプロファイルにわずかに変更された外観を使用します。

次のように豆が定義されているときライスヌードルと定義は変更されません。まず食べ物は、私たちはこのコメントの条件を必要としない、我々は直接@Profileコメントを追加しました:

@Configuration
public class JavaConfig {
    @Bean("food")
    @Profile("南方人")
    Food rice() {
        return new Rice();
    }
    @Bean("food")
    @Profile("北方人")
    Food noodles() {
        return new Noodles();
    }
}

この状態は@Profileに置き換えられたコメントを、必要ありません。次に、以下のようMainメソッド、Beanがロードされました:

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.getEnvironment().setActiveProfiles("南方人");
        ctx.register(JavaConfig.class);
        ctx.refresh();
        Food food = (Food) ctx.getBean("food");
        System.out.println(food.showName());
    }
}

そして、上記の例と同様の効果。

これは一見さらに便利@Conditionalノートより@Profileコメントを見えます、そして最後にはノートが@Profileがそれを達成するために何ですか?

私たちは、@Profile定義を見て:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {
    String[] value();
}

我々は、それが条件コメントで実装されていることがわかります。条件クラスはProfileConditionで、私たちは見てみましょう:

class ProfileCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
        if (attrs != null) {
            for (Object value : attrs.get("value")) {
                if (context.getEnvironment().acceptsProfiles(Profiles.of((String[]) value))) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }
}

理解するには、ここを参照してください、それは我々が物事のセットでノートを書いた状態のままですが、@Profileは自動的に私たちはそれを達成するのを助ける指摘しています。

具体的な判定ロジックは、私たち自身の実装ではありませんので@Profileは、便利な、しかし十分に柔軟ではありません。@Conditionalは、より柔軟です。

エピローグ

春のアノテーションを使用するための条件を表示するには、2つの例が、それは核となるアイデアは、一定の条件が満たされたときに、豆を有効にすることですだし、それは春ブーツの自動化から、この特性は、支持体でありますコンフィギュレーション。

さて、私たちは、ここで停止ディスカッションの質問があり、メッセージを残してください。

ジャワ、JavaのドライソングGeはあなたのために慎重に準備された受信した後、国民の関心番号[南]少し雨が、懸念は返信共有するために、定期的に春ブーツ+マイクロサービスとフロントと分離フルスタック技術、ビデオチュートリアルの後端に焦点を当てました!

おすすめ

転載: www.cnblogs.com/lenve/p/11572518.html