使用靜態工廠建立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