2

私は Google Guice 経由で IOC に入りました。

そして今、Spring 2.5.6 を職場で使わざるを得なくなり、Spring は非常に複雑なため迷っています。春のドキュメントのビットを読んだ後のいくつかの質問は次のとおりです。

  • @Service@Controllerはどう違い@Componentますか?Guice のようなオブジェクトを自動配線したいだけの場合、これらすべてのステレオタイプに煩わされる必要がありますか?
  • 私は、コンストラクター インジェクション (Setter インジェクションは主に Scientology 教会によって提唱されています) のみで、おかしな XML を使用せずに、コンポーネント スキャン ルートに進むことを計画しています。それで、このコード抽出は私が必要とするすべてですか?

    @Component
    public class Foo
    {
        @Autowired(required=true)
        public Foo( Bar bar, @Qualifier("yay") Boo yay, 
                    @Qualifier("hoo") Boo hoo )
        {
            _bar = bar; _boo = boo;
        }
    
        Bar _bar;
        Boo _boo;
    ....snipped...
    }
    
    @Component
    @Qualifier("yay")
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public BooYay implements Boo
    {
    }
    
    @Component
    @Qualifier("hoo")
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public BooHoo implements Boo
    {
    }
    
    • 上記の例で、 の 2 つの異なる実装を正しく修飾できましたBooか?
    • Google Guice の Providers に似た機能はありますか?
    • @SingletonSpring で (Guice の) 動作を模倣するにはどうすればよいですか?
4

1 に答える 1

4

コードを見ると、すべて問題ないようで、コンポーネントはautowired. Spring が注釈をスキャンできるように、XML 構成ファイルでパッケージ名を指定する必要があります。

一般に、Spring 管理のコンポーネントでは、自動検出されたコンポーネントのデフォルトで最も一般的なスコープはシングルトンです。

実際、@Component は @Service と @Controller の一般化です。ドキュメントを参照してください。

Spring 2.5 では、@Component、@Service、および @Controller という追加のステレオタイプ アノテーションが導入されています。@Component は、Spring 管理のコンポーネントの一般的なステレオタイプとして機能します。一方、@Repository、@Service、および @Controller は、より具体的なユースケース (たとえば、それぞれ永続化、サービス、およびプレゼンテーション層) 向けの @Component の特殊化として機能します。つまり、コンポーネント クラスに @Component でアノテーションを付けることができますが、代わりに @Repository、@Service、または @Controller でアノテーションを付けると、クラスはツールによる処理やアスペクトとの関連付けにより適したものになります。たとえば、これらのステレオタイプの注釈は、ポイントカットの理想的なターゲットになります。もちろん、@Repository、@Service、@Controller は、Spring Framework の将来のリリースで追加のセマンティクスを運ぶ可能性があります。したがって、サービス層に @Component と @Service のどちらを使用するかを決定する場合、明らかに @Service の方が適しています。同様に、前述のように、@Repository は永続化レイヤーでの自動例外変換のマーカーとして既にサポートされています。

default-autowireこれらの Bean のまたはautowireの値が であることを確認してくださいbyType。次に、以下のように Boo コンポーネントを変更する必要があります。

@Component("yay")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public BooYay implements Boo
{...}


@Component("hoo")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public BooHoo implements Boo
{...}

を使用したいautowire = "byName"場合があります。その場合、 は必要ありませんが@Qualifiers、一致するセッターを提供する必要があります。私はあなたが今物事をノックアウトすることに成功したことを願っています.

于 2009-11-18T02:52:02.767 に答える