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
の置き換えには追加の作業が必要です。構成に欠けているものはありますか?
@Named
は@Component
と同じように機能します。ただし、注釈@Controller
、@Service
、および@Repository
はより具体的です。
春から docs :
@Component
は、Springが管理するコンポーネントの一般的なステレオタイプです。@Repository
、@Service
、および@Controller
は、それぞれ永続性、サービス、およびプレゼンテーション層など、より具体的なユースケース向けの@Component
の特殊化です。たとえば、これらのステレオタイプアノテーションは、ポイントカットの理想的なターゲットになります。
@Repository
、@Service
、および@Controller
は、SpringFrameworkの将来のリリースで追加のセマンティクスを実行する可能性もあります。したがって、サービスレイヤーに@Component
または@Service
のどちらを使用するかを選択する場合は、@Service
の方が明らかに適しています。同様に、前述のように、@Repository
は、永続層での自動例外変換のマーカーとしてすでにサポートされています。
This セクションでは、@Named
との違いについて説明しています。
SpringのDispatcherServlet
(WebApplicationContext
のMVC構成)のような多くのコンポーネントはComponent
を探していませんが、@Controller
を探しています。したがって、クラスをスキャンしても、@Named
には見つかりません。同様に、@Transactional
を使用したトランザクション管理では、より一般的な@Service
ではなく、@Repository
と@Component
が検索されます。
すべて @Repository
、@Service
および@Controller
は、主にSpring Beanを宣言するためのものですが、コントローラー、daoなどのBeanのタイプに関する追加情報をSpringに提供します。