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

相关文章
相关标签/搜索