Spring学习之实例化bean的三种方式
概述
学习一下Spring IOC bean的三种实例化方式。
默认构造方法实例化bean
最常用的初始化bean
方式, 必须提供默认构造方法
public class Person {
private String name;
private Integer age;
public Person() {
System.out.println("这是一个无参构造函数");
}
public Person(String name) {
this.name = name;
System.out.println(name+"参数的构造函数");
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
System.out.println("带有名字="+name+"和年龄="+age+"参数的构造函数");
}
}
bean.xml
<bean id="person" class="com.maple.Person"></bean>
<bean id="personWithParam" class="com.maple.Person">
<constructor-arg name="name" value="枫叶"/>
</bean>
<bean id="personWirhParams" class="com.maple.Person">
<constructor-arg name="name" value="枫叶"/>
<constructor-arg name="age" value="23"/>
</bean>
静态工厂初始化bean
当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method
属性来指定创建bean
实例的工厂方法。Spring将调用此方法返回实例对象,就此而言,跟通过普通构造器创建类实例没什么两样。
public class MyBeanFactory {
/**
* 创建实例
* @return
*/
public static UserService createService(){
return new UserServiceImpl();
}
public static UserService createService(String name){
return new UserServiceImpl(name);
}
public static UserService createService(String name,int age){
return new UserServiceImpl(name,age);
}
}
bean.xml
<bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService"></bean>
<bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService">
<constructor-arg name="name" value="枫叶"/>
</bean>
<bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService">
<constructor-arg name="name" value="枫叶"/>
<constructor-arg name="age" value="23"/>
</bean>
实例工厂初始化bean
与使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位于另外一个bean中(即下面的MyBeanFactory .java),容器将调用该bean的工厂方法来创建一个新的bean实例。
为使用此机制,class属性必须为空,而factory-bean 属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定。
必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。
/**
* 实例工厂,所有方法非静态
*
*/
public class MyBeanFactory {
/**
* 实例化工厂
*/
public UserService createService(){
return new UserServiceImpl();
}
/**
* 实例化工厂1
*/
public static UserService createService(String name){
return new UserServiceImpl(name);
}
/**
* 实例化工厂2
*/
public static UserService createService(String name,int age){
return new UserServiceImpl(name,age);
}
}
bean.xml
<!-- 创建工厂实例 -->
<bean id="myBeanFactoryId" class="com.maple.MyBeanFactory"></bean>
<!-- 获得userservice
* factory-bean 确定工厂实例
* factory-method 确定普通方法
-->
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">
<constructor-arg name="name" value="枫叶"/>
</bean>
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">
<constructor-arg name="name" value="枫叶"/>
<constructor-arg name="age" value="23"/>
</bean>