在 Spring 框架中,Bean 实例化的方式有三种:构造方法实例化、静态工厂方法实例化和实例工厂方法实例化。
1. 构造方法实例化
通过在 Spring 配置文件中定义 Bean 元素的方式实例化 Bean,可以使用默认构造方法或带参数的构造方法。如果使用默认构造方法,只需要在 Bean 元素中指定 Bean 的类名;如果使用带参数的构造方法,需要在 Bean 元素中添加一个 constructor-arg 元素,指定其对应的参数。
<bean id="user" class="com.example.User">
<constructor-arg value="Tom"/>
<constructor-arg value="20"/>
</bean>
在上面的例子中,使用了 User 的带参数的构造方法来实例化 Bean,同时通过 constructor-arg 元素指定了其对应的参数值。
-
在 Bean 元素中,id 属性指定了该 Bean 的唯一标识符,class 属性指定了该 Bean 的类型。
-
constructor-arg 元素用于指定构造方法的参数值,value 属性用于指定参数的值。可以使用 index 属性或者 type 属性来指定带参数的构造方法的参数顺序。
<bean id="user" class="com.example.User">
<constructor-arg index="0" value="Tom"/>
<constructor-arg index="1" value="20"/>
</bean>
在上述示例中,使用 index 属性来指定构造方法的参数顺序。
<bean id="user" class="com.example.User">
<constructor-arg type="java.lang.String" value="Tom"/>
<constructor-arg type="int" value="20"/>
</bean>
在上述示例中,使用 type 属性来指定构造方法的参数类型。
需要注意的是,如果使用默认构造方法来实例化 Bean,则只需要在 Bean 元素中指定 Bean 的类名即可,不需要使用 constructor-arg 元素指定参数。
2. 静态工厂方法实例化
静态工厂方法实例化是 Spring 中实例化 Bean 的一种方式。通常情况下,需要定义一个静态的工厂类,该类中包含一个或多个静态方法用来创建 Bean 实例。示例代码如下:
<bean id="user" class="com.example.User" factory-bean="UserFactory" factory-method="createUser"/>
在上述示例中,id 属性指定了该 Bean 的唯一标识符,class 属性指定了该 Bean 的类型,factory-bean 属性指定了工厂类的名称,factory-method 属性指定了工厂方法的名称。
以下是 UserFactory 类的代码:
public class UserFactory {
public static User createUser() {
return new User("Tom", 20);
}
}
在上述代码中,createUser 方法是一个静态的工厂方法,用于创建 User 实例。注意要使得该方法能够被 Spring 调用,需要将其定义为 public 和 static 方法。
需要注意的是,工厂类和工厂方法都必须是 public 的,并且工厂方法必须是 static 的。此外,在使用静态工厂方法实例化 Bean 时,Bean 的构造函数可以是私有的。
3. 实例工厂方法实例化
实例工厂方法实例化是 Spring 中实例化 Bean 的一种方式。与静态工厂方法实例化不同,使用实例工厂方法实例化时需要先创建一个工厂实例,然后通过该实例调用实例方法来创建 Bean 实例。示例代码如下:
<bean id="userFactory" class="com.example.UserFactory"/>
<bean id="user" factory-bean="userFactory" factory-method="createUser"/>
在上述示例中,id 属性指定了该 Bean 的唯一标识符,class 属性为 UserFactory 类的全限定名,factory-bean 属性指定了工厂实例的名称,factory-method 属性指定了调用工厂实例方法时要使用的方法名称。
以下是 UserFactory 类的代码:
public class UserFactory {
public User createUser() {
return new User("Tom", 20);
}
}
在上述代码中,createUser 方法是一个实例方法,用于创建 User 实例。注意要使得该方法能够被 Spring 调用,需要将其定义为 public 的。