web-dev-qa-db-ja.com

SpringMVCの@Namedアノテーション

Spring 3ドキュメントによると、 IoCコンテナー@Namedアノテーションは、@Componentアノテーションと同等の標準です。

@Repository@Service、および@Controllerはすべて@Componentであるため、SpringMVCアプリケーションでそれらすべてに@Namedを使用しようとしました。それはうまくいきます。しかし、@Controllerの置き換えにはバグがあるようです。コントローラクラスでは、もともとは

@Controller
public class MyController{
    ...
}

それはうまくいきます。 @Controller@Namedに変更したとき

@Named
public class MyController{
    ...
}

エラーで失敗しました:

「URIを使用したHTTPリクエストのマッピングが見つかりません...」。

しかし、次のように@RequestMappingをクラスに追加した場合

@Named
@RequestMapping
public class MyController{
     ...
 }

期待どおりに機能します。

@Repository@Serviceについては、問題なく@Namedに置き換えることができます。ただし、@Controllerの置き換えには追加の作業が必要です。構成に欠けているものはありますか?

15
Dino Tw

@Named@Componentと同じように機能します。ただし、注釈@Controller@Service、および@Repositoryはより具体的です。

春から docs

@Componentは、Springが管理するコンポーネントの一般的なステレオタイプです。 @Repository@Service、および@Controllerは、それぞれ永続性、サービス、およびプレゼンテーション層など、より具体的なユースケース向けの@Componentの特殊化です。

たとえば、これらのステレオタイプアノテーションは、ポイントカットの理想的なターゲットになります。 @Repository@Service、および@Controllerは、SpringFrameworkの将来のリリースで追加のセマンティクスを実行する可能性もあります。したがって、サービスレイヤーに@Componentまたは@Serviceのどちらを使用するかを選択する場合は、@Serviceの方が明らかに適しています。同様に、前述のように、@Repositoryは、永続層での自動例外変換のマーカーとしてすでにサポートされています。

This セクションでは、@Namedとの違いについて説明しています。

SpringのDispatcherServletWebApplicationContextのMVC構成)のような多くのコンポーネントはComponentを探していませんが、@Controllerを探しています。したがって、クラスをスキャンしても、@Namedには見つかりません。同様に、@Transactionalを使用したトランザクション管理では、より一般的な@Serviceではなく、@Repository@Componentが検索されます。

20

すべて @Repository@Serviceおよび@Controllerは、主にSpring Beanを宣言するためのものですが、コントローラー、daoなどのBeanのタイプに関する追加情報をSpringに提供します。

4
Abhilash reddy