Spring支持使用如下三种方法创建Bean:
- 调用构造器创建Bean
- 调用静态工厂方法创建Bean
- 调用实例工厂方法创建Bean
构造器
这是最常见的,框架底层调用bean的无参数构造器。这种情况下,class助兴是必需的。之前写的都是这种方式。
静态工厂方法创建Bean
class也必须指定,但不是指定实现类,而是静态工厂类,这个工厂会创建bean实例。另外还需要factory-method指定用哪个方法创建bean实例,返回值即为实例。
接口与实现类如下:
public interface Being { public void testBeing(); }
public class Dog implements Being { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void testBeing() { // TODO Auto-generated method stub System.out.println("a dog!"); } }
静态工厂如下:
public class BeingFactory { public static Being getBegin(String arg){ if(arg.equalsIgnoreCase("dog")){ return new Dog(); }else{ return new Cat(); } } }
xml:
<bean id="dog" class="com.cm.BeingFactory" factory-method="getBegin"> <constructor-arg value="dog"/> <property name="name">AAA</property>
调用的代码没有任何区别,获得ApplicationContext实例ctx,getBean。
这里我们看到,xml中指定了静态工厂的实现类,使用的方法,以及静态工厂方法的参数。Spring不再负责创建Bean,但依然可以管理创建好的bean,包括注入关系,管理生命周期。
实例工厂方法创建Bean
与静态唯一不同就是需要用factory-bean指定工厂实例,而不是class指定静态工厂。当然这么做的话,就需要在xml中配置一下工厂了。工厂代码如下:
public class Factory public Person getPerson(String ethnic) { if(ethnic.equalsIgnoreCase("chin")) { return new Chinese();} else{ return new American(); } }
xml如下:
<bean id="factory" class="com.cm.Factory"/> <bean id="Chinese" factory-bean="factory" factory-method="getPerson"> <constructor-arg value="chin"/> </bean>
时间: 2024-10-27 19:19:24