在面向对象(OOP)的程序中,想要使用某个对象就要先实例化该对象。同样,在spring中,想要使用容器中的Bean。也需要先实例化。下面对三种实例化的方式进行总结。

构造器实例化

指的是Spring容器通过Bean对应类的默认无参构造方法来实例化Bean。这也是最为常用的一种方式。

  1. 在Eclipse(不会安装的可以评论。单独出一篇)中创建一个web项目,在项目的lib目录下加入Spring支持和依赖的JAR包(这里采用的是传统的开发,现在公司大都采用Maven进行JAR包的统一管理,会更加的方便和高效)
  2. 在项目的src目录下,创建一个包(名称随意。只是讲解知识点。不做统一要求)。在包里创建一个类
public class User {
  public void add() {
    System.out.println("add()---------");
  }
}

3.在包下创建spring的配置文件。定义一个id为user,并通过class属性指定对应的实现类

<bean class="org.sang.User" id="user"/>

4.在包下创建测试类

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user = (User) context.getBean("user");
    System.out.println(user);

5.控制台的输出结果

指定 spring boot bean 实例化顺序 spring bean的实例化_xml

静态工厂实例化

与第一种相比,此时的Bean配置中的class属性所指的不再是Bean的实现类。而是静态工厂类,同时还需要实验factory-method来指定所创建的静态工厂的方法。

1:在项目中创建一个Bean类

public class User2 {
  public void add() {
    System.out.println("add2()---------");
  }
}

2:创建一个工厂类,并创建一个静态方法

public class User2Factory {
  public static User2 getInstance() {
    return new User2();
  }
}

3:创建配置文件

<bean id="user2" class="org.sang.User2Factory" factory-method="getInstance"/>

4:创建测试类

@Test
  public void test2() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    User2 user = (User2) context.getBean("user2");
    user.add();
  }

5:运行结果:

指定 spring boot bean 实例化顺序 spring bean的实例化_实例化_02

实例工厂实例化

小伙伴们看了静态工厂创建bean实例肯定都觉得很麻烦,事实上还有比静态工厂更麻烦的写法,那就是通过实例工厂来创建bean实例。实例工厂,顾名思义,就是我们工厂中的方法不是静态的。

1.创建一个Bean类

@Test
public void test3() {
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  User3 user = (User3) context.getBean("user3");
  user.add();
}

2.创建工厂类,创建一个非静态方法

public class User3Factory {
  public User3 getUser3() {
    return new User3();
  }
}

3.编写spring的配置文件

<bean class="org.sang.User3Factory" id="user3Factory"/>
<bean id="user3" factory-bean="user3Factory" factory-method="getUser3"/>

4.创建测试类

@Test
public void test3() {
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  User3 user = (User3) context.getBean("user3");
  user.add();
}

5.运行结果

指定 spring boot bean 实例化顺序 spring bean的实例化_xml_03

总结:最常用和最推荐的是第一种方式。其他两种需要了解,面试会问!