本文將介紹通過工廠方法和屬性進(jìn)行bean的注入
靜態(tài)工廠方法的注入
如果一個(gè)類沒有公開的構(gòu)造方法,取而代之的是一個(gè)靜態(tài)方法,那么如何注入呢最盅。
設(shè)一個(gè)類定義如下:
public class Student {
private int age;
private String name;
private String addr;
private Bag bag;
private List<String> schedules; // 課程表
private Set<String> clothes; // 衣服
private Map<String, Integer> grades; // 成績
private static class StudentHolder{
static Student instance = new Student();
}
private static Student student;
public static Student getInstance(){ // 靜態(tài)工廠方法
return StudentHolder.instance;
}
}
Student作為一個(gè)單例(例子不太合適)榜跌,對應(yīng)的Spring配置如何呢?只需聲明下類內(nèi)的靜態(tài)方法即可碧库。
<bean id="student" class="com.limingjian.blog.Student" factory-method="getInstance">
</bean>
屬性的注入
通常柜与,我們一般通過屬性對bean進(jìn)行注入,這種類包含私有屬性以及對應(yīng)的存取器嵌灰,如下為符合規(guī)則的Student
定義:
public class Student {
private int age;
private String name;
private String addr;
private Bag bag;
private List<String> schedules; // 課程表
private Set<String> clothes; // 衣服
private Map<String, Integer> grades; // 成績
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Bag getBag() {
return bag;
}
public void setBag(Bag bag) {
this.bag = bag;
}
public List<String> getSchedules() {
return schedules;
}
public void setSchedules(List<String> schedules) {
this.schedules = schedules;
}
public Set<String> getClothes() {
return clothes;
}
public void setClothes(Set<String> clothes) {
this.clothes = clothes;
}
public Map<String, Integer> getGrades() {
return grades;
}
public void setGrades(Map<String, Integer> grades) {
this.grades = grades;
}
}
可以看到弄匕,里面包含了int
,String
沽瞭,bean
迁匠,List
,Set
,Map
多種類型柒瓣,則對應(yīng)通過屬性注入bean的配置文件如下:
<bean id="bag" class="com.limingjian.blog.Bag"/>
<bean id="student" class="com.limingjian.blog.Student" >
<property name="age" value="15"/> <!--注入簡單值-->
<property name="addr" value="China"/> <!--注入字符串與數(shù)字并沒有不同儒搭,Spring會轉(zhuǎn)換-->
<property name="bag" ref="bag"/>
<property name="clothes"> <!--Set,用list可以裝配芙贫,注入后會去重搂鲫,只保留一個(gè)**校服**-->
<list>
<value>運(yùn)動服</value>
<value>正裝</value>
<value>校服</value>
<value>校服</value>
</list>
</property>
<property name="grades">
<map>
<entry key="語文" value="95"/>
<entry key="數(shù)學(xué)" value="99"/>
<entry key="英語" value="96"/>
</map>
</property>
<property name="name" value="xiaoming"/>
<property name="schedules">
<list>
<value>語文</value>
<value>數(shù)學(xué)</value>
<value>英語</value>
</list>
</property>
</bean>
特別的:
1.String類型的注入與int類型的注入并無區(qū)別,Spring會進(jìn)行類型轉(zhuǎn)換磺平。
- java.util.Set魂仍,用
<list>
可以裝配,注入后會去重拣挪,只保留一個(gè)校服擦酌,<list>
或<set>
可以注入數(shù)組或任何實(shí)現(xiàn)了java.util.Collection
接口的類,與具體的java類型實(shí)現(xiàn)并沒有必然的聯(lián)系菠劝,這兩個(gè)標(biāo)簽甚至可以互換赊舶,但不建議這樣做。