使用靜態工廠建立Bean

    使用靜態工廠建立Bean時,在<bean>中也要指定class屬性,但此時class屬性並非指定Bean實列的實現類,而是產生該Bean的靜態工廠類。Spring須要知道由哪一個靜態工廠來建立Bean實列。以下:java

   定義須要的Beanspring

public interface Animal {
    //指定動物行爲
	public void beHaveing();
}

    分別有dog和cat兩個實現類app

package com.custle.spring;

public class Dog implements Animal {
	private String msg;
	
	public void setMsg(String msg) {
		this.msg = msg;
	}

	@Override
	public void beHaveing() {
		System.out.println(msg + "狗愛啃骨頭");
	}

}
package com.custle.spring;

public class Cat implements Animal {
	private String msg;
	
	public void setMsg(String msg) {
		this.msg = msg;
	}
	@Override
	public void beHaveing() {
		System.out.println(msg + "貓愛吃老鼠");
	}

}

下面的AnimalFactory工廠包含了getBeing靜態方法,用於產生對應的動物。ide

package com.custle.spring;

public class AnimalFactory {
	/**
	 * 根據參數決定返回對應Animal的實列
	 * @param arg
	 * @return
	 */
	public static Animal getBeing(String arg ){
		if(arg.equalsIgnoreCase("dog")){
			return new Dog();
		}else{
			return new Cat();
		}
	}
}

XML中配置:測試

<!-- 配置BeanFactory的getBeing方法產生dog Bean -->
	<bean id="dog" class="com.custle.spring.BeingFactory" factory-method="getBeing">
		<!-- 配置靜態工廠方法的參數 -->
		<constructor-arg  value="dog"/>
		<!-- 配置普通依賴注入屬性 -->
		<property name="msg" value="我是狗"/>
	</bean>
	
	<!-- 配置BeanFactory的getBeing方法產生cat Bean -->
	<bean id="cat" class="com.custle.spring.BeingFactory" factory-method="getBeing">
		<!-- 配置靜態工廠方法的參數 -->
		<constructor-arg   value="cat"/>
		<!-- 配置普通依賴注入屬性 -->
		<property name="msg" value="我是貓"/>
	</bean>

測試類:this

package com.custle.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeingTest {

	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-spring.xml");
		Animal dog = applicationContext.getBean("dog", Animal.class);
		dog.beHaveing();
		Animal cat = applicationContext.getBean("cat", Animal.class);
		cat.beHaveing();
	}

}

控制檯輸出:code

我是狗狗愛啃骨頭
我是貓貓愛吃老鼠

    XML中dog和cat兩個Bean配置的class屬性和factory-method屬性同樣,由於這個兩個Bean有同一個工廠中的靜態方法產生,配置工廠的實參值使用<constructor-arg>進行配置。當咱們指定Spring使用靜態工廠方法來建立Bean實列時,Spring將先解析配置文件,並根據配置文件指定的信息,經過反射調用靜態工廠類的靜態工廠方法,將該靜態工廠方法的返回值做爲Bean實列。在這個過程當中,Spring再也不負責建立Bean實列,Bean實列由用戶提供的靜態工廠類負責建立。xml

相關文章
相關標籤/搜索