使用静态工厂创建Bean

    使用静态工厂创建Bean时,在<bean>中也要指定class属性,但此时class属性并不是指定Bean实列的实现类,而是产生该Bean的静态工厂类。Spring需要知道由哪个静态工厂来创建Bean实列。如下:

   定义需要的Bean

public interface Animal {
    //指定动物行为
	public void beHaveing();
}

    分别有dog和cat两个实现类

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静态方法,用于产生对应的动物。

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>

测试类:

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();
	}

}

控制台输出:

我是狗狗爱啃骨头
我是猫猫爱吃老鼠

    XML中dog和cat两个Bean配置的class属性和factory-method属性一样,因为这个两个Bean有同一个工厂中的静态方法产生,配置工厂的实参值使用<constructor-arg>进行配置。当我们指定Spring使用静态工厂方法来创建Bean实列时,Spring将先解析配置文件,并根据配置文件指定的信息,通过反射调用静态工厂类的静态工厂方法,将该静态工厂方法的返回值作为Bean实列。在这个过程中,Spring不再负责创建Bean实列,Bean实列由用户提供的静态工厂类负责创建。

猜你喜欢

转载自my.oschina.net/u/3697923/blog/1626392
今日推荐