一、 使用構造器創建Bean的實例
在依賴注入已經敘述多種注入實例
二、使用靜態工廠方法創建Bean
實例如下:
**靜態工廠方法所產生的產品是該接口的實例**
package com.home.bean;
/**
* 定義Beging接口,靜態工廠方法所產生的產品是該接口的實例
*/
public interface Being {
public void testBeing();
}
**下面爲兩個實現類,靜態工廠將會產生這兩個實現類的實例**
package com.home.bean;
public class Dog implements Being{
private String msg;
public void setMsg(String msg) {
this.msg = msg;
}
public void testBeing() {
// TODO Auto-generated method stub
System.out.println(msg+",狗吃骨頭");
}
}
package com.home.bean;
public class Cat implements Being{
private String msg;
public void setMsg(String msg) {
this.msg = msg;
}
public void testBeing() {
// TODO Auto-generated method stub
System.out.println(msg+",貓愛吃魚");
}
}
下面是工廠類,該靜態方法getBeing()用於返回一個Being的實例
package com.home.bean;
public class BeingFactory {
//返回Beging實例的靜態工廠方法
//type參數決定返回哪一個Beging類的實例
public static Being getBeing(String type){
//調用此靜態方法的參數爲dog,則返回Dog的實例
if(type.equalsIgnoreCase("dog")){
return new Dog();
}else{
return new Cat();
}
}
}
配置文件:
<!-- 下面配置驅動Spring調用beingFactory的靜態方法getBeging方法來創建bean
該bean元素包含constructor-arg元素用於靜態工廠方法的參數
-->
<!-- 1、class屬性值不再是bean實例的實現類
2、constructor-arg元素用於靜態工廠方法的參數
3、使用factory-method屬性指定創建bean實例的靜態工廠方法
-->
<bean id="dog" class="com.home.bean.BeingFactory" factory-method="getBeing">
<!-- 配置靜態工廠方法的參數 -->
<constructor-arg value="dog" />
<property name="msg" value="我是狗"/>
</bean>
<bean id="cat" class="com.home.bean.BeingFactory" factory-method="getBeing">
<!-- 配置靜態工廠方法的參數 -->
<constructor-arg value="cat" />
<property name="msg" value="我是貓"/>
</bean>
測試類如下:
package spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.home.bean.Being;
public class springTest2 {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
Being b1=ctx.getBean("dog", Being.class);
Being b2=ctx.getBean("cat", Being.class);
b1.testBeing();
b2.testBeing();
/**
* 我是狗,狗吃骨頭
我是貓,貓愛吃魚
*/
}
}
三、調用實例工廠方法創建bean
區別:
調用靜態工廠類只需要使用工廠類即可,而調用實例工廠方法則需要工廠實例。配置靜態工廠方法使用class指定靜態工廠類,而配置實例工廠方法則使用factory-bean指定工廠實例。
實例如下:
package com.home.bean;
//實例工廠方法所產生的對象將實現此接口
public interface People {
public String sayHello(String name);
public String sayGoodBye(String name);
}
兩個實現類:
package com.home.bean;
public class Chinese implements People{
public String sayHello(String name) {
// TODO Auto-generated method stub
return name+",你好!";
}
public String sayGoodBye(String name) {
// TODO Auto-generated method stub
return name+",再見!";
}
}
package com.home.bean;
public class American implements People{
public String sayHello(String name) {
// TODO Auto-generated method stub
return name+",Hello!";
}
public String sayGoodBye(String name) {
// TODO Auto-generated method stub
return name+",Good Bye!";
}
}
實例工廠類如下:
負責生產People對象的實例工廠
package com.home.bean;
public class PersonFactory {
//獲得People的實例工廠方法
public People getPerson(String type){
if(type.equals("chin")){
return new Chinese();
}else{
return new American();
}
}
}
配置文件如下:
<!-- 配置實例化工廠 -->
<!--配置工廠bean,該bean負責產生其他bean的實例 -->
<bean id="personFactory" class="com.home.bean.PersonFactory"></bean>
<!-- 下面配置驅動Spring調用getPerson方法來創建bean-->
<bean id="chinese" factory-bean="personFactory" factory-method="getPerson">
<constructor-arg value="chin" />
</bean>
<bean id="american" factory-bean="personFactory" factory-method="getPerson">
<constructor-arg value="ame" />
</bean>
測試類如下:
package spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.home.bean.People;
public class springTest3 {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
People p1=ctx.getBean("chinese",People.class);
System.out.println(p1.sayHello("中國人"));;
People p2=ctx.getBean("american",People.class);
System.out.println(p2.sayHello("American"));
/**print:
* 中國人,你好!
American,Hello!
*/
}
}