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>
在測試類中,我們可以通過
2.依賴注入:構造器注入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);
在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中採用由容器建立物件之後注入來使用