1に、基本的なアノテーションベースの設定ビーンについて話しましたが、豆は、それぞれとの間に関連はなかった、と今、私たちは次のような機能を実現したいです。
ベースディレクトリ:
UserController.java
この呼び出しは、メソッドのUserServiceのを追加します。
パッケージcom.gong.spring.beans.annotation.controller。 輸入org.springframework.stereotype.Controller; 輸入com.gong.spring.beans.annotation.service.UserService。 @Controller パブリック クラスUserControllerで{ プライベートUserServiceのUserServiceの。 公共 ボイドは(){を実行 するSystem.out.printlnは( "UserControllerでは、方法を実行的" )。 userService.add(); } }
UserService.java
この呼び出しは、メソッドのUserRepositoryを保存します。
パッケージcom.gong.spring.beans.annotation.service。 輸入org.springframework.stereotype.Service。 輸入com.gong.spring.beans.annotation.repository.UserRepository。 @Service パブリック クラスUserServiceの{ プライベート; UserRepository userRepository 公共 ボイド追加(){ System.out.printlnは( "UserServiceの中的方法の追加" )。 userRepository.save(); } }
UserRepository.java
パッケージcom.gong.spring.beans.annotation.repository。 パブリック インターフェイスUserRepository { 公共 のボイド(保存)。 }
UserRepositoryImpl.java
パッケージcom.gong.spring.beans.annotation.repository。 輸入org.springframework.stereotype.Repository。 @Repository(値 = "userRepository" ) パブリック クラス UserRepositoryImpl 実装UserRepository { @Override 公共 ボイド(セーブ){ // TODO自動生成方法スタブ のSystem.out.println( "UserReposityImpl的は方法保存" )。 } }
Main.java
パッケージcom.gong.spring.beans.annotation。 輸入org.springframework.context.ApplicationContext; 輸入org.springframework.context.support.ClassPathXmlApplicationContext; 輸入com.gong.spring.beans.annotation.controller.UserController; パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数){ // 1创建バネ的IOC容器对象 のApplicationContext CTX = 新しい ClassPathXmlApplicationContext( "豆-annotation.xml" )。 // 2.从容器中获取豆实例 UserControllerでUserControllerで=(UserControllerで)ctx.getBean( "UserControllerで" ); System.out.println(UserControllerで)。 userController.execute(); } }
豆-annotation.xml
<?= "1.0"エンコード= "UTF-8" XMLバージョン?> < 豆のxmlns = "http://www.springframework.org/schema/beans" のxmlns:XSI = "http://www.w3.org/2001 / XMLスキーマ・インスタンス" のxmlns:コンテキスト= "http://www.springframework.org/schema/context" XSI:のschemaLocation =" http://www.springframework.org/schema/beansのhttp://www.springframework。 ORG /スキーマ/豆/春-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd」> <! - - 配置springIOC容器扫描的包- > < コンテキスト:> </ コンテキスト:コンポーネントスキャン> </ 豆>
前のセクションでは、通常の配置、印刷出力結果:
我々はUserControllerででUserServiceのプロパティを組み立てていないので、NULLポインタ例外が報告されます。
コンポーネントアセンブリ:<コンテキスト:コンポーネント・スキャン>自動的に自動的にリソースと@Inject注釈特性@、@ Autowiredで組み立てることができるAutowiredAnnotationBeanPostProcessorインスタンスを登録します。
タイプと互換性のある単一の自動組立Beanプロパティを使用して@Autowired注釈:
- コンストラクタ:通常のフィールドも非パブリック、すべてのパラメータは、メソッド@Autowiredアノテーションで使用することができます。
- デフォルトでは、@Autowiredアノテーションを使用してすべての属性を設定する必要があります。春は、プロパティを組み立てるために任意のBeanを一致しませんでした場合は、例外がスローされます。プロパティがセットに許可されていない場合は、falseに@Autowired注釈に必要な属性を設定することができます。
- デフォルトでは、ときに複数種類の互換性の豆springIOC容器は、自動組立タイプで動作しません。この時点で、あなたは可能で豆@Qualifierノートの名前を提供します。メソッドは、指定された噴射パラメータにばねが豆の@Qualifier名前を表記可能。
- @Autowired注釈は、属性のデータ・タイプに適用されてもよいし、スプリングは、すべてのBean自動組立に一致します。
- @Autowired注釈がプロパティのコレクションに適用されてもよいし、種類情報セットスプリング読み出し、その後豆の自動組立てと互換性のあるすべての。
- マップ文字列のキーは、次いで、ばねアセンブリ値型地図豆、このときのキーのビーン名で自動的に互換性がある場合、@Autowired jav.util.Mapで使用される場合。
話はそんなに、それは@Autowiredを使用すること、であるプロパティは自動的に対応するBeanに装着させて、次のようになります。
@Autowired プライベートUserServiceのUserServiceの。 @Autowired プライベート UserRepository userRepository。
だから、あなたは通常、出力を実行することができます。
もちろん、別の方法ではなく財産よりも、注釈のための@Autowired setterメソッドにあるがあり、すなわち、:
プライベートUserRepository userRepository。 @Autowired 公共 ボイドsetUserRepository(UserRepository userRepository){ この .userRepository = userRepository。 }
また、これは可能です。
TestObject.java
パッケージcom.gong.spring.beans.annotation。 輸入org.springframework.stereotype.Component; @Component パブリック クラスTestObject { }
次は中userRepositoryImplを追加しました:
パッケージcom.gong.spring.beans.annotation.repository。 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.stereotype.Repository。 輸入com.gong.spring.beans.annotation.TestObject; (値@Repository = "userRepository" ) パブリック クラス UserRepositoryImpl 実装UserRepository { @Autowired プライベートTestObject testObject。 @Override 公共 無効{)(SAVE // TODO自動生成されたメソッドスタブ のSystem.out.println( "UserReposityImpl的には方法救います" ); System.out.println(testObject)。 } }
プログラムが実行されます。
私達は@Component削除コメントでTestObjec.java:
警告:コンテキストの初期化中に発生した例外 - リフレッシュの試行をキャンセル:org.springframework.beans.factory.UnsatisfiedDependencyException:エラー名「UserControllerで」を持つBeanの作成:フィールド「UserServiceの」を通して表現不満の依存関係を、ネストされた例外はorg.springframework.beans.factory.UnsatisfiedDependencyExceptionある:エラー「UserServiceの」名前の豆作成:0パラメーターメソッド「setUserRepository」を通して表現不満依存性を、ネストされた例外はorg.springframework.beans.factory.UnsatisfiedDependencyExceptionです:「userRepository」名前を持つBeanの作成エラー:フィールド「testObject」を通して表現不満の依存関係を、ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionです:いいえは、型「com.gong.spring.beansの豆を修飾します。annotation.TestObject」利用可能:autowire候補者としての資格を少なくとも1豆期待。依存注釈:{@ org.springframework.beans.factory.annotation.Autowired(必須=真)}
我々が設定しているため。
@Autowired プライベート TestObject testObject。
豆を見つけられませんでした、それは例外がスローされます。
私たちのプラス:説明プロパティをインストールする必要はありません
(必要= @Autowired 偽) プライベート TestObject testObject。
このとき、何のフィッティングTestObjectは投げないではないにもかかわらず、すなわち、
私たちは、その後、UserJdbcRepository.javaを作成します(;; System.out.printlnは(testObject)私たちは、@Autowired(必要= false)をプライベートTestObject testObjectを削除しました)
パッケージcom.gong.spring.beans.annotation.repository。 輸入org.springframework.stereotype.Repository。 @Repository パブリック クラス UserJdbcRepository 実装UserRepository { @Override 公共 のボイド(保存){ // TODO自動生成されたメソッドスタブ のSystem.out.println( "UserJdbcRepository的には方法救います" ); } }
:同時に値プロパティは、実行が例外をスローします@Repository(値=「userRepository」)を削除しませ単一Beanを。
より多くのBean実装クラスよりがある場合、我々はつまり、あなたが呼び出すときに名前を呼び出し、Beanの名前を指定する必要があります。
プライベートUserRepository userRepository。 @Autowired 公共 ボイドsetUserRepository(UserRepository userRepository){ この .userRepository = userRepository。 }
それとも私たちは、組み立てられたBean名を指定します。
プライベートUserRepository userRepository。 @Autowired @Qualifier( "userJdbcRepository" ) 公共 ボイドsetUserRepository(UserRepository userRepository){ この .userRepository = userRepository。 }
出力:
ノートはまた、setterメソッドに入れることができます。
private UserRepository userRepository; @Autowired public void setUserRepository(@Qualifier("userJdbcRepository") UserRepository userRepository) { this.userRepository = userRepository; }
@Resource和@Inject和@Autowired类似,一般使用@Autowired就足够了。