這篇文章通過幾個簡單實例介紹了spring中控制反轉的幾種方式(新手注意:控制反轉就是依賴注入哈,如有不懂的還是得先查查資料再看忘下看哦 ,儘管這也是篇基礎文章 呵呵 ):
方式一(屬性注入)
首先你要建立一個javaBean類SimpleBean :
package com.wjr.spring47;
public class SimpleBean {
private String name;
private String password;
public SimpleBean(String name,String password)
{
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第二步就是在spring配置文件applicationContext.xml中進行如下設置,
(通過myeclipse向項目中添加spring組件時,spring配置文件會自動產生)
<beans>
<bean id="simple" class="com.wjr.spring47.SimpleBean">
</bean>
</beans>
第三步就是編寫一個測試類TestSimple:
package com.wjr.spring47;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSimple {
public static void main(String[] args) {
ApplicationContext context = null;
context = new ClassPathXmlApplicationContext("applicationContext.xml");
SimpleBean sb = (SimpleBean)context.getBean("simple");
//上面這種通過context實例對象獲取要使用的對象(本例是SimpleBean )代碼是固定的。不需要多解釋吧
sb.setName("wjr");
sb.setPassword("530");
System.out.println(sb.getName());
System.out.println(sb.getPassword());
}
}
運行測試類 就能正常打印了。明白是怎麼回事了嗎?簡單的說就是通過配置文件的映射找到要使用的類,而不是向以前通過工廠或者其他什麼方式去訪問java類了。不是叫屬性注入呢 ?怎麼沒發現property之類的東東??不急,慢慢往下看:
但是一般情況下不會在測試類中才對屬性值進行設置,也就是要在配置文件中就要求設置好屬性的初始值,也就是我們的第一中方式:屬性注入。做起來其實很簡單,在配置文件中通過property屬性就完成功能了。即是把上面第二步修改爲:
<beans>
<bean id="simple" class="com.wjr.spring47.SimpleBean">
<property name="name" value="陳霞"></property>
<property name="password" value="585"></property>
</bean>
</beans>
(呵呵 出現property了吧!)
然後上面第三步就不需要如下類似代碼了:
sb.setName("wjr");
sb.setPassword("530");
然後再運行測試類,成功打印。這就是傳說中的屬性注入。
下面介紹第二種注入方式:構造注入。
方式二(構造注入):
很多時候還是希望通過構造方法去實例化對象的。這種方式需要做兩步操作。第一需要在配置文件中增加一個參數constructor-arg,第二需要在相應Bean中增加一個構造方法,具體如下:
首先修改bean類,即添加構造方法:
package com.wjr.spring47;
public class SimpleBean {
private String name;
private String password;
public SimpleBean(String name,String password)
{
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第二步,修改配置文件如下:
<beans>
<bean id="simple" class="com.wjr.spring47.SimpleBean">
<constructor-arg index="0" value="wz"></constructor-arg>
<constructor-arg index="1" value="530"></constructor-arg>
</bean>
</beans>
第三步,編寫測試類:
package com.wjr.spring47;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSimple {
public static void main(String[] args) {
ApplicationContext context = null;
context = new ClassPathXmlApplicationContext("applicationContext.xml");
SimpleBean sb = (SimpleBean)context.getBean("simple");
// sb.setName("wjr");
// sb.setPassword("530");
//
System.out.println(sb.getName());
System.out.println(sb.getPassword());
}
}
這時同樣能打印出姓名和密碼來。
方式三:(當A類中的一個屬性需要訪問B類對象像這種情況時就使用這種方式):
比如現在有個類RefBean.java,其中有個Date類對象屬性:date ,那現在要怎麼樣對她進行設置呢:
首先建立Bean類:
package com.wjr.spring47;
import java.util.Date;
public class RefBean {
private String name;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二步,設置配置文件內容:
<beans>
<bean id="demo02" class="com.wjr.spring47.DemoBean02">
<property name="name" value="王歡歡"></property>
<property name="date" ref="datebean"></property></bean>
<bean id="datebean" class="java.util.Date"></bean>
</beans>
第三步,添加測試類:
package com.wjr.spring47;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemoBean02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context = null;
context = new ClassPathXmlApplicationContext("applicationContext.xml");
DemoBean02 rb = (DemoBean02)context.getBean("demo02");
System.out.println(rb.getName());
System.out.println(rb.getDate());
}
}
運行測試類,ok,時間姓名成功打印。
這個例子也就是說在spring中可以通過ref綁定一個在配置文件中已經聲明好的對象。
當然,除了ref綁定之外,spring還提供了一種自動綁定機制autowire:
這種方式呢就只需要將配置文件修改如下即可:
<beans>
<bean id="demo02" class="com.wjr.spring47.DemoBean02"
autowire="byType">
<property name="name" value="王歡歡"></property>
</bean>
<bean id="datebean" class="java.util.Date"></bean>
</beans>
效果呢就跟前面一樣哈。
autowire="byType意思呢就是表示按類型自動尋找匹配,但是你說類型有時候有重複啊 咋辦?
莫急,使用:autowire="byName"。即是按屬性名稱進行設置。因爲這時Bean中屬性名爲date,所以這種方式還要求必須把相應的Bean的id設爲跟屬性名date一樣。具體如下:
<beans>
<bean id="demo02" class="com.wjr.spring47.DemoBean02"
autowire="byName">
<property name="name" value="王歡歡"></property>
</bean>
<bean id="date" class="java.util.Date"></bean>
</beans>
當然,這種綁定類型還有中方式就按構造方法綁定constructor。
第一步,當然得先在bean類中添加構造方法纔行:
package com.wjr.spring47;
import java.util.Date;
public class DemoBean02 {
private String name;
private Date date;
public DemoBean02(Date date)
{
this.date = date;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第二步,修改配置文件爲:
<beans>
<bean id="demo02" class="com.wjr.spring47.DemoBean02"
autowire="constructor">
<property name="name" value="王歡歡"></property>
</bean>
<bean id="date" class="java.util.Date"></bean>
</beans>
然後運行測試成功。
現在基本就講完了spring中的Ioc注入方法了。其實說白了spring中的Ioc就是通過配置文件完成對Bean的統一管理。
當然,關於集合數據類型的注入方式在開發中也常見,這裏限於篇幅暫不講解了哈 下次見各位