スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring @Autowiredと@Injectアノテーション

最近、インジェクションのアノテーションに@Autowiredではなく、@Injectを使用している場面を見かけるので、試してみることにした。

検証内容として、同じインターフェースを実装したクラスに@Serviceアノテーションを付与して、インジェクションした場合どうなるか確認する。(コンポーネントスキャンを使用)

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.3.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.Mavenのpom.xml
@Injectアノテーションを使用するためには、javax.injectライブラリが必要なため、pom.xmlに以下のように設定した。



javax.inject
javax.inject
1



2.同じインターフェースを実装したクラス

import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl implements BookService {
//省略
}


import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl2 implements BookService {
//省略
}


3.検証(@Autowiredの場合で、@Qualifierの設定が間違っている)

@Controller
@RequestMapping("book")
public class BookController {

@Autowired
@Qualifier("BookServiceImpl2")
protected BookService bookService;

実行すると、原因が「org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected jp.co.sample.book.service.BookService jp.co.sample.book.controller.BookController.bookService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [jp.co.sample.book.service.BookService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=BookServiceImpl2)}」のエラーとなる。
ちなみに@Qualifier("bookServiceImpl2")で正常に動作する。@Serviceのデフォルトはクラス名の先頭を小文字にした値のようだ。

4.検証(@Injectの場合で、@Qualifierの設定が間違っている)


@Controller
@RequestMapping("book")
public class BookController {

@Inject
@Qualifier("BookServiceImpl2")
protected BookService bookService;

実行すると、原因が「org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected jp.co.sample.book.service.BookService jp.co.sample.book.controller.BookController.bookService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [jp.co.sample.book.service.BookService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject(), @org.springframework.beans.factory.annotation.Qualifier(value=BookServiceImpl2)}」のエラーとなる。
③同様、@Qualifier("bookServiceImpl2")で正常に動作する。

5.まとめ
今までSpringを使う際には、@Autowiredを使用していたが、@Injectでも同じようにインジェクションできることが確認できた。エラー内容も同じと言ってよさそう。強いて差分を挙げれば、@Autowiredの方は属性値にrequired=true/falseで必須か任意かを設定できること位か。required=false設定にした場合、Springのコンテナに登録されていなくてもエラーにならないため、@Autowiredの方が若干使い勝手が良さそうに思われる。一方、@InjectはJava EE標準という強みがある。どちらが良いかはもう少し様子を見ることにしよう。

■過去のSpring関連記事
Spring関連記事 Index


スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。