目次
ApplicationContext と BeanFactory の違い:
Spring プロジェクトを作成します。
Spring プロジェクトの作成は 4 つのステップに分かれています。
- 通常の Maven プロジェクトを作成します。
- Spring フレームワークのサポートを追加します。
- 構成リソースファイル。
- スタートアップクラスを追加します。
1. Maven プロジェクトを作成します。
前提条件: バージョン 2022 以降の関連プラグインは有料であるため、個人はできる限り idea2021 を使用するようにします。
2. Spring フレームワークのサポートを追加します。
この構成の依存関係を Spring プロジェクトの pom.xml ファイルに追加します。更新してローカル ウェアハウスにダウンロードします。
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.24</version>
</dependency>
</dependencies>
3. リソース ファイルを構成します。
リソース パッケージに xxx.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.spring.demo"></content:component-scan>
</beans>
4. スタートアップ クラスを追加します。
テストを開始するためのクラスを Java ファイルの下に作成します。
public class School {
public static void main(String[] args) {
}
}
Bean オブジェクトの使用:
1. Bean オブジェクトを保存します。
原則: Spring フレームワークには、Spring コンテキストを管理する spring-context と、オブジェクト モジュールを管理する spring-beans があります。
Beanオブジェクトとは何ですか? プロジェクト内で再利用されるオブジェクトは Bean オブジェクトとみなすことができ、Bean オブジェクトを格納するとは、プロジェクトに必要なオブジェクトを Spring コンテナに入れることを意味します。
1.1 Bean の作成:
次に、sayHi() メソッドが付属する通常の Student クラスを作成します。このクラスは今後頻繁に使用するため、Bean とみなすことができます。
public class Student {
public void sayHi() {
System.out.println("hi student");
}
}
1.2 Bean をコンテナに格納します。
ストレージ Bean は「宣言」の役割にも相当します。まず、リソース パッケージ内に作成した spring-config.xml 構成ファイルを開きます。
ストレージ Bean の形式:
<bean id="" class=""><bean>
Bean がマルチレベル パッケージ内にある場合は、クラス属性を設定するときにパスに注意してください。
次に Student クラスを Bean として追加します。パスに注意してください。
<!-- 将Bean对象(com.spring.demo.com.spring.demo.Student)
存到 Spring容器中,它的 id 为 student-->
<bean id="student" class="com.spring.demo.Student"></bean>
2. Bean オブジェクトを取得します。
Bean オブジェクトの取得は、次の 3 つの手順に分かれています。
- Spring コンテキスト オブジェクトを取得します。Bean オブジェクトは管理のために Spring に渡されるため、コンテナを操作する権限を取得する前に、まず Spring を取得する必要があります。
- Spring コンテキストを通じてコンテナ内の Bean オブジェクトを取得します。
- Bean オブジェクトを使用します。
2.1 Spring コンテキストを作成します。
ここでは、 ApplicationContextとBeanFactory という 2 つのインターフェースを理解する必要があります。
文法:
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
BeanFactory beanFactory =
new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
2.2 指定された Bean オブジェクトを取得します。
ここでは、ApplicationContext を使用してそれを示します。
public class School {
public static void main(String[] args) {
// 1.得到 Spring 上下文
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2.获取指定 Bean 对象
Student student = (Student) context.getBean("student");
// 3.使用 Bean 对象
student.sayHi();
}
}
ここまでは、Spring の作成、Bean の保存と取得について基本的に紹介しました。
ApplicationContext と BeanFactory の違い:
上記のコードでは、別の Teacher クラスを新しい Bean として追加し、それをコンテナーに追加します。
public class Teacher {
public Teacher() {
System.out.println("do teacher init");
}
public void sayHi() {
System.out.println("hi teacher");
}
}
<bean id="student" class="com.spring.demo.Student"></bean>
<bean id="teacher" class="com.spring.demo.Teacher"></bean>
この時点で、コンテナーには 2 つの Bean があります。1 つは Student で、もう 1 つは Teacher です。
ApplicationContext と BeanFactory を使用してそれぞれ操作します。どちらもコンテナ内の Student Bean の取得を試みるだけで、その効果の違いを確認できます。
アプリケーションコンテキスト:
元のコードは変更されません。
public class School {
public static void main(String[] args) {
// 1.得到 Spring 上下文
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2.获取指定 Bean 对象
Student student = (Student) context.getBean("student");
// 3.使用 Bean 对象
student.sayHi();
}
}
ビーンファクトリー:
新しいスタートアップ クラス School2 を作成し、Spring コンテキストを取得します。ApplicationContext は同じではないため、他方を変更する必要はありません。
public class School2 {
public static void main(String[] args) {
// 1.使用 BeanFactory 来获取 Spring 上下文
BeanFactory beanFactory =
new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
// 2. 从 Spring 容器中获取 bean 对象
Student student = (Student) beanFactory.getBean("student");
student.sayHi();
}
}
実行結果を比較すると、どちらも ID が「student」の Bean オブジェクトを同時に取得して使用していることがわかりますが、ApplicationContext はコンテキストの Teacher も取り出しており、BeanFactory は Student のみを取得しています。
要約:
同じ点:
- ApplicationContext と BeanFactory はどちらもコンテナ内の Bean オブジェクトを取得します。
違い:
- ApplicationContext はコンテナ内のすべての Bean オブジェクトを一度にロードして初期化し (hungry man モード)、BeanFactory は必要な Bean オブジェクトをロードします (lazy man モード)。
- ApplicationContext は実際には BeanFactory のサブクラスであり、サブクラスは親クラスのすべての機能を継承するだけでなく、独自の機能も持ち、ClassPathXmlApplicationContext は ApplicationContext のサブクラスに属します。
- BeanFactory も最初に設計されましたが、設計当初はマシンハードウェアのコストが高かったため、必要なオブジェクトだけをロードしていましたが、ApplicationContext は後から設計されました。可能な限り効率を向上させるために、人々は考えました。すべての Bean オブジェクトを一度にロードする。
一般的に使用される 3 つの getBean:
getBean() メソッドには多くのオーバーロードがあります。一般的に使用される次の 3 つを比較してください。
- IDに従って取得します。
- オブジェクトタイプの取得。
- ID、オブジェクトタイプの取得。
ID で取得:
<bean id="student" class="com.spring.demo.Student"></bean>
<bean id="teacher" class="com.spring.demo.Teacher"></bean>
// 2.获取指定 Bean 对象
Student student = (Student) context.getBean("student");
Teacher teacher = (Teacher) context.getBean("teacher");
このメソッドは明らかに失礼で望ましくないものであり、強制転送が行われ、さらに、id を通じて取得したオブジェクトが null の場合にも例外が発生します。
オブジェクトタイプの取得:
<bean id="student" class="com.spring.demo.Student"></bean>
<bean id="teacher" class="com.spring.demo.Teacher"></bean>
// 2.获取指定 Bean 对象
Student student = context.getBean(Student.class);
Teacher teacher = context.getBean(Teacher.class);
この方法は失礼ではありませんが、問題があります。
同じ種類の Bean がコンテナに 2 回登録されると、コンパイラは NoUniqueBeanDefinitionException を報告します。
ID + オブジェクトタイプの取得:
この方法はより安全です。
<bean id="student" class="com.spring.demo.Student"></bean>
<bean id="student2" class="com.spring.demo.Student"></bean>
<bean id="teacher" class="com.spring.demo.Teacher"></bean>
// 2.获取指定 Bean 对象
Student student = context.getBean("student2",Student.class);
Teacher teacher = context.getBean("teacher",Teacher.class);
考察:
同じタイプがコンテナー内に複数回登録される可能性があると述べましたが、それらは ID が異なるだけですが、それらは同じ空間を指しているのでしょうか?
コードの検証:
<bean id="student" class="com.spring.demo.Student"></bean>
<bean id="student2" class="com.spring.demo.Student"></bean>
<bean id="teacher" class="com.spring.demo.Teacher"></bean>
public class School {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Student student1 = context.getBean("student", Student.class);
Student student2 = context.getBean("student2", Student.class);
System.out.println(student1 == student2);
System.out.println(student1.equals(student2));
}
}
次に、それらが異なるオブジェクトへの参照であることを証明します。
要約:
Spring プロジェクトの作成と Bean の基本的な使用プロセス: