1. 程式人生 > >Spring IOC 應用 (2)維護物件關係

Spring IOC 應用 (2)維護物件關係

一,採用注入方式建立物件關係,Dependency Injection (DI)依賴注入

1,依賴注入:set方法的注入

 在Java project Package1包內,新建Computer類,獲取get ,set方法

package Package1;

public class Computer {
  private String cpu;
  private String hdd;
  private String mainbord;
  public void show(){
	  System.out.println("cpu:"+cpu);
	  System.out.println("hdd:"+hdd);
	  System.out.println("mainbord:"+mainbord);
	  
  }
public String getCpu() {
	return cpu;
}
public void setCpu(String cpu) {
	this.cpu = cpu;
}
public String getHdd() {
	return hdd;
}
public void setHdd(String hdd) {
	this.hdd = hdd;
}
public String getMainbord() {
	return mainbord;
}
public void setMainbord(String mainbord) {
	this.mainbord = mainbord;
}
  
}

在applicationContext.xml中加入<bean>標籤,

<bean id="a1" class="Package1.Computer" >
	<!--資訊set注入  -->
<property name="cpu"  value="驍龍">  </property>
<property name="hdd"  value="索尼">  </property>
<property name="mainbord"  value="華碩">  </property>
</bean>

在測試類中,我們可以通過

public static void main(String[] args) {
//原方法		Computer com=new Computer();
//		com.setCpu("i7");
//		com.setHdd("希捷");
//		com.setMainbord("hh");
		String conf="applicationContext.xml";
		ApplicationContext ac=new ClassPathXmlApplicationContext(conf);
		Computer c= ac.getBean("a1",Computer.class);
2.依賴注入:構造器注入

 在Java project Package1包內,新建Phone類,寫出構造方法

package Package1;

public class Phone {
	private String  cpu;
	private String ram;
 public  Phone(String cpu,String ram ){
	 this.cpu=cpu;
	 this.ram=ram;
	 
 }
 public void show(){
	 System.out.println("cpu:"+cpu);
	 System.out.println("ram:"+ram);
 }
}

在applicationContext.xml中加入<bean>標籤,

<bean id="b1" class="Package1.Phone" >
		<!--構造器注入  -->
	<constructor-arg index="0" value="高通"></constructor-arg>
	<constructor-arg index="1" value="4G"></constructor-arg>
	</bean>

在測試類main方法中

public static void main(String[] args) {
		String  conf="ApplicationContext.xml";
		ApplicationContext ac=new ClassPathXmlApplicationContext(conf);
		Phone phone=ac.getBean("b1",Phone.class);
		phone.show();
	}

3.set注入 自定義類物件

 在Java project Package1包內,新建Student類,寫出get set方法

package Package1;

public class Student {
private Computer c;
private Phone p;
public void show()
{
	c.show();
	p.show();
	}
public Computer getC() {
	return c;
}
public void setC(Computer c) {
	this.c = c;
}
public Phone getP() {
	return p;
}
public void setP(Phone p) {
	this.p = p;
}
}
在applicationContext.xml中加入<bean>標籤,
	<bean id="s1" class="Package1.Student" >
		<!--資訊set注入Computer nama="student類的物件名" ref=“引用的id名”  -->
		<property name="c"  ref ="a1"> </property>
		<!--資訊set注入Phone  ref  -->
	    <property name="p"  ref="b1">  </property>
	</bean>
在測試類main方法中
	public static void main(String[] args) {
	 String conf="applicationContext.xml";
	 ApplicationContext ac=new ClassPathXmlApplicationContext(conf);
	 Student student=ac.getBean("s1",Student.class);
	 student.show();
	 
	}

4.自動注入

在applicationContext.xml中加入<bean>標籤,這裡有byType,byName,constructor等用於簡化注入配置,使用byType需注意,有兩個及以上的同類型時匹配會出異常。

<bean autowire="default"></bean>

二,各種型別資訊的注入配置格式

1,注入字串,數值單個數值

在applicationContext.xml中加入<bean>標籤,
<bean id="d1" class="Package2.MessageBean" >
	<!--資訊set注入  -->
<property name="name"  value="wjc">  </property>
	<!-- 18會自動轉換為int -->
<property name="age"  value="18">  </property>
 <!-- 注入 系統無法自己搞成date 需要我們在set中自己轉換 -->
	   <property name="birth"  value="1998-06-13">  </property></bean>

2,注入bean物件(用ref)

3,注入list,set,map,properties

在applicationContext.xml中加入<bean>標籤

  <property name="friends" >  
	    <list>
	    <value>tom</value>
	     <value>rose</value>
	     <value>jack</value>
	     <value>Amy</value>
	    </list>
	    </property>
<property name="cities">
			<set>
				<value>北京</value>
				<value>上海</value>
			</set>
		</property>
<property name="books">
			<map>
				<entry key="鋼鐵是怎樣煉成的" value="保爾柯察金"></entry>
				<entry key="茶館" value="老舍"></entry>
			</map>
		</property>
		<property name="db">
			<props>
				<prop key="username">root</prop>
				<prop key="password">1234</prop>
				<prop key="driver">com.mysql.jdbc.Driver</prop>

			</props>
		</property>

4.Spring表示式的注入

(1)在applicationContext.xml中bean>標籤外加入  list,set,map,properties,方便多次使用

<!-- 定義List<String>物件 -->
	<util:list id="someList">
		<value>林殊</value>
		<value>靖王</value>
		<value>郡主</value>
	</util:list>
	<util:set id="someSet">
		<value>浙江</value>
		<value>福建</value>
		<value>臺灣</value>
	</util:set>
	<util:map id="someMap">
		<entry key="祥林嫂" value="魯迅"></entry>
		<entry key="朝花夕拾" value="魯迅"></entry>
	</util:map>
	<!-- 在bean外形成一個Properties物件 ,方便多次呼叫 -->
	<util:properties id="someProp">
		<prop key="username">root1</prop>
		<prop key="password">123456</prop>
		<prop key="driver">com.mysql.jdbc.Driver</prop>
	</util:properties>

(2)在xml檔案外,新建一個db.properties檔案

# key=value
user=root1
password=1234
driver=com.mysql.jdbc,Driver
url=jdbc\:mysql\://localhost\:3306/test

在application中我們通過

<!-- 讀取db.properties檔案,形成一個Properties物件 常用於資料庫 -->
	<util:properties id="dbParams" location="classpath:db.properties">
	</util:properties>

然後在其他表示式中能用到該檔案的內容:

#{表示式},

#{id名.屬性}或#{id名.key}

如果是物件屬性,需要有getxxx方法

<!-- 利用#{表示式}提取dbParams物件資訊 -->
	<util:properties id="someprop1">
		<prop key="username">#{dbParams.user}</prop>
		<prop key="password">#{dbParams.password}</prop>
		<prop key="driver">#{dbParams.driver}</prop>
	</util:properties>

運用:

	<bean id="msg1" class="Package2.MessageBean">
		<!-- 只調用外部檔案的一部分內容 -->
		<!--<property name="name" value="{dbParams.user}"></property> -->
		<!--通過id 呼叫另一個bean的 name物件 -->
		<!-- <property name="name" value="#{msg2.name}"></property> -->
		<property name="friends" ref="someList"></property>
		<property name="cities" ref="someSet"></property>
		<property name="books" ref="someMap"></property>
		<property name="db" ref="dbParams"></property>

	</bean>


*    新建Package2中新建類MessageBean

package Package2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;


public class MessageBean {
	private String name;
	private int age;
	//涉及轉換string --》date
	private Date birth;
	private List<String> friends;
	private Set<String> cities;
	private Map<String, String> books;
	private Properties  db;
	public Properties getDb() {
		return db;
	}
	public void setDb(Properties db) {
		this.db = db;
	}
	public Map<String, String> getBooks() {
		return books;
	}
	public void setBooks(Map<String, String> books) {
		this.books = books;
	}
	public Set<String> getCities() {
		return cities;
	}
	public void setCities(Set<String> cities) {
		this.cities = cities;
	}
	public List<String> getFriends() {
		return friends;
	}
	public void setFriends(List<String> friends) {
		this.friends = friends;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(String birth) {
	    Date date = null;
		try {
			date = new SimpleDateFormat("yyyy-MM-dd").parse(birth);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.birth =date;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
public void show(){
	System.out.println("name:"+name+",age:"+age+",birth:"+birth);
	for(String s:friends)
	System.out.println("my friends are"+s);
	for(String c:cities)
	System.out.println("my cities are"+c);
         Set<Entry<String,String>> booksset= books.entrySet();
        for( Entry<String, String> s: booksset){
	   System.out.println("書名:《"+s.getKey()+"》 "+"作者:"+s.getValue());
   }
   Set<Object>  keys=db.keySet();
       for(Object key :keys){
	   //用key獲取 value資訊 在標籤中間
	   System.out.println(key+":"+db.getProperty(key.toString()));
   }
		   
}
}

* IOC概念:控制反轉,改變了物件獲取的方式:

以前是,編碼方式,採用new構造器方式來獲取物件;

IOC中採用由容器建立物件之後注入來使用