使用構造器創建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.../>元素確定參數。