spring反轉控制IOC或依賴注入之簡單示例

這篇文章通過幾個簡單實例介紹了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的統一管理。

當然,關於集合數據類型的注入方式在開發中也常見,這裏限於篇幅暫不講解了哈 下次見各位

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章