使用静态工厂建立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