春の注釈@Qualifier詳細な分析

1.概要

今日、あなたが見て春のフレームワーク@Qualifier、それが解決しどのような問題、メモ、およびその使用方法。我々はまた、それが理解@Primaryで異なる音です。その他の技術的な分析をご覧くださいfelord.cn

2.痛みのポイント

使用@Autowired注釈がある春の偉大な依存性注入方法。しかし、いくつかのシーンだけでは十分では、注入したいものを最後にこのコメントの春のノウハウを作るために豆をデフォルトでは、@Autowiredアセンブリの種類に応じて春の豆容器の同じタイプが複数ある場合、フレームワークがスローされるNoUniqueBeanDefinitionException複数の条件が満たされている警告するビーン自動アセンブリ。プログラムは1が使用する権利判断を下すことができない、ここに鮮やかな例です。

    @Component("fooFormatter")
    public class FooFormatter implements Formatter {
        public String format() {
            return "foo";
        }
    }

    @Component("barFormatter")
    public class BarFormatter implements Formatter {
        public String format() {
            return "bar";
        }
    }

    @Component
    public class FooService {
        @Autowired
        private Formatter formatter;
        
        //todo 
    }
复制代码

我々がしようとした場合FooService、当社のコンテキストにロードし、春のフレームワークがスローされますNoUniqueBeanDefinitionExceptionこれは、春には注入するかわからなかった豆をこの問題を回避するには、いくつかのソリューションがあります。私たちは、紙に説明する必要がありますので@Qualifier注意事項をその一つです。下がる小さな脂肪の弟のリズムに従ってください。

3. @Qualifier

使用することにより@Qualifier、我々は注入する必要がなくなります注釈、豆の問題を。レッツは、私たちがどのように見含めることによって、前の例を再訪@Qualifier私たちはどの注釈を使用したいということが出てくるの問題を解決するために:

    @Component
    public class FooService {
        @Autowired
        @Qualifier("fooFormatter")
        private Formatter formatter;
        
        //todo 
    }
复制代码

@QualifierNotesと私たちは、特定の使用したいのSpring Beanは名前、一緒に組み立ての同じ型と会うアセンブリの要件のいくつかのフレームワーク缶Beanは、我々が欲しいものを見つけると、回避春のスプリットブレイン。私たちは、名前を決定する@Componentまたはvalueプロパティ@Bean注釈文です行う必要があります。実際に、私たちもできるFormatter実装クラスの使用@Qualifier、ノートの代わりに@Component、または@Bean指定した名前で、同じ効果を得ることができます。

     @Component
     @Qualifier("fooFormatter")
     public class FooFormatter implements Formatter {
         public String format() {
             return "foo";
         }
     }
 
     @Component
     @Qualifier("barFormatter")
     public class BarFormatter implements Formatter {
         public String format() {
             return "bar";
         }
     }
复制代码
  1. @Qualifier VS @Primary別呼ばある@Primaryアノテーションは、我々はまた、場合に発生注入曖昧にその依存性注入を決定するために使用することができる同じタイプの複数ある場合ビーン時間、このアノテーションは、プリファレンスを定義しました。特に指定しない限り、我々は、使用する@Primary注釈関連するBeanを例で見てみましょう:
    @Bean
    public Employee tomEmployee() {
        return new Employee("Tom");
    }

    @Bean
    @Primary
    public Employee johnEmployee() {
        return new Employee("john");
    }
复制代码

この例では、2つの方法は、同じ戻りあるEmployeeタイプ。スプリングは、注入された豆の方法は、johnEmployee返し豆をそれが含まれているためです@Primary注釈を。私たちはデフォルトを指定したい場合には、特定の型の中に注入されるべきこのコメントに便利。我々はいくつかの点で他の注入が必要な場合は、我々は、具体的にそれを指摘する必要があります。我々はできる@Qualifierこのコメントを行います。例えば、我々は使用することができ@Qualifier、我々は、アノテーションを使用することを指定するには、tomEmployeeメソッドの戻りBeanをそれは場合、ことは注目に値する@Qualifier@Primary注釈が存在する場合、@Qualifierコメントが優先されます。基本的に、@Primaryそれはデフォルト値を定義しますが、@Qualifier非常に具体的です。もちろん、@Componentまた、あなたが使用することができる@Primaryの使用例上記の注釈を、または3:

     @Component
     @Primary
     public class FooFormatter implements Formatter {
         public String format() {
             return "foo";
         }
     }
 
     @Component
     public class BarFormatter implements Formatter {
         public String format() {
             return "bar";
         }
     }
复制代码

この場合、@Primary注釈指定します。デフォルトの注入がされFooFormatterたシーンに注入あいまいさを排除しました。

名前は自動的に介して注入されます

使用時には@Autowired組立自動化されたとき、あればがない他のヒント、右見つけるために、変数名に基づいて注入される必要があります豆を依存性の注入はまた、あいまいさの問題を解決することができます。私たちの最初のコードに基づいていくつかの例で見てみましょう:

    @Component
    public class FooService {
        @Autowired
        private Formatter fooFormatter;
        
        //todo 
    }
复制代码

この場合、スプリングは、注入される決定BeanがあるFooFormatterので、私たちのフィールド名@Component又は@Bean値用い注釈(デフォルトの@Beanメソッド名)と一致します。

6.まとめ

@Qualifier探検、我々は、依存性注入の注釈が競合を排除するために使用されている知っています。これは、次のような日常の開発にRabbtimq非常に一般的なキューを宣言しました。脂肪兄弟はまた、組み合わせ、比較注釈及び上記の他の注釈によって、いくつかの小さな一般的な使用方法を示しました。これはあなたを助ける春の依存性注入メカニズムの理解。

关注公众号:Felordcn获取更多资讯

個人的なブログます。https://felord.cn

おすすめ

転載: juejin.im/post/5e0adfaa6fb9a0482806d826