2016-03-24 16 views
0

これらの2つのアノテーションの違いと、それらがSpringのインジェクションに与える影響を理解しようとしています。私はこの注釈を持つクラスをマークすると@Namedと@Componentの春の違い

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Component 
public @interface ExternalPropertiesHolder {} 

- - 次のコードを考えてみましょう

@ExternalPropertiesHolder 
public class SomeProperties {} 

し、この依存性が注入され@Injectを使用して、それが完璧に動作します -

@Service 
public class SomeService { 
    private SomeProperties someProperties; 

    @Inject 
    public SomeService(SomeProperties someProperties) { 
     this.someProperties = someProperties; 
    } 
} 

ただし、@Component@Namedに置き換えた場合 -

org.springframework.beans.factory.NoSuchBeanDefinitionException:タイプの無 適格ビーン[com.hogehoge.SomeProperties]によって引き起こさ

から10

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Named   // --> Here! 
public @interface ExternalPropertiesHolder {} 

そして注射は、通常の豆見つからない例外で失敗します 依存関係が見つかりました:autowireとなる少なくとも1つのbeanが必要です。この依存関係の候補は です。依存注釈:{}

I春リファレンスドキュメントを検索し、それがis this違いについて述べているすべて - JSR-330は、構成可能なモデルを提供していない

、識別するだけの方法 という名前のコンポーネント。

これは何を意味しますか?このようなカスタムマーカーを作成するのに@Namedを使用できないということですか?それとも何か他に何かありますか?

P.S.:もちろん@Component私はorg.springframework.stereotype.Componentを参照しています。@Named私はjavax.inject.Namedを参照しています。

+0

これらは同じである必要があります。あなたのケースを試してみました。カスタム注釈で@Namedを使用する場合にのみ動作します。私のバグのように見えます。 –

答えて

0

私はJuergen Hoellerから直接答えを得ました。 According to him、このライン -

は、JSR-330は、 という名前のコンポーネントを識別するためだけの方法を構成可能なモデルを提供していません。

は、javax.inject.Namedが特定のBeanクラスで直接宣言できることを意味します。作成可能なアノテーションのストーリーは、Springの独自の注釈でのみ動作します。これはまさに私が疑ったものです。

関連する問題