これらの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
に置き換えた場合 -
から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
を参照しています。
これらは同じである必要があります。あなたのケースを試してみました。カスタム注釈で@Namedを使用する場合にのみ動作します。私のバグのように見えます。 –