标签:spring
Spring支持使用如下三种方法创建Bean:
调用构造器创建Bean
调用静态工厂方法创建Bean
调用实例工厂方法创建Bean
构造器
这是最常见的,框架底层调用bean的无参数构造器。这种情况下,class助兴是必需的。之前写的都是这种方式。
静态工厂方法创建Bean
class也必须指定,但不是指定实现类,而是静态工厂类,这个工厂会创建bean实例。另外还需要factory-method指定用哪个方法创建bean实例,返回值即为实例。
接口与实现类如下:
public interface Being {
public void testBeing();
}public class Dog implements Being {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void testBeing() {
// TODO Auto-generated method stub
System.out.println("a dog!");
}
}静态工厂如下:
public class BeingFactory {
public static Being getBegin(String arg){
if(arg.equalsIgnoreCase("dog")){
return new Dog();
}else{
return new Cat();
}
}
}xml:
<bean id="dog" class="com.cm.BeingFactory" factory-method="getBegin"> <constructor-arg value="dog"/> <property name="name">AAA</property>
调用的代码没有任何区别,获得ApplicationContext实例ctx,getBean。
这里我们看到,xml中指定了静态工厂的实现类,使用的方法,以及静态工厂方法的参数。Spring不再负责创建Bean,但依然可以管理创建好的bean,包括注入关系,管理生命周期。
实例工厂方法创建Bean
与静态唯一不同就是需要用factory-bean指定工厂实例,而不是class指定静态工厂。当然这么做的话,就需要在xml中配置一下工厂了。工厂代码如下:
public class Factory
public Person getPerson(String ethnic)
{
if(ethnic.equalsIgnoreCase("chin"))
{
return new Chinese();}
else{
return new American();
}
}xml如下:
<bean id="factory" class="com.cm.Factory"/> <bean id="Chinese" factory-bean="factory" factory-method="getPerson"> <constructor-arg value="chin"/> </bean>
本文出自 “指尖轻飞” 博客,谢绝转载!
标签:spring
原文地址:http://mengcao.blog.51cto.com/9395052/1690441