您的位置:首页 > 编程语言 > Java开发

使用静态工厂创建Bean

2018-02-28 00:00 274 查看
使用静态工厂创建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实列由用户提供的静态工厂类负责创建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息