目次
5 種類のアノテーションが Bean に一致する場合のデフォルトの ID 命名規則
3. オブジェクトのアセンブリ (Bean オブジェクトの取得が容易になります):
4.1 @Resource と @AutoWired の違い:
4.1.1 同じタイプの @Bean エラー レポートを解決する
注釈を使用する理由
これら 5 つのクラス アノテーションを使用すると、Bean の保存と取得が簡素化されます。実際には、主要な 5 種類のアノテーションに限定されるものではなく、他のアノテーションや注入メソッドも同じ原理を使用して操作を簡素化し、Bean を Spring コンテナーに直接格納できます。
前回の記事では、新しいBeanを格納するたびに、設定ファイル spring-config.xml に <bean><bean> タグを新たに追加する必要があり、明らかに面倒なので、今回の記事では主に紹介します。 1 回限りの方法:スキャン ファイルのパスを構成します。
スキャン ファイルを設定します。
スキャン ファイルの設定は必須です。
1. スキャンパスを構成します。
まず Spring プロジェクトをビルドし、次に以下のことを理解します。
① リソース パッケージ内に spring-config.xml という名前の構成ファイルを作成します。
② Spring の設定内容を設定ファイルに追加します。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.java.demo"></content:component-scan>
</beans>
<content:component-scan><content:component-scan> タグ内で最も重要なのは、base-package のパスであることに注意してください。このパスの意味は、次の図に示されています。
別の観点から見ると、最終パスの下にないクラスまたはオブジェクトの場合、アノテーションが付いている場合でも、Spring コンテナに Bean として格納することはできません。
---------------------------------------- 事前作業完了--------------------------------------------------
1. 注釈の 5 つのカテゴリ:
注釈の 5 つのカテゴリとは何ですか?
@Controller (コントローラーストレージ): ユーザーが要求したデータの正確性を検証できます。
@Service (サービス ストレージ): オーケストレーションとスケジューリングのための特定のメソッドの実行を提供します。
@Repository (ウェアハウスストレージ): データベースと対話します。
@Component (コンポーネント ストレージ): コンポーネント、ツール クラスなどを管理します。
@Configuration (設定ストレージ): 設定項目、設定などを管理します。
1.1 @コントローラー:
JavaEE の標準階層化に適応させるには、コードをデモする前に応答レベルのパッケージを作成し、そのパッケージ内にクラスを作成します (これは後でも同様で、標準階層化については以下で説明します)。
1.1.1 ストレージ Bean:
このように、 PersonController クラスを作成し、クラス アノテーション @Controller を追加して、構成パスを通じて Bean をスキャンし、それを Spring コンテナーに配置します。
@Controller
public class PersonController {
public void myHobby() {
System.out.println("psController -> 我爱敲代码");
}
}
1.1.2 Bean の読み取り:
初期 Java パッケージの下にスタートアップ クラスを作成します。App クラス、Spring オブジェクト、Bean オブジェクトを取得します。
操作の結果、元の設定ファイルのように <bean id="" class=""></bean> などの手動インジェクションの行を追加しておらず、Bean オブジェクトを正常に読み込むことができていることがわかります。 - personController、これは @Controller アノテーションの自動挿入の利点です。
// 启动类
public class App {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
PersonController personController =
context.getBean("personController",PersonController.class);
personController.myHobby();
}
}
-------------------------------------------------- -------------------------------------------------- --
1.2 @サービス:
1.2.1 ストレージ Bean:
@Service
public class PersonService {
public void myHobby() {
System.out.println("psService -> 我爱敲代码");
}
}
1.2.2 Bean の読み取り:
public class App {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
PersonService personService = context.getBean("personService",PersonService.class);
personService.myHobby();
}
}
-------------------------------------------------- -------------------------------------------------- --
1.3 @リポジトリ:
1.3.1 ストレージ Bean:
repository というパッケージを作成し、そのパッケージの下に PersonRepository クラスを作成します。
@Repository
public class PersonRepository {
public void myHobby() {
System.out.println("psRepository -> 我爱敲代码");
}
}
1.3.2 Bean の読み取り:
public class App {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
PersonRepository personRepository =
context.getBean("personRepository",PersonRepository.class);
personRepository.myHobby();
}
}
1.4 @コンポーネント:
1.4.1 ストレージ Bean:
Component という名前のパッケージを作成し、そのパッケージの下にクラス PersonComponent を作成します。
@Component
public class PersonComponent {
public void myHobby() {
System.out.println("psComponent -> 我爱敲代码");
}
}
1.4.2 Bean の読み取り:
public class App {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
PersonComponent personComponent =
(PersonComponent) context.getBean("personComponent", PersonComponent.class);
personComponent.myHobby();
}
}
1.5 @構成:
1.5.1 ストレージ Bean:
configuration というパッケージを作成し、そのパッケージの下に PersonConfiguration クラスを作成します。
@Configuration
public class PersonConfiguration {
public void myHobby() {
System.out.println("psConfiguration -> 我爱敲代码");
}
}
1.5.2 Bean の読み取り:
public class App {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
PersonConfiguration personConfiguration =
context.getBean("personConfiguration",PersonConfiguration.class);
personConfiguration.myHobby();
}
}
Bean に一致する 5 種類のアノテーションのデフォルトの ID 命名規則は次のとおりです。
上記はSpringコンテナにBeanをアノテーションで直接格納しているのですが、手動でIDを設定していないので、読み込む際にIDをどう書くか?
id にはデフォルトのルールがあります。Shift キーをダブルクリックして AnnotationBeanNameGenerator メソッドを見つけ、Alt + 7 を押して buildDefaultBeanName メソッドを直接表示します。
次に、内部の decapitalize() メソッドを入力します。
結論はソース コードから導き出すことができます。@Controller アノテーションの下で、デフォルトで次のように規定されています。
- クラスの最初の文字は大文字、2 番目の文字は小文字です。ID は最初の文字を小文字にしたクラス名になります。
- クラスの最初の文字は大文字で、2 番目の文字も大文字です。id は元のクラス名です。
図:
なぜこれほど注釈が多いのでしょうか?
1. 注釈の 5 つのカテゴリ間の関係:
@Controller、@Service、@Repository、@Configuration の 5 つのアノテーションのソース コードからも確認できます。これら 4 つのアノテーションの実装はすべて @Component アノテーションに依存しているため、最初の 4 つのアノテーションが@Componentアノテーション クラスの「子」。これはその拡張です。
2. なぜこれほど多くの注釈を使用するのでしょうか?
JavaEE標準の階層化についても言及する必要がありますが、Springフレームワークはエンタープライズ開発を目的としているため、これらのアノテーションも開発ルールやビジネスロジックにある程度適合するように設計されています。
JavaEE標準階層化は、効率的な開発のために大手企業が設計した論理的な階層構造モデルで、主にプレゼンテーション層→制御層→サービス層→データ永続化層に分かれています。
コードを書くことは、プログラムを設計するためだけでなく、プログラマにとっても目に見えるものです。5 つのアノテーションの機能は同じですが、それぞれ設計層を表します。開発プロセスでは、どのクラスがどこで使用されるか、最初のレベルで、対応する注釈の助けを借りて、識別機能を直感的に実行でき、プロセスのスケジューリングに便利です。
2. メソッド アノテーション @Bean:
上記で紹介した 5 種類のアノテーションに加えて、メソッドに特別に使用される「メソッド アノテーション」もあります。
@Bean アノテーションの役割: Bean オブジェクトを生成し、このオブジェクトを管理のために Spring IoC コンテナに渡すようにメソッドに指示します。これにより、このメソッドは作成されたオブジェクトを返します。
2.1 ストレージ Bean:
まず、デモ パッケージの下に Bean パッケージを作成し、そのパッケージの下にクラス PersonBean を作成します。
2.2 Bean オブジェクトを取得します。
@Bean アノテーションを介して格納されたオブジェクトは、以前のように取得できません。これは、このアノテーションの ID 命名規則が 5 つの主要なアノテーションの ID 命名規則と異なるためです。
図に示すように:
知らせ!上記のエラーには 2 つの理由が考えられます。
- @Bean 命名規則では、デフォルトでは、格納された Bean オブジェクト名とメソッド名は一貫しています。
- @Bean アノテーションは、Spring のパフォーマンスを確保するために必要な 5 種類のアノテーションと組み合わせて使用する必要があります。
上記のコードを変更します。
2.3 @Bean の名前変更戦略:
デフォルトでは、@Bean アノテーションに格納されるオブジェクトの ID はメソッド名と同じですが、プログラマのニーズに応じて名前を変更することもできます。
書き込み:
- @Bean の後に括弧 () を追加し、括弧には { } を使用します。内部には複数の ID 名を設定できます。
- 次の図に示すように、{ } 内の属性は名前または値になります。
変更後:
省略して次のように記述することもできます。
- この方法で名前を変更した後、生成された名前または値は、Bean の複数の名前を格納する配列として使用されます。
- 名前変更を使用すると、デフォルトのメソッド名の取得ができなくなります。
3. オブジェクトのアセンブリ (Bean オブジェクトの取得が容易になります):
コンテナから Bean オブジェクトを読み取ることは「オブジェクト アセンブリ」とも呼ばれます。これは、オブジェクトを取り出して特定のクラスに入れることであり、「オブジェクト インジェクション」と呼ばれることもあります。
3 つの新しい注入方法を以下に説明します。
- 属性の注入。
- セッター注入。
- コンストラクターの注入。
3.1 プロパティの注入:
属性の注入には @Autowired の注釈を付ける必要があります。
例: データ テーブル personDao があり、上で作成した PersonBean のインスタンスが格納されています。そのため、アイデアは次のとおりです。 PersonDao エンティティ クラスを作成し、プロパティ インジェクションによって PersonBean クラスの Bean オブジェクトを PersonDao クラスに直接注入します。このクラスでは ;
3.1.1 利点と欠点の分析:
アドバンテージ:
- 書きやすく、使いやすい。
欠点:
- Final によって変更されたオブジェクトは注入できません。
- IoC コンテナにのみ適用されます。
- NPE (Null Pointer Exception) は、使用された場合にのみ発生します。
- 単一の設計原則に違反するのは簡単です。
3.2 セッターの注入:
Setter インジェクションでも @Autowired アノテーションが使用されますが、setter() メソッドが使用されます。
例: 引き続き PersonBean オブジェクトを PersonDao クラスに挿入し、コードを少し変更して、今度は Setter() メソッドに注釈を追加します。
3.2.1 利点と欠点の分析:
アドバンテージ:
- Setter() メソッドは一度に 1 つのオブジェクトだけを渡すため、単一の設計原則に従っており、初期段階で Spring によって公式に推奨されている注入メソッドです。
- 使用前にクラスに挿入されたオブジェクトが空でないことを確認してください。
欠点:
- Final によって変更されたオブジェクトは注入できません。
- 挿入されたオブジェクトは、クラス内の他のメソッドによって変更される可能性があります。
3.3 コンストラクターの注入:
構築メソッドの注入には @Autowired アノテーションを使用する必要がありますが、ここでは構築メソッドに @Autowired アノテーションが使用されています。
予防:
- コンストラクターが 1 つだけの場合は、 @Autowired アノテーションを省略できます。
- 複数のコンストラクターがある場合は、 @Autowired アノテーションを使用して、どのコンストラクターを使用するかを指定する必要があります。
例: 引き続き PersonBean オブジェクトを PersonDao クラスに挿入し、コードを少し変更して、今度はコンストラクターにアノテーションを追加します。
3.3.1 利点と欠点の分析:
アドバンテージ:
- Java の最終変更オブジェクトは直接割り当てられるか、コンストラクターで割り当てられるため、最終変更オブジェクトを挿入できます。そのため、それらは使用可能です。
- 注入されたオブジェクトは変更されません。
- 挿入されたオブジェクトが正しく初期化されており、空ではないことを確認してください。
- 優れた汎用性。
- Spring の公式の注入方法が現在最も推奨されています。
4. @Resource アノテーション:
このアノテーションはオブジェクトの挿入にも使用されます。最初にデモをご覧ください。
4.1 @Resource と @AutoWired の違い:
- さまざまなソース: @Autowired は Spring から来ており、@Resource は JDK 自体から来ています。
- 機能の違い: @Resource は @Autowired よりも多くのパラメーター設定をサポートします。
- スコープの違い: @Resource はコンストラクターの注入には使用できませんが、@Autowired は上記の 3 つの注入方法に使用できます。
- 検索方法の違い:同じ種類の Bean を複数コピーして格納する場合、@Resource は最初に名前でチェックし、次にタイプでチェックするのに対し、@Autowired は最初にタイプでチェックし、次に名前に従ってチェックするという 2 つの検索方法が異なります。 ; そのため、同じタイプの複数の Bean を検索するには @Resource の方が適しています。
4.1.1 同じタイプの @Bean エラー報告の問題を解決します。
同じ種類のBeanのコピーが複数格納されている場合、Springの@Autowiredアノテーションのみを使用してクラスに注入すると、一意に一致するターゲットが見つからないというエラーが発生する場合があります。
例: @Bean アノテーションを使用して、色の異なる 2 匹の子犬が DogsBean クラスに保存されています。ここで、指定された子犬を DogController クラスに挿入したいと考えています。
実行時にエラーが発生します: 一意の値と一致できません。
解決:
方法 1: @Resource(name= "") を使用する: @Autowired アノテーションのパラメーターはブール型の値のみであるため、名前を指定することはできませんが、@Resource は指定できます。
方法 2: @Qualifier(value="") アノテーションを使用する: @Autowired アノテーションだけを使用したい人もいますが、それは問題ありません。それから @Qualifier アノテーションと組み合わせて使用します。