在spring中Bean创建有三种方式.
- 直接通过spring调用相对应的构造函数创建对象
- 静态的工厂方法
- 实例的工厂方法
第一种是我们最常用的方式,这里就不论述了.主要说明下静态的工厂方法和实例的工厂方法如何配置。
package mislay;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TestBean bean1 = (TestBean) context.getBean("testBean1");
bean1.sayHello();
TestBean bean2 = (TestBean) context.getBean("testBean2");
bean2.sayHello();
TestBean bean3 = (TestBean) context.getBean("testBean3");
bean3.sayHello();
}
}
package mislay;
public class TestBean {
private TestBean(String hello) {
this.s = hello;
}
public static TestBean newInstance(String hello) {
return new TestBean(hello);
}
public static TestBean newInstance() {
return new TestBean("hello");
}
private String s;
public void sayHello() {
System.out.println(s);
}
}
package mislay;
public class TestBeanFactory {
public TestBean getTestBean() {
return TestBean.newInstance("大家好");
}
public static TestBean getTestBeanByStaticMethod() {
return TestBean.newInstance("再一次大家好");
}
}
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="testBean1" class="mislay.TestBean" factory-method="newInstance" /> <bean id="testBean2" class="mislay.TestBean" factory-bean="helloBeanFactory1" factory-method="getTestBean" /> <bean id="helloBeanFactory1" class="mislay.TestBeanFactory"></bean> <bean id="testBean3" class="mislay.TestBeanFactory" factory-method="getTestBeanByStaticMethod"></bean> </beans>
代码很简单,静态的工厂方法分别在TestBean和TestBeanFactory中各一个.其中TestBeanFactory中还有一个实例的工厂方法.所有的工厂方法都返回一个TestBean实例.
注意在spring配置文件中id为testBean1何testBean3都利用了静态工厂方法.而testBean2则是利用了实例工厂方法。从这几个配置中不难看出:
- factory-method针对的是方法名,如果factory-bean属性没有出现,那么则是利用的class属性配置的类的静态方法
- 如果factory-method和factory-bean同时出现,那么则是利用的这个class属性配置的类的实例方法
- 不管是实例方法和静态方法都共同有个缺点:不能带参数
对于实例工厂方法不能传参的问题可以通过配置不同实例,注入不同的参数,然后引用所需要的实例接达到目的。但是静态工厂方法就无能为力了。