春の豆
Spring IoCコンテナーによって管理されるオブジェクトはBeanと呼ばれ、BeanはSpring構成ファイルの情報に基づいて作成されます。
Spring IoCコンテナは大きな工場と見なすことができ、Beanは工場の製品に相当します。この大きな工場で豆を生産および管理したい場合は、必要な豆とその組み立て方法をコンテナに指示する必要があります。
Spring構成ファイルは、XMLファイル形式とプロパティファイル形式の2つの形式をサポートしています。
プロパティ構成ファイルは、主にキーと値のキーと値のペアの形式で存在し、値を割り当てることしかできず、他の操作を実行することはできません。単純なプロパティ構成に適しています。
XML構成ファイルは、明確な構造を持つツリー構造を採用しており、プロパティファイルよりも柔軟性があります。ただし、XML構成は煩雑であり、大規模で複雑なプロジェクトに適しています。
通常、Springの構成ファイルはXML形式です。XML構成ファイルのルート要素は、この要素に複数の子要素が含まれていることです。各要素はBeanを定義し、BeanがSpringコンテナにどのように組み立てられるかを記述します。
シンプルな春の豆
エンティティクラスユーザー
これは単純なエンティティクラスです
public class User {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
User Beanをspring.xmlに登録し、spring管理に渡し、
springのxml構成ファイルでBeanを定義し、Userクラスの完全なクラスを記述して、Springファクトリがリフレクションメカニズムを使用してオブジェクトを作成できるようにします。次に、Userクラスがこれらのフィールドに対応するセッターメソッドを提供する場合は、属性名と値の値を構成します。これにより、Springはリフレクションメカニズムを使用してセッターメソッドを呼び出し、依存性注入を完了できます。
<!-- User -->
<bean class="com.liu.c.User" id="user">
<property name="age" value="18"/>
<property name="name" value="小刘"/>
</bean>
テスト
スタートアップファクトリを作成し、ユーザーオブジェクトを取得して、印刷します
public class TestUser {
public static void main(String[] args) {
String springProperties = "spring.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springProperties);
User user = context.getBean("user", User.class);
System.out.println(user);
}
}
結果
スプリングファクトリはデフォルトでシングルトンモードになっているため、ファクトリの作成時にシングルトンはオブジェクトをインスタンス化し、依存性注入にJavaリフレクションメカニズムを使用します。したがって、ユーザーのtoStringメソッドを出力するときにデフォルトでリライトが呼び出されることがわかります。 、プロパティを正常に割り当てます
User{age=18, name='小刘'}
もちろん、Spring Factoryでオブジェクトの複数のインスタンスを作成する場合は、それらを対応するBean構成に追加するだけでscope属性
、構成scope="prototype"
は複数のインスタンスを実装できます。デフォルトsingleton
はインスタンスを意味します。
<!-- User -->
<bean class="com.liu.c.User" id="user" scope="prototype">
<property name="age" value="18"/>
<property name="name" value="小刘"/>
</bean>
public class TestUser {
public static void main(String[] args) {
String springProperties = "spring.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springProperties);
User user = context.getBean("user", User.class);
User user1 = context.getBean("user", User.class);
System.out.println(user.hashCode());
System.out.println(user1.hashCode());
}
}
あなたは正しいですか、ペイジ?
33317023
13818597
SpringBeanプロパティインジェクションの2つの方法
Springは主に2つの方法でプロパティを挿入します
- セッターインジェクション(重要)
- インジェクションを構築する(知っていることを理解する)
セッターインジェクション
SpringがBeanをインスタンス化するプロセスでは、IoCコンテナは最初にデフォルトのコンストラクタ(パラメータコンストラクタなし)を呼び出してBean(Javaオブジェクト)をインスタンス化し、次にJavaリフレクションメカニズムを介してBeanのsetXxx()メソッドを呼び出して設定します。属性値。Beanに挿入します。
ステップ:
Beanにデフォルトの引数なしコンストラクターを指定します。引数なし構文がない場合、Springは引数なし構文を使用してオブジェクトを作成できず、反射によってオブジェクトのsetterメソッドを取得して割り当てることはできません。 (他にはありませんパラメーター付きのコンストラクターの場合は省略でき、デフォルトではパラメーター付きまたはパラメーターなしでコンストラクターを作成します)、注入する必要のあるすべてのプロパティのプロパティを提供しsetXxx() 方法
ます。SpringのXML構成ファイルで、<beans>
およびBeanを定義し、要素内で使用する<bean>
そのサブ要素要素は、さまざまなプロパティに値を割り当てます。<bean>
<property>
特定のコードの上のユーザーはセッターを介して割り当てられるため、ここで冗長に記述することはしません。他のタイプのインジェクションについては、次の記事で記述します。それを必要とする友人は私に注意を払うことができます。一緒に通信します。コンストラクターメソッドを使用した注入について話しましょう
コンストラクター注入
Beanのパラメーター化されたコンストラクターを介して、Beanのプロパティインジェクションを実装できます。
手順
パラメーター化されたコンストラクターをBeanに追加します。コンストラクターの各パラメーターは、挿入する必要のあるプロパティを表します
。SpringのXML構成ファイル<beans>
で<bean>
、Beanスルーとそのサブ要素を定義します。要素の要素を属性の属性に使用します。コンストラクターが割り当てられ、Beanのコンストラクターにあるのと同じ数のパラメーター。<bean>
<constructor-arg>
<constructor-arg>
レトロフィットユーザー
ユーザー
がパラメーター化された構造を提供すると、デフォルトのパラメーターなしの構造が上書きされるため、パラメーターなしの構造を再度定義できます。
public class User {
private Integer age;
private String name;
public User() {
}
public User(Integer age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
spring.xmlは構造を使用して値を割り当てます
<!-- User -->
<bean class="com.liu.c.User" id="user" scope="prototype">
<constructor-arg name="age" value="15"/>
<constructor-arg name="name" value="小张"/>
<!--这里也可以使用index,就是说构造方法的参数,注意是从0开始的哦,那这里的0就表示user构造函数的
第一个参数age,以此类推,但不建议这样使用,因为可读性变差了,养成好习惯,关注代码的可维护-->
<!-- <constructor-arg index="0" value="15"/>-->
<!-- <constructor-arg index="1" value="小张"/>-->
</bean>
結果は
正常に割り当てられますが、なぜ推奨されないのですか?たとえば、このクラスには多くの属性があり、多くの構築メソッドを書き直す必要があります。これは非常に肥大化して面倒です。
User{age=15, name='小张'}
さて、今日はこれですべてです。明日は、配列やコレクションなど、他の種類のインジェクションのインジェクション方法を共有します。これも非常に簡単です。インジェクションについて学習した後、Beanの範囲とライフサイクルについて学習しましょう。OK、さようならヾ(•ω• `)o