日々の開発では、このようなシナリオの存在は、インタフェースのフレームワークは、デフォルトの実装たAIMP1の種類を提供し、変更のための需要に伴い、今日たAIMP1は、機能的なニーズを満たしていない、そして、私たちはどのように行うことができますか?もちろん、それは第三者それに依存している場合、前記AIMP1の実装コードを変更することですが、?前記AIMP1デフォルトの実装は、このモジュールのための私達に提供し、ユーザーがそれを使用することができますか、我々は機能モジュールの外に書いた、それも行う方法を、要求(または拡張子)でカバーすることができますか?
この点で、春には、それはこのような問題を解決することができます使用して、私たちに@Conditionalノートを提供しています。
ここで、例えば。そこRandomGeneratorインタフェース、ランダムな文字列を生成するジェネレータ()メソッドを有するインターフェースと、2つの実装クラスStringRandomGeneratorは、デフォルトの実装であることを特徴とする請求StringRandomGenerator NumberRandomGeneratorがあります。それは、私たちがNumberRandomGeneratorを設定しない場合には、StringRandomGeneratorは、我々はNumberRandomGeneratorを設定したランダムな文字列を生成使用し、NumberRandomGeneratorはランダムな文字列を生成し使用しています。
/ ** *トップレベルインターフェースは、ランダムな文字列を生成する * / パブリック インターフェイスrandomGeneratorを{ ジェネレータ(物体); }
輸入org.apache.commons.lang.RandomStringUtils。 パブリック クラス StringRandomGeneratorは実装RandomGenerator { @Override パブリックオブジェクト生成(){ CHAR []文字の= { 'A'、 'B'、 'C'、 'D'、 'E'、 'F'、 'G' }。 ストリングランダム = RandomStringUtils.random(5 、文字)。 リターン「StringRandomGenerator:」+ ランダム。 } }
/ ** * NumberRandomGeneratorがスプリングBeanとして登録され、StringRandomGenerator障害 *等価ジェネレータ関数ジェネレータNumberRandomGenerator StringRandomGenerator被覆する方法 * / @Component パブリック クラスを NumberRandomGenerator 実装randomGenerator { @Override パブリックオブジェクト生成(){ 文字列ランダム = RandomStringUtils.random(5。trueに、trueに;) リターン "NumberRandomGenerator:" + ランダム; } }
/ ** *コンフィギュレーションクラス * / @SpringBootConfiguration パブリック クラスRandomGeneratorConfig { / ** * @ConditionalOnMissingBean(= RandomGenerator.class値) *注釈手段:コンテナは、ビーン型IocをRandomGeneratorない場合 * StringRandomGeneratorに登録しますIOCコンテナ * / @Bean @ConditionalOnMissingBean(値 randomGenerator = クラス) パブリックrandomGenerator stringRandomGenerator(){ 戻り 新しい新しいstringRandomGeneratorを(); } }
最後に、テストコントローラを書きます
@RestController パブリック クラスRandomController { @Autowired プライベートRandomGenerator randomGenerator。 @GetMapping( "/ランダム" ) 公衆ランダムオブジェクト(){ 戻り)(randomGenerator.generatorします。 } }
次のように登録されNumberRandomGenerator IoCコンテナ場合、試験結果は次のとおりです。
次に、我々はテスト、その後、殺す@Component NumberRandomGeneratorクラスにコメントします
パーフェクト!