Spring——注入分類
Bean 例項在呼叫無參構造器建立了空值物件後,就要對 Bean 物件的屬性進行初始化。
初始化是由容器自動完成的,稱為注入。根據注入方式的不同,常用的有兩類:設值注入、構造注入。還有另外一種,實現特定介面注入。由於這種方式採用侵入式程式設計,汙染了程式碼,所以幾乎不用。
(1)設值注入
設值注入是指,通過 setter 方法傳入被呼叫者的例項。這種注入方式簡單、直觀,因而在 Spring 的依賴注入中大量使用。
先定義school的實體物件:
package com.bjpowernode.di01;
public class School {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "School [name=" + name + "]";
}
}
定義學生類物件實體:
package com.bjpowernode.di01;
public class Student {
private String name;
private int age;
private School school; // 物件屬性,域屬性
public void setName(String name) {
System.out.println("執行setName()");
this.name = name;
}
public void setAge(int age) {
System.out.println("執行setAge()");
this.age = age;
}
public void setSchool(School school) {
this .school = school;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", school=" + school
+ "]";
}
}
這裡需要注意兩個地方,一個是把school封裝以後放在Student裡面當作成員物件。第二個是在進行編輯實體物件的時候最好把所有的set/get方法新增上去(對於新手來說)。
配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 註冊School -->
<bean id="mySchool" class="com.bjpowernode.di01.School">
<property name="name" value="清華大學"/>
</bean>
<!-- 註冊Student ---下面的name要和Student裡面的name進行一一對應--->
<bean id="myStudent" class="com.bjpowernode.di01.Student">
<property name="name" value="張三"/>
<property name="age" value="23"/>
<property name="school" ref="mySchool"/>
</bean>
</beans>
當指定 bean 的某屬性值為另一 bean 的例項時,通過 ref 指定它們間的引用關係。ref 的值必須為某bean 的 id 值。對於其它 Bean 物件的引用,除了標籤的 ref 屬性外,還可以使用標籤。例如:
< ref bean=”mySchool”/>
測試類:
package com.bjpowernode.di01;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test01() {
// 建立容器物件,載入Spring配置檔案
String resource = "com/bjpowernode/di01/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
Student student = (Student) ac.getBean("myStudent");
System.out.println(student);
}
}
(2)構造注入
構造注入是指,在構造呼叫者例項的同時,完成被呼叫者的例項化。即,使用構造器設定依賴關係。
構造注入標籤中用於指定引數的屬性有:
name:指定引數名稱。
index:指明該引數對應著構造器的第幾個引數,從 0 開始。不過,該屬性不要也行, 但要注意,若引數型別相同,或之間有包含關係,則需要保證賦值順序要與構造器中的引數順序一致。另外,type 屬性可用於指定其型別。基本型別直接寫型別關鍵字即可,非基本型別需要寫全限定性類名。
構造注入和設值注入在配置檔案裡面會有一些不同。
package com.bjpowernode.di02;
public class Student {
private String name;
private int age;
private School school; // 物件屬性,域屬性
public Student(String name, int age, School school) {
super();
this.name = name;
this.age = age;
this.school = school;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", school=" + school
+ "]";
}
}
配置檔案:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 註冊School -->
<bean id="mySchool" class="com.bjpowernode.di02.School">
<property name="name" value="清華大學"/>
</bean>
<!-- 註冊Student -->
<bean id="myStudent" class="com.bjpowernode.di02.Student">
<constructor-arg name="name" value="李四"/>
<constructor-arg name="age" value="24"/>
<constructor-arg name="school" ref="mySchool"/>
<!--
<constructor-arg index="0" value="李四"/>
<constructor-arg index="1" value="24"/>
<constructor-arg index="2" ref="mySchool"/>
-->
<!--
<constructor-arg value="李四"/>
<constructor-arg value="24"/>
<constructor-arg ref="mySchool"/>
-->
</bean>
</beans>
注意,上面的index可要可不要。
補充:(在設值注入的基礎上進行的修改:)
對於設值注入與構造注入,在配置檔案中,除了使用或標籤外,還可使用名稱空間注入的方式,讓注入的值以標籤屬性的方式出現。根據注入實現方式的不同,分為p 名稱空間注入與c 名稱空間注入。
p 名稱空間注入:採用設值注入方式,故需要有相應的 setter
c 名稱空間注入:採用構造注入方式,故需要有相應的構造器
P名稱空間注入和C名稱空間注入是有點區別的:配置檔案上面的區別
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 註冊School -->
<bean id="mySchool" class="com.bjpowernode.di03.School" p:name="北京大學"/>
<!-- 註冊Student -->
<bean id="myStudent" class="com.bjpowernode.di03.Student"
p:name="王五" p:age="25" p:school-ref="mySchool"/>
</beans>
C名稱空間注入:
<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 註冊School -->
<bean id="mySchool" class="com.bjpowernode.di04.School">
<property name="name" value="清華大學"/>
</bean>
<!-- 註冊Student -->
<bean id="myStudent" class="com.bjpowernode.di04.Student"
c:name="趙六" c:age="26" c:school-ref="mySchool"/>
</beans>