1.代碼結構圖
xxx
2.bean代碼
package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午1:25 * To change this template use File | Settings | File Templates. */ public abstract class People { protected String name; protected int age; protected Pet pet; public abstract String speak(); @Override public String toString() { return "I am " + name + ", I'm " + age + " years old. And I have a pet named " + pet.getName(); } 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 Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } } package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午1:28 * To change this template use File | Settings | File Templates. */ public class Chinese extends People { public Chinese(String name, int age, Pet pet) { this.name = name; this.age = age; this.pet = pet; } public Chinese() { } @Override public String speak() { return "I can speak Chinese"; } } package com.xxx.bean; import java.util.List; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午2:14 * To change this template use File | Settings | File Templates. */ public class American extends People { private List<Pet> petList; @Override public String speak() { return "I can speak English!"; } public List<Pet> getPetList() { return petList; } public void setPetList(List<Pet> petList) { this.petList = petList; } } package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午1:26 * To change this template use File | Settings | File Templates. */ public abstract class Pet { protected String name; public abstract String bark(); @Override public String toString() { return "My name is " + name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午1:28 * To change this template use File | Settings | File Templates. */ public class Dog extends Pet { public Dog() { } public Dog(String name) { this.name = name; } @Override public String bark() { return "Wang wang"; } } package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午1:29 * To change this template use File | Settings | File Templates. */ public class Cat extends Pet { public Cat() { } @Override public String bark() { return "miao"; } }
3.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 構造方法注入示例 --> <!-- scope參數表示bean的作用域,如下 --> <!-- singleton,默認值,一個bean只有一個實例 --> <!-- prototype,每次調用創建一個實例 --> <!-- request,每次http請求對應一個實例,僅在Spring MVC上下文有效 --> <!-- session,每個session對應一個實例,僅在Spring MVC上下文有效 --> <!-- global-session,每個全局session對應一個實例,盡在Portlet上下文有效 --> <bean id="chineseA" class="com.xxx.bean.Chinese" scope="prototype"> <constructor-arg value="Li Lei"/> <constructor-arg value="15"/> <constructor-arg ref="dogA"/> </bean> <bean id="dogA" class="com.xxx.bean.Dog"> <constructor-arg value="Bobby"/> </bean> <!-- 工廠方法注入示例 --> <!-- 如果bena的類型是一個單例模式類 --> <!-- 那么注入這個類的方法則是使用其工廠方法生成實例 --> <!--<bean id="staticClass" --> <!--class="com.xxx.bean.StaticClass"--> <!--factory-method="getInstance" />--> <!-- 屬性注入示例 --> <!-- 使用p前綴,直接引入屬性或屬性引用 --> <bean id="chineseB" class="com.xxx.bean.Chinese" scope="prototype" p:pet-ref="catA"> <property name="name" value="Han Meimei" /> <property name="age" value="18" /> <!--<property name="pet" ref="catA" />--> </bean> <bean id="catA" class="com.xxx.bean.Cat" p:name="Kitty" /> <!-- 集合注入示例 --> <!-- 集合注入包括List,Set,Map,Properties --> <!-- 此處以List為例子,其他不詳寫 --> <bean id="americanA" class="com.xxx.bean.American" scope="prototype"> <property name="name" value="Michael Johnson" /> <property name="age" value="28" /> <property name="pet" ref="dogB" /> <property name="petList"> <list> <ref bean="dogA" /> <ref bean="catA" /> </list> </property> </bean> <bean id="dogB" class="com.xxx.bean.Dog" p:name="Cookie" /> </beans>
4.測試代碼及結果
package com.xxx.bean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午1:51 * To change this template use File | Settings | File Templates. */ public class ConstructInjectTest { /** * Spring的3種應用上下文介紹 * ClassPathXmlApplicationContext-從運行時加載類路徑下讀取XML配置 * FileSystemXmlApplicationContext-從文件系統讀取XML配置文件(絕對路徑) * XmlWebApplicationContext-從Web應用下讀取XML配置文件 */ public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); People chinese = (People) ctx.getBean("chineseA"); Pet dog = chinese.getPet(); System.out.println(chinese); System.out.println(chinese.speak()); System.out.println(dog); System.out.println(dog.bark()); } }
I am Li Lei, I'm 15 years old. And I have a pet named Bobby
I can speak Chinese
My name is Bobby
Wang wang
package com.xxx.bean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午2:13 * To change this template use File | Settings | File Templates. */ public class PropInjectTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); People chinese = (People) ctx.getBean("chineseB"); Pet dog = chinese.getPet(); System.out.println(chinese); System.out.println(chinese.speak()); System.out.println(dog); System.out.println(dog.bark()); } }
I am Han Meimei, I'm 18 years old. And I have a pet named Kitty
I can speak Chinese
My name is Kitty
miao
package com.xxx.bean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * Date: 13-7-18 * Time: 上午2:23 * To change this template use File | Settings | File Templates. */ public class CollectionInjectTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); American american = (American) ctx.getBean("americanA"); Pet dog = american.getPet(); System.out.println(american); System.out.println(american.speak()); System.out.println(dog); System.out.println(dog.bark()); System.out.println(american.getPetList()); } }
I am Michael Johnson, I'm 28 years old. And I have a pet named Cookie
I can speak English!
My name is Cookie
Wang wang
[My name is Bobby, My name is Kitty]
自動裝配配置
<!-- 自動裝配示例 --> <!-- autowire屬性表示自動裝配bean中的所有屬性,也可以和手動裝配混合使用 --> <!-- byName表示裝配屬性名與bean id相同的bean --> <!-- byType表示裝配類型與bean class類型相同的bean --> <!-- constructor表示按照構造方法裝配,裝配規則與byType相同 --> <!-- autodetect表示先使用constructor裝配,如果沒有與構造方法匹配的參數,在使用byType裝配 --> <!-- 當使用byType有多個符合條件的bean時,可以設置primary=true,表示有多個符合條件bean時使用此bean --> <!-- 如果不想讓某個bean成被裝配,可以設置autowire-candidate=false --> <bean id="autoChinese" class="com.xxx.bean.Chinese" autowire="byName" > <property name="name" value="#{chineseA.name}" /> </bean> <!-- 可以在 beans 標簽中配置全局自動裝配 default-autowire="byType" -->