8. 创建Bean的三种方式:

Spring支持的创建Bean的方式:

(1) 调用构造器创建Bean

(2) 调用静态工厂方法创建Bean

(3) 调用实例工厂方法创建Bean


8.1 使用构造器创建Bean实例:
class属性的值就是Bean实例的实现类。前面有很多相关实例,不再赘述。


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

使用静态工厂方法创建Bean时,class属性也必须指定,但此时class属性不指定Bean实例的实现类,而是静态工厂类。除此之外,还需要使用factory-method指定的静态工厂方法来创建,该方法必须是静态的。如果静态方法需要参数,则使用<constructor-arg.../>元素传入。

Being.java

package com.pmpa.ch03;

public interface Being {
	public void speak();
}

Cat.java

package com.pmpa.ch03;

public class Cat implements Being {
	private String info;
	

	public String getInfo() {
		return info;
	}


	public void setInfo(String info) {
		this.info = info;
	}


	@Override
	public void speak() {
		// TODO Auto-generated method stub
		System.out.println(info + ",喵喵叫");
	}

}

Dog.java

package com.pmpa.ch03;

public class Dog implements Being {
	
	private String info;
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	@Override
	public void speak() {
		// TODO Auto-generated method stub
		System.out.println(info + ",旺旺叫");
	}

}

beans03.xml

<bean id ="dog" class="com.pmpa.ch03.BeingStaticFactory" factory-method="getBeing">
	<constructor-arg value="dog"/>
	<property name="info" value="我是狗" />
</bean>
<bean id ="cat" class="com.pmpa.ch03.BeingStaticFactory" factory-method="getBeing">
	<constructor-arg value="cat"/>
	<property name="info" value="我是猫" />
</bean>

BeanTest.java

System.out.println("-----------------------测试静态工厂创建Bean------------------------");
Being dog = ctx.getBean("dog", Being.class);
Being cat = ctx.getBean("cat", Being.class);
dog.speak();
cat.speak();

一旦为<bean.../>指定了 factory-method属性,Spring就不再调用构造器来创建Bean实例,而是调用工厂方法来创建Bean实例。


8.3 调用实例工厂方法创建Bean:

与静态工厂区别:调用静态工厂方法只需要使用工厂类即可,而调用实例工厂方法则需要工厂实例。在配置上,静态工厂方法使用class指定静态工厂类,而配置实例工厂方法则使用factory-bean指定工厂实例。

使用实例工厂方法时,配置Bean实例的<bean.../>元素无需class属性。

采用实例工厂方法创建Bean的<bean.../>元素需要指定2个属性:

(1) factory-bean : 工厂Bean的Id

(2) factory-bean :  该属性指定实例工厂的工厂方法。

(3) constrctor-bean :如果需要调用实例工厂方法时传参,使用该属性。

BeingInstanceFactory.java

package com.pmpa.ch03;

public class BeingInstanceFactory {
	
	public Being getBeing(String arg)
	{
		if(arg.equalsIgnoreCase("dog"))
		{
			return new Dog();
		}
		else
		{
			return new Cat();
		}
	}

}

方法getBeing不是静态方法,所以工厂是实例工厂,而不是静态工厂。

beans03.xml

<bean id="beinginstancefactory" class = "com.pmpa.ch03.BeingInstanceFactory"/>

<bean id ="dog" factory-bean="beinginstancefactory" factory-method="getBeing">
	<constructor-arg value="dog"/>
	<property name="info" value="我是狗" />
</bean>
<bean id ="cat" factory-bean="beinginstancefactory" factory-method="getBeing">
	<constructor-arg value="cat"/>
	<property name="info" value="我是猫" />
</bean>

运行结果与静态工厂创建的Bean一致。