1.使用构造器创建Bean实例
如果不采用构造注入,spring底层会调用Bean类的无参构造器来创建实例,因此要求该Bean提供无参构造器,在这种情况下,class元素时必需的,class属性的值就是Bean实例的实现类,spring对Bean实例的所有属性执行默认初始化,即所有基本类型的值初始化为0或false;所有的引用类型的值初始化为null。
接下来,BeanFactory会根据配置文件决定依赖关系,先实例化被依赖的Bean实例,然后为Bean注入依赖关系,最后将一个完整的Bean实例返回给程序。
如果采用构造注入,spring容器将使用带对应参数的构造器来创建Bean实例,spring调用构造器传入的参数即可用于初始化Bean的实例变量,最后也将一个完整的Bean实例返回给程序。
2.使用静态工厂方法创建Bean
使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是Bean实例的实现类,而是静态工厂类,spring通过该属性知道由哪个工厂类来创建Bean实例。还需要使用factory-method属性来指定静态工厂方法。
如果静态工厂方法需要参数,则使用<constructor-arg.../>
元素传入。
public class Dog{
private String msg;
setter方法
public void testBeing(){
System.out.println(msg + "狗爱吃肉");
}
}
public class Being Factory{
public static Being getBeing(){
return new Dog();
}
}
<bean id="dog" class="...BeingFactory" factory-method="getBeing">
<property name="msg" value="小狗狗"/>
</bean>
使用静态工厂方法创建实例时必须提供工厂类,工厂类包含产生实例的静态工厂方法。
3.调用实例工厂方法创建Bean
配置静态工厂方法使用class指定静态工厂类,而配置实例工厂方法则使用factory-bean指定工厂实例。
使用实例工厂方法时,配置Bean实例的<bean.../>
元素无须class属性,因为spring容器不再直接实例化该Bean,spring容器仅仅调用实例工厂的工厂方法,工厂方法创建Bean实例。
public class American{
public String sayHello(String name){
return name + ",Hello";
}
}
public class PersonFactory{
public American getAmerican(){
return new American();
}
}
<bean id="personFactory" class="...PersonFactory"/>
<bean id="american" factory-bean="personFactory" factory-method="getAmerican">