使用构造器创建Bean实例(如前所示)
使用静态工厂方法创建实例:
Being.java
package inter;
public interface Being {
public void testBeing();
}
Cat.java
package entity;
import inter.Being;
public class Cat implements Being{
private String msg;
public void setMsg(String msg)
{
this.msg=msg;
}
@Override
public void testBeing() {
// TODO Auto-generated method stub
System.out.println(msg+",爱吃老鼠!");
}
}
Dog.java
package entity;
import inter.Being;
public class Dog implements Being{
private String msg;
public void setMsg(String msg)
{
this.msg=msg;
}
@Override
public void testBeing() {
// TODO Auto-generated method stub
System.out.println(msg+",爱啃骨头!");
}
}
BeanFactory.java
package config;
import entity.Cat;
import entity.Dog;
import inter.Being;
public class BeingFactory {
//返回Being实例的静态工厂方法
public static Being getBeing(String msg)
{
if(msg.equalsIgnoreCase("dog"))
{
return new Dog();
}
else
{
return new Cat();
}
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" >
<bean id="dog" class="config.BeingFactory" factory-method="getBeing">
<!-- 配置静态工厂方法的参数 -->
<constructor-arg value="dog"/>
<!-- 驱动Spring以“狗”为参数来执行dog的setMsg()方法 -->
<property name="msg" value="狗" />
</bean>
<bean id="cat" class="config.BeingFactory" factory-method="getBeing">
<!-- 配置静态工厂方法的参数 -->
<constructor-arg value="cat"/>
<!-- 驱动Spring以“猫”为参数来执行dog的setMsg()方法 -->
<property name="msg" value="猫" />
</bean>
</beans>
采用静态工厂方法来生产Bean实例需要指定两个属性:
- class:该属性值为静态工厂类的类名。
- factory-method:该属性指定静态工厂方法生产来生产Bean实例。
使用静态工厂方法是必须指定静态工厂类,工厂类包含产生实例的静态方法。
- class属性不再是Bean实例的实现类,而是生成Bean实例的静态工厂类。
- 使用factory-method属性指定创建Bean实例的静态工厂方法。
- 如果静态工厂方法需要参数,则使用<constructor-arg.../>元素来指定静态工厂方法的参数。
调用实例工厂方法创建Bean:
工厂方法的区别:
package config;
import entity.Cat;
import entity.Dog;
import inter.Being;
public class BeingFactory {
//返回Being实例的静态工厂方法
public Being getBeing(String msg)
{
if(msg.equalsIgnoreCase("dog"))
{
return new Dog();
}
else
{
return new Cat();
}
}
}
配置文件的差别:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" >
<!-- 配置工厂Bean,该Bean负责产生其他的Bean -->
<bean id="beingFactory" class="config.BeingFactory"/>
<bean id="dog" class="entity.Dog" factory-bean="beingFactory" factory-method="getBeing">
<constructor-arg value="dog"/>
<property name="msg" value="狗"/>
</bean>
<bean id="cat" class="entity.Cat" factory-bean="beingFactory" factory-method="getBeing">
<constructor-arg value="cat"/>
<property name="msg" value="猫"/>
</bean>
</beans>
静态工厂方法和实例工厂方法的异同:
- 配置实例工厂创建Bean,必须将实例工厂配置成Bean实例;而配置静态工厂创建Bean,则无需配置工厂Bean。
- 配置实例工厂方法创建Bean必须使用factory-bean属性确定工厂Bean;配置静态工厂方法创建Bean,使用class元素确定静态工厂类。
- 都需要使用factory-method属性指定产生Bean实例的工厂方法。
- 工厂方法如果需要参数,都是用<constructor-arg.../>元素指定参数值。
- 普通的设值注入都使用<property.../>元素确定参数。