1. 通过静态方法实例化一个bean,实例化出来的bean的类型对应于静态方法的返回类型,这地点不同于普通的bean
(1) 静态方法无参数:
<bean id="thefmbean" class="springtest.FactoryMethodBean" factory-method="getInstance" />
(2) 静态方法有一个参数
<bean id="thenamedfmbean" class="springtest.FactoryMethodBean"
factory-method="getNamedInstance">
<constructor-arg value="China" />
</bean>
这里<constructor-arg value="China" />表示为静态方法参数的值
(3) 对于(2)实例化出来的bean,再进行属性set
<bean id="thenamedfmbean" class="springtest.FactoryMethodBean"
factory-method="getNamedInstance">
<constructor-arg value="China" />
<property name="id" value="20" />
</bean>
2. 对一个已经实例化的bean,得到其普通方法返回的对象,参数方式与1完全相同
<bean id="duke" class="springtest.Juggler">
<constructor-arg value="15" />
</bean>
<bean id="employee" factory-bean="duke" factory-method="getYourEmployee">
<constructor-arg value="Mike" />
<property name="id" value="18" />
</bean>
其中duke为以普通方式实例化出来的bean,通过factory-method得到的是Employee的一个对象
package springtest;
public interface Performer
{
void perform() throws PerformanceException;
}
package springtest;
public class FactoryMethodBean implements Performer
{
private String name = "Hello";
private int id;
private FactoryMethodBean()
{
}
public void setId(int id)
{
this.id = id;
}
private static class StaticFactoryMethodBean
{
static FactoryMethodBean instance = new FactoryMethodBean();
}
public static FactoryMethodBean getInstance()
{
return StaticFactoryMethodBean.instance;
}
public static FactoryMethodBean getNamedInstance(String tmpName)
{
StaticFactoryMethodBean.instance.name = tmpName;
return StaticFactoryMethodBean.instance;
}
@Override
public void perform() throws PerformanceException
{
System.out.println("FactoryMethodBean.name = " + name);
}
public String getNewName()
{
return "new name";
}
}
package springtest;
public class Juggler implements Performer
{
private int beanBags = 3;
public Juggler()
{
}
public Juggler(int beanBags)
{
this.beanBags = beanBags;
}
@Override
public void perform() throws PerformanceException
{
System.out.println("Juggling " + beanBags + " beanBags");
}
public String getMyName()
{
return "My Name";
}
public String getYourName(String yourName)
{
return "Your name is " + yourName;
}
public Employee getYourEmployee(String adName)
{
return new Employee(adName);
}
}
package springtest;
public class Employee
{
private int id;
private String name;
public Employee(String name)
{
this.name = name;
}
public Employee()
{
}
public void setId(int id)
{
this.id = id;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
}
(1) 静态方法无参数:
<bean id="thefmbean" class="springtest.FactoryMethodBean" factory-method="getInstance" />
(2) 静态方法有一个参数
<bean id="thenamedfmbean" class="springtest.FactoryMethodBean"
factory-method="getNamedInstance">
<constructor-arg value="China" />
</bean>
这里<constructor-arg value="China" />表示为静态方法参数的值
(3) 对于(2)实例化出来的bean,再进行属性set
<bean id="thenamedfmbean" class="springtest.FactoryMethodBean"
factory-method="getNamedInstance">
<constructor-arg value="China" />
<property name="id" value="20" />
</bean>
2. 对一个已经实例化的bean,得到其普通方法返回的对象,参数方式与1完全相同
<bean id="duke" class="springtest.Juggler">
<constructor-arg value="15" />
</bean>
<bean id="employee" factory-bean="duke" factory-method="getYourEmployee">
<constructor-arg value="Mike" />
<property name="id" value="18" />
</bean>
其中duke为以普通方式实例化出来的bean,通过factory-method得到的是Employee的一个对象
package springtest;
public interface Performer
{
void perform() throws PerformanceException;
}
package springtest;
public class FactoryMethodBean implements Performer
{
private String name = "Hello";
private int id;
private FactoryMethodBean()
{
}
public void setId(int id)
{
this.id = id;
}
private static class StaticFactoryMethodBean
{
static FactoryMethodBean instance = new FactoryMethodBean();
}
public static FactoryMethodBean getInstance()
{
return StaticFactoryMethodBean.instance;
}
public static FactoryMethodBean getNamedInstance(String tmpName)
{
StaticFactoryMethodBean.instance.name = tmpName;
return StaticFactoryMethodBean.instance;
}
@Override
public void perform() throws PerformanceException
{
System.out.println("FactoryMethodBean.name = " + name);
}
public String getNewName()
{
return "new name";
}
}
package springtest;
public class Juggler implements Performer
{
private int beanBags = 3;
public Juggler()
{
}
public Juggler(int beanBags)
{
this.beanBags = beanBags;
}
@Override
public void perform() throws PerformanceException
{
System.out.println("Juggling " + beanBags + " beanBags");
}
public String getMyName()
{
return "My Name";
}
public String getYourName(String yourName)
{
return "Your name is " + yourName;
}
public Employee getYourEmployee(String adName)
{
return new Employee(adName);
}
}
package springtest;
public class Employee
{
private int id;
private String name;
public Employee(String name)
{
this.name = name;
}
public Employee()
{
}
public void setId(int id)
{
this.id = id;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
}