实例化 Bean

实例化 Bean就是创建 Bean 对象,在 Spring 容器中,实例化 Bean 有三种方式

  • 构造函数实例化
  • 静态工厂方法实例化
  • 实例工厂方法实例化

构造函数实例化

通过构造函数实例化 Bean 是最简单的方式。Spring 容器会通过调用 Bean 对应类中默认的构造函数进行实例化 Bean

现有一个 Bean 定义如下

1
2
3
4
5
6
7
8
public class Person {
private String name;
private int age;

public Person(){
System.out.println("使用构造方法进行实例化....");
}
}

在 Spring 中的配置如下

1
<bean class="me.zyp.entity.Person" id="person"/>

可通过如下方式获取对应 Bean 对象

1
2
3
4
5
6
@Test
public void constructorInitTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = applicationContext.getBean("person",Person.class);
System.out.println(person);
}

静态工厂方法实例化

该方法可以通过提供一个静态工厂来实例化 Bean

1
2
3
4
5
public class StaticPersonFactory {
public static Person createInstance() {
return new Person();
}
}

该工厂在 Spring 中的配置如下

1
<bean class="me.zyp.factory.StaticPersonFactory" factory-method="createInstance" id="staticPersonFactory"/>

具体配置属性含义如下:

  • class:静态工厂的全类名
  • factory-method:静态工厂中用于创建对象的静态方法

可通过如下方式获取对应 Bean 对象

1
2
3
4
5
6
@Test
public void staticFactoryTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = applicationContext.getBean("staticPersonFactory", Person.class);
System.out.println(person);
}

实例工厂方法实例化

与通过静态工厂方法实例化不同,该方法会通过调用对应工厂的实例化对象指定的非静态方法来创建一个新的 bean

1
2
3
4
5
public class InstancePersonFactory {
public Person createPerson() {
return new Person();
}
}

该工厂在 Spring 中的配置如下

1
2
3
<bean class="me.zyp.factory.InstancePersonFactory" id="instancePersonFactory"/>

<bean factory-bean="instancePersonFactory" factory-method="createPerson" id="instancePerson"/>

具体配置属性含义如下:

  • factory-bean:对应实例工厂的 bean 定义
  • factory-method:工厂中用于实例化 bean 的方法名

可通过如下方式获取对应 Bean 对象

1
2
3
4
5
6
@Test
public void instanceFactoryTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = applicationContext.getBean("instancePerson",Person.class);
System.out.println(person);
}

特点

  • 在 Bean 定义中 factory-bean 属性用于指定实例化工厂
  • factory-bean 属性与 class 属性同时出现时,class 属性不生效
  • 当只使用 class 时,则 class 属性用于指定静态工厂,且此时 factory-method 对应的方法必须为静态方法
  • 当使用 factory-bean 属性指定实例工厂时,factory-method 对应的方法必须为非静态方法