自動組立
コンセプト
スプリング各容器IOC依存割当の組み立てを完了するために、依存性注入(DI)を使用。
@Autowired -----自動注入
図1に示すように、容器に成分の種類に応じて、対応するデフォルトの優先順位を見つけます
applicationContext.getBean(BookDao。クラス);
割り当てに発見
2、IDが容器アセンブリを見つけるために、同じタイプの複数の構成要素は、プロパティ名、発見された場合
applicationContext.getBean( "bookDao");
3、@修飾子( "bookDao")
代わりに、プロパティ名を使用するのではなく、必要な@Qualifier ID指定されたコンポーネントアセンブリを使用してください。
4、自動組立がデフォルトの割り当ては良好である属性に必ず、エラーはなくなります
あなたは@Autowired(=偽必要)を使用することができます。
5、@プライマリ
豆のアセンブリの名前を指定する@Qualifier必要性を継続して使用することができます。豆のデフォルトの選択は、自動組立のために春をしてみましょう。
インジェクション例:
BookServiceを{
@Autowired
BookDao bookDao。
}
@Resource&@Inject -----春@Resource(JSR250)と@Inject(JSR330)[Java仕様のコメント]をサポートしてい
@リソース
@Autowiredと、自動アセンブリを機能させることができる。デフォルト値はコンポーネント名に従って組み立てられる。@Primaryはサポート機能が@Autowired(偽= reqiured)がサポートされていません。
@Inject
あなたはjavax.injectパッケージをインポートする必要がある、とAutowiredは、同じ機能します。= falseの機能を必要なわけではありません。
注: @Autowired:春定義され;リソース@、@すべてのJava仕様を注入
パッケージcom.atguigu.service。 輸入javax.annotation.Resource。 輸入javax.inject.Inject。 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.beans.factory.annotation.Qualifier; 輸入org.springframework.stereotype.Service。 輸入com.atguigu.dao.BookDao。 @Service パブリック クラスBookServiceを{ // @Qualifier( "bookDao") // @Autowired(必要=偽) // @Resource(名前= "bookDao2") @Inject プライベートBookDao bookDao。 公共 のボイドプリント(){ System.out.printlnは(bookDao)。 } @Override パブリック文字列のtoString(){ リターン "BookServiceを[bookDao =" + bookDao + "]" 。 } }
原理:AutowiredAnnotationBeanPostProcessor:autowireが解析されました。
方法、自動組立の位置----- @ Autowiredの構成
容器からのパラメータの取得; @Autowired効果を書き込まないデフォルトは同じであり、自動組立をすることができる----- @豆+メソッドのパラメータは、[方法は、位置をマーク]
以下のためのパッケージ変更com.atguigu.bean; インポートorg.springframework.beans.factory.annotation.Autowired; インポートorg.springframework.stereotype.Component; // デフォルトはIOCコンテナコンポーネントに追加され、コンテナの開始は、オブジェクトを作成するには、引数なしのコンストラクタを呼び出します。 、そのような割り当ての初期化などの操作 @Component パブリック クラスボス{ 専用車CARを、 公共車getCar(){ 戻りCAR; } @Autowired //が割り当てを完了するために、メソッドが呼び出され、Springコンテナが現在のオブジェクトを作成し、この方法でマーク; / / 使用方法のパラメータ、容器IOCから取得したカスタム値の種類 公共 ボイド関数setcar(自動車CAR){ この .CAR = CAR; } @Override パブリック文字列のtoString(){ リターン "ボス[車=" +車+ "]" 。 } }
成分のみコンストラクタパラメータがある場合、このパラメータは、コンストラクタを省略してもよい@Autowiredた、またはコンポーネントのパラメータの位置を自動的に容器から取得されてもよい、----- [コンストラクタにマーク]
以下のためのパッケージ変更com.atguigu.bean; インポートorg.springframework.beans.factory.annotation.Autowired; インポートorg.springframework.stereotype.Component; // デフォルトはIOCコンテナコンポーネントに追加され、コンテナの開始は、オブジェクトを作成するには、引数なしのコンストラクタを呼び出します。 、そのような割り当ての初期化などの操作 @Component パブリック クラスボス{ 専用車CAR; // コンストラクタ使用コンポーネントは、コンテナから取得さ @Autowired パブリックボス(自動車CAR){ この .CAR = ; CAR のSystem.out .println( "ボス...そこに引数のコンストラクタ" ); } パブリックカーgetCar(){ 戻りCAR; } パブリック 無効関数setcar(車車){ この .CAR = 車。 } @Override パブリック文字列のtoString(){ リターン "ボス[車=" +車+ "]" 。 } }
ばねの構成要素と原理の根底にある認識注射
xxxAwareを達成するために、カスタムコンポーネント;あなたは根本的なSpringコンテナ(ApplicationContextの、たBeanFactory、XXX)の構成要素のうちのいくつかを使用するカスタムコンポーネントメソッドオブジェクトを作成するとき、それはインターフェース指定インジェクション関連のコンポーネントを呼び出し、認識、春の一番下に注入し、いくつかのコンポーネントカスタムで豆。
ルール:xxxAware:関数はxxxProcessorを使用しています
ApplicationContextAware == "ApplicationContextAwareProcessor。
我々は現在の環境、動的活性およびコンポーネントのセットの切り替えに応じて提供するプロファイル-----春。
通常のエンタープライズプロジェクトは、一般的に、開発環境、テスト環境、本番環境を持っています。データソース:(/ A)(/ B)(/ C);
@Profile:コンテナに登録することができる環境の指定されたコンポーネントの場合、このコンポーネントは、登録された環境を指定しません
例:-----使用C3P0、MySQLデータベースのコードを変更することなく、さまざまなデータソース、データソースを使用する異なる環境
1、dbconfig.properties
db.user = ルート db.password = 123456 db.driverClass =はcom.mysql.jdbc.Driver
2、MainConfigOfProfile
パッケージcom.atguigu.config。 インポートするjavax.sql.DataSource; 輸入org.springframework.beans.factory.annotation.Value。 輸入org.springframework.context.EmbeddedValueResolverAware。 輸入org.springframework.context.annotation.Bean。 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.context.annotation.Profile。 輸入org.springframework.context.annotation.PropertySource。 輸入org.springframework.util.StringValueResolver; 輸入com.atguigu.bean.Yellow; 輸入com.mchange.v2.c3p0.ComboPooledDataSource。 / ** * @Profile:コンテナに登録することができる環境の特定の成分の場合には、どのような環境が指定されていないこのコンポーネントを登録することができる * * 1)、ビーン同定環境を追加するときに得、この環境でのみ活性化されます容器に登録。デフォルトはデフォルト環境である * 2)、コンフィギュレーション・クラス、唯一の指定された環境で書かれ、内部設定されたすべてのクラスの全体構成を有効にするには開始します * 3)、豆で特定された環境をマークしていない、どのような環境がロードされています; * / @PropertySource( "CLASSPATH:/dbconfig.properties" ) @Configuration パブリック クラス MainConfigOfProfile 実装EmbeddedValueResolverAware { @value( "db.User $ {}" ) プライベート文字列ユーザー; プライベートStringValueResolver valueResolver; プライベート文字列driverClass; // このBeanには環境ラベルではありませんので、どのような環境がロードされ、環境ならば、それだけで、対応する環境にロードされます @Bean 公共イエローイエロー(){ 戻り 新しい)(イエロー; } @Profile( "試験" ) @Bean( "testDataSource" ) 公衆データソースdataSourceTest(@value( "$ {db.password}")は、文字列PWD)はスロー例外{ ComboPooledDataSourceのdataSource = 新しいComboPooledDataSourceを(); dataSource.setUser(ユーザ)。 dataSource.setPassword(PWD)。 dataSource.setJdbcUrl( "JDBCます。mysql:// localhostを:3306 /テスト" ); dataSource.setDriverClass(driverClass)。 リターン情報源; } @Profile( "DEV" ) @Bean( "devDataSource" ) 公衆データソースdataSourceDev(@value( "$ {db.password}")は、文字列PWD)はスロー例外{ ComboPooledDataSourceのdataSource = 新しいComboPooledDataSourceを(); dataSource.setUser(ユーザ)。 dataSource.setPassword(PWD)。 dataSource.setJdbcUrl( "JDBCます。mysql:// localhostを:3306 / ssm_crud" ); dataSource.setDriverClass(driverClass)。 返すデータソースを。 } @Profile( "PROD""prodDataSource" ) 公衆データソースdataSourceProd(@value( "db.Password $ {}")文字列PWD)はスロー例外{ ComboPooledDataSourceのdataSource = 新しい新しいComboPooledDataSource(); dataSource.setUser(ユーザ); dataSource.setPassword(PWD); DataSourceを。 setJdbcUrl( "JDBC:MySQLの:// localhostを:3306 / scw_0515" ); dataSource.setDriverClass(driverClass); 戻りデータソース; } // この値リゾルババネが設けられ、それはStringValueResolver $ {によって構成ファイルから直接解決することができ} db.driverClass @Override 公共 のボイドsetEmbeddedValueResolver(StringValueResolverレゾルバ){ この .valueResolver = リゾルバ。 driverClass = valueResolver.resolveStringValue( "$ {db.driverClass}" )。 } }
3、テストカテゴリ----- IOCTest_Profile
パッケージcom.atguigu.test。 インポートするjavax.sql.DataSource; 輸入org.junit.Test; 輸入org.springframework.context.annotation.AnnotationConfigApplicationContext; 輸入com.atguigu.bean.Boss。 輸入com.atguigu.bean.Car。 輸入com.atguigu.bean.Color。 輸入com.atguigu.bean.Red; 輸入com.atguigu.bean.Yellow; 輸入com.atguigu.config.MainConfigOfProfile。 輸入com.atguigu.config.MainConifgOfAutowired; 輸入com.atguigu.dao.BookDao。 輸入com.atguigu.service.BookService。 パブリック クラス{IOCTest_Profile // 1、動的パラメータを使用してコマンドライン:仮想マシンパラメータの-Dspring.profiles.active =試験位置をロードする // 2、モード環境を起動するコードと、 @Test 公共 ボイドTEST01(){ AnnotationConfigApplicationContextのApplicationContext = 新しい新AnnotationConfigApplicationContext(); // 1、ApplicationContextの作成。 // 2を、活性化される環境である設定 applicationContext.getEnvironment()setActiveProfiles( "DEV。" ); // 3、メインコンフィギュレーション・レジスタ・クラス。 applicationContext.register(MainConfigOfProfile。クラス)。 // 4、リフレッシュコンテナ開始 )(applicationContext.refreshします。 } }
注意:
図1に示すように、クラスメソッドより大きい@Profile @Profile; -----現在の環境は、「DEV」、及び@Profileテストするコンフィギュレーションクラスがある場合、全体のクラスに対応するボイド。
2、どのように動作環境を変更するには?applicaitonContextによって設定する-----、直接-D spring.profiles.active = DEV B、