您的位置:首页 > 其它

7.7.2:使用静态工厂方法创建Bean

2013-07-18 05:24 465 查看


Being.java :

public interface Being {
public void testBeing();
}
Dog.java :
public class Dog implements Being {

private String msg;

public void setMsg(String msg) {
this.msg = msg;
}

@Override
public void testBeing() {
System.out.println(msg+",狗爱啃骨头");
}

}
Cat.java :
public class Cat implements Being {

private String msg;

public void setMsg(String msg) {
this.msg = msg;
}

@Override
public void testBeing() {
System.out.println(msg+",猫爱吃老鼠");
}

}
BeingFactory.java :
public class BeingFactory {

public static Being getBeing(String arg){
if(arg.equalsIgnoreCase("dog")){
return new Dog();
}else{
return new Cat();
}
}
}
bean.xml核心配置:
<bean id="dog" class="com.bean.BeingFactory" factory-method="getBeing">
<constructor-arg value="dog"/>
<property name="msg" value="我是狗"/>
</bean>

<bean id="cat" class="com.bean.BeingFactory" factory-method="getBeing">
<constructor-arg value="cat"/>
<property name="msg" value="我是猫"/>
</bean>
从上面的核心配置可以看出,cat和dog两个Bean配置的class属性和factory-method属性完全相同,这是因为这两个实例都是由同一个工厂类的同一个静态方法生产得到的。配置这两个Bean实例指定了工厂的静态方法的实参值不同,配置静态方法的实参值使用<constructor-arg.../>元素。

Test.java :

public class Test {

public static void main(String[] args) {

ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
Being b1=(Being) ctx.getBean("dog");
b1.testBeing();
Being b2=(Being) ctx.getBean("cat");
b2.testBeing();
}

}
运行Test.java,控制台输出:



总结:

使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是Bean实例的实现类,而是静态工厂类。除此之外,还需要使用factory-method属性来指定工厂的静态方法名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: