アノテーション開発
1)アノテーション駆動型の意味
1.1)アノテーションドリブンとは
アノテーションが開始されると、アノテーションの形式を使用してxml構成が置き換えられます。これにより、プロジェクトから複雑なSpring構成ファイルが完全に排除され、書き込みが簡素化されます。
1.2)アノテーション駆動型のデメリット
- 注釈駆動の目的を達成するために、元の単純な書き込みはより複雑になる可能性があります
- サードパーティが開発したリソースをXMLで構成すると非常に便利ですが、アノテーション駆動型を使用すると、サードパーティが開発したリソースで編集できないため、開発の作業負荷が増加します。
2)一般的な注意事項
2.1)注釈機能を開始する
-
アノテーションスキャンを開始し、クラスで設定されたアノテーションアイテムをロードします
<context:component-scan base-package="packageName"/>
-
説明:
- パッケージがスキャンされると、構成されたパッケージとそのサブパッケージ内のすべてのファイルがスキャンされます
- スキャンプロセスは、フォルダの再帰的な反復の形で実行されます
- スキャンプロセスは、正当なJavaファイルのみを読み取ります
- スキャン時にSpringが認識できる注釈のみを読んでください
- スキャン後、認識可能な有効な注釈がSpringに対応するリソースに変換され、IoCコンテナに追加されます。
-
注意:
- 注釈形式やXML構成形式に関係なく、リソースは最終的にIoCコンテナーにロードされます。唯一の違いは、データの読み取り方法です。
- 読み込み効率の点では、アノテーションはXML構成ファイルよりも優れています
2.2)Beanの定義
-
名前:@Component @Controller @Service @Repository
-
タイプ:クラスアノテーション
-
場所:クラス定義の上
-
役割:このクラスを春が管理するBeanとして設定します
-
例:
@Component public class ClassName{ }
-
説明:
- @ Controller、@ Service、@ Repositoryは、@ Componentの派生アノテーションであり、@ Componentと同じ機能を備えています。
-
関連する属性
- 値(デフォルト):BeanのアクセスIDを定義します
2.3)Beanの範囲
-
名前:@Scope
-
タイプ:クラスアノテーション
-
場所:クラス定義の上
-
ロール:クラスをBeanの対応するスコープ属性として設定します
-
例:
@Scope public class ClassName{ }
-
関連する属性
- 値(デフォルト):Beanのスコープを定義し、デフォルトはシングルトンです
2.4)Beanのライフサイクル
-
名前:@ PostConstruct、@ PreDestroy
-
タイプ:メソッドアノテーション
-
場所:メソッド定義の上
-
役割:Beanに対応するライフサイクルメソッドとしてクラスを設定します
-
例:
@PostConstruct public void init() { System.out.println("init..."); }
2.5)サードパーティのリソースをロードする
-
名前:@Bean
-
タイプ:メソッドアノテーション
-
場所:メソッド定義の上
-
役割:メソッドの戻り値をSpringが管理するBeanとして設定します
-
例:
@Bean("dataSource") public DruidDataSource createDataSource() { return ……; }
-
説明:
- サードパーティのBeanはソースコードで変更できないため、@ Beanを使用してサードパーティのBeanを導入する問題を解決してください
- このアノテーションは、XML構成の静的ファクトリとインスタンスファクトリを置き換えてBeanを作成するために使用され、メソッドが静的か非静的かを区別しません。
- @Beanが配置されているクラスは、Springまでにスキャンしてロードする必要があります。そうしないと、アノテーションが有効になりません。
-
関連する属性
- 値(デフォルト):BeanのアクセスIDを定義します
2.6)Beanの非参照型属性インジェクション
-
名前:@Value
-
タイプ:属性アノテーション、メソッドアノテーション
-
位置:属性定義の上、メソッド定義の上
-
役割:対応する属性の値を設定するか、パラメーターをメソッドに渡します
-
例:
@Value("${jdbc.username}") private String username;
-
説明:
- 値の値は非参照型のデータのみをサポートし、値を割り当てるときにメソッドのすべてのパラメーターが割り当てられます
- 値の値は、プロパティファイルの属性値の読み取り、およびクラス属性を介したプロパティのデータのクラスへの受け渡しをサポートします。
- 値値はSpELをサポートします
- @valueアノテーションが属性の上に追加されている場合、setメソッドは省略できます(setメソッドの目的は属性に値を割り当てることです)
-
関連する属性
- 値(デフォルト):対応する属性値またはパラメーター値を定義します
2.7)Bean参照型属性インジェクション
-
名前:@ Autowired、@ Qualifier
-
タイプ:属性アノテーション、メソッドアノテーション
-
位置:属性定義の上、メソッド定義の上
-
ロール:対応する属性のオブジェクトを設定するか、参照型をメソッドに渡します
-
例:
@Autowired(required = false) @Qualifier("userDao") private UserDao userDao;
-
説明:
- @Autowiredは、デフォルトでタイプごとにアセンブルされます。@ Qualifierを指定した後、自動的にアセンブルされるBeanのIDを指定できます。
-
関連する属性
- 必須:属性をnullにできるかどうかを定義します
2.8)Bean参照型属性インジェクション
-
名前:@Primary
-
タイプ:クラスアノテーション
-
場所:クラス定義の上
-
役割:タイプ別にアセンブルするときに最初にアセンブルするクラスに対応するBeanを設定します
-
例:
@Primary public class ClassName{ }
-
説明:
- @Autowiredはデフォルトでタイプごとにアセンブルされます。同じタイプのBeanが表示された場合は、@ Primaryを使用して、タイプごとの自動アセンブリの優先度を上げます。複数の@Primaryを使用すると、優先度設定が無効になります。
2.9)Bean参照型属性インジェクション
- 名前:@ Inject、@ Named、@ Resource
- 説明:
- @Injectと@NamedはJSR330仕様のアノテーションであり、それらの関数は@Autowiredと@Qualifierとまったく同じであり、さまざまなアーキテクチャシナリオに適しています。
- @Resourceは、JSR250仕様のアノテーションであり、書き込み形式を簡素化できます。
- @Resource関連の属性
- 名前:注入されたBeanのIDを設定します
- type:注入されたBeanのタイプを設定します。受信したパラメーターはクラスタイプです。
2.10)プロパティファイルをロードします
-
名前:@PropertySource
-
タイプ:クラスアノテーション
-
場所:クラス定義の上
-
役割:プロパティファイルにプロパティ値をロードします
-
例:
@PropertySource(value = "classpath:filename.properties") public class ClassName { @Value("${propertiesAttributeName}") private String attributeName; }
-
説明:
- *ワイルドカード形式はサポートされていません。ロードされると、対応する属性値をすべてのスプリング制御Beanで使用できます。
-
関連する属性
- 値(デフォルト):ロードされたプロパティファイルの名前を設定します
- ignoreResourceNotFound:リソースが見つからない場合、無視するかどうかにかかわらず、デフォルトはfalseです。
2.11)純粋な注釈形式
-
名前:@ Configuration、@ ComponentScan
-
タイプ:クラスアノテーション
-
場所:クラス定義の上
-
役割:現在のクラスをスプリングコア構成のロードクラスとして設定します
-
例:
@Configuration @ComponentScan("scanPackageName") public class SpringConfigClassName{ }
-
説明:
- コアマッチングクラスは、スプリングコア構成ファイルを置き換えるために使用されます。このクラスは、変数や属性を設定せずに空に設定できます。
- Beanスキャン作業はアノテーション@ComponentScanに置き換えられます
AnnotationConfigApplicationContext
-
純粋な注釈形式のコンテキストオブジェクトをロードするには、AnnotationConfigApplicationContextを使用する必要があります
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
2.12)サードパーティのBeanの構成と管理
-
名前:@Import
-
タイプ:クラスアノテーション
-
場所:クラス定義の上
-
役割:Springによって制御されるリソースとしてサードパーティのBeanをインポートします
-
例:
@Configuration @Import(OtherClassName.class) public class ClassName { }
-
説明:
- @Importアノテーションは同じクラスにあり、一度だけ追加できます。複数インポートする必要がある場合は、配列の形式を使用して設定してください
- インポートされたクラスでは、引き続き@Importを使用して他のリソースをインポートできます(理解)
- @Beanが配置されているクラスは、Beanとして宣言されていなくても、importの形式でSpringコンテナにインポートできます。
3)Beanのロード制御
3.1)依存関係の読み込み
(1)@DependsOn
-
名前:@DependsOn
-
タイプ:クラスアノテーション、メソッドアノテーション
-
場所:Bean定義の場所(クラスまたはメソッド上)
-
役割:指定されたBeanがロードされた後にロードできるように、Beanのロード順序を制御します
-
例:
@DependsOn("beanId") public class ClassName { }
-
説明:
- @DependsOnで指定されたBeanが、@ Beanで構成されたBeanの前にロードされるように、メソッドを構成します。
- @DependsOnで指定されたBeanが、現在のクラスのすべての@Bean構成済みBeanの前にロードされるように、クラスで構成されます。
- @DependsOnで指定されたBeanが、@ Componentなどで構成されたBeanの前にロードされるように、クラスで構成します。
-
関連する属性
- 値(デフォルト):現在のBeanが依存するBeanのIDを設定します
(2)@注文
-
名前:@Order
-
タイプ:構成アノテーション
-
場所:(クラス上の)構成クラス定義の場所
-
役割:構成クラスのロード順序を制御します
-
例:
@Order(1) public class SpringConfigClassName { }
(3)@Lazy
-
名前:@Lazy
-
タイプ:クラスアノテーション、メソッドアノテーション
-
場所:Bean定義の場所(クラスまたはメソッド上)
-
役割:Beanのロードタイミングを制御して、ロードを遅らせます
-
例:
@Lazy public class ClassName { }
3.2)アプリケーションシナリオのロードに依存する
@DependsOn
- WeChatサブスクリプション番号、メッセージをパブリッシュおよびサブスクライブするBeanのロードシーケンス制御
- ダブル11イベント中、決済戦略Aは0時前、決済戦略Bは0時以降、戦略Bの運用データはプロモーションデータです。ストラテジーBのロードシーケンスとプロモーションデータのロードシーケンス
@レイジー
- プログラム災害発生後の対応する緊急計画は、コンテナが起動されたときのロード時間です。
@注文
- 複数のタイプの構成が表示されたら、最初にシステムレベルの構成をロードしてから、ビジネスレベルの構成をロードして、きめ細かいロード制御を回避します。
4)サードパーティのテクノロジーを統合する
4.1)包括的なケースリビジョン(アノテーション統合MyBatis)
4.2)アノテーション統合MyBatis分析
- ビジネスクラスはアノテーションフォームを使用してBeanを宣言し、属性はアノテーションインジェクションを使用します
- 独立した構成管理クラスを確立し、外部リソースを分類および管理し、機能に従って分類し、Beanを取得するための対応するメソッドを提供します
- アノテーションフォームを使用してBeanスキャンを開始し、すべてのアノテーション構成リソースをロードします(bean)
- AnnotationConfigApplicationContextオブジェクトを使用してすべてのスタートアップコンフィギュレーションクラスをロードし、importメソッドを使用して内部的に関連付けます
4.3)MyBatisを統合する手順に注釈を付ける
1.mybatis外部構成ファイルの形式をコメント形式に変更します
2.ビジネスクラスは@Componentを使用してBeanを宣言し、@ Autowiredを使用してオブジェクトを注入します
3.構成ファイルJDBCConfigクラスとMyBatisConfigクラスを確立し、それらをコア構成クラスSpringConfigにインポートします。
4.注釈スキャンをオンにします
5. AnnotationConfigApplicationContextオブジェクトを使用して、構成アイテムをロードします
4.4)包括的なケース改訂(アノテーション統合JUnit)
1. Springは、Springの特別なJunitクラスローダーを使用して、Junitを実行する権利を引き継ぎます。
2.Junitテストケースに対応するスプリングコンテナを設定します。
- Spring5.0以降、JUnitのバージョンは4.12以降である必要があります
- Junitは単体テストにのみ使用されます。JUnitのテストクラスをSpringBeanとして構成することはできません。構成しない場合、構成はプロジェクトにパッケージ化されます。
SpringをインポートしてJUnit座標を統合する
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
Spring統合JUnitテストケースアノテーション形式
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {
}