Bean标签范围配置、生命周期与实例化的三种方式

本文最后更新于:1 年前

在 bean 标签可以通过 scope 属性指定对象的的作用域:

  • scope="singleton":表示当前bean是单例模式(默认饿汉模式,Spring容器初始化阶段就会完成此对象的创建;当在bean标签中设置 lazy-init=”true”变为懒汉模式)。
  • scope=”prototype”:表示当前bean为非单例模式,每次通过Spring容器获取此bean的对象时都会创建一个新的对象。

Bean生命周期方法:

  • init-method:指定类中的初始化方法。初始化方法在构造器执行之后执行。
  • destroy-method:指定类中销毁方法。销毁方法在对象销毁之前执行

Bean标签配置

基本配置

用于配置对象交由Spring 来创建。
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

基本属性:

  • id:Bean 实例在 Spring 容器中的唯一标识。
  • class:Bean 的全限定名称。

范围配置

scope:指对象的作用范围,取值如下:

取值范围 说明
singleton 默认值,单例的
prototype 多例的
request WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
session WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global session WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么global与Session相当
  1. 当 scope 的取值为【singleton】时

    Bean的实例化个数:1个

    Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例。(即饿汉模式,可通过在bean标签中设置 lazy-init="true" 变为懒汉模式,加载时不自动实例化)

    Bean的生命周期:

    • 对象创建:当应用加载,创建容器时,对象就被创建了。
    • 对象运行:只要容器在,对象一直活着。
    • 对象销毁:当应用卸载,销毁容器时,对象就被销毁了。

  2. 当scope的取值为【prototype】时

    Bean的实例化个数:多个

    Bean的实例化时机:当调用 getBean() 方法时实例化 Bean。

    Bean的生命周期:

    • 对象创建:当使用对象时,创建新的对象实例。
    • 对象运行:只要对象在使用中,就一直活着。
    • 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了。

Bean生命周期配置

  • init-method:指定类中的初始化方法名称。初始化方法在构造器执行之后执行。
  • destroy-method:指定类中销毁方法名称。销毁方法在对象销毁之前执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Book {

private int bookId;
private String bookName;

//初始化方法:在创建当前类对象时调用的方法,进行一些资源准备工作,如对属性进行初始化
public void init(){
System.out.println("-------init");
this.bookId = 1;
this.bookName = "初始值";
}

//销毁方法:在Spring容器销毁对象时调用此方法,进行一些资源回收性的操作,如关闭通道与连接
public void destory(){
System.out.println("-------destory");
}
}
1
<bean id="book" class="cc.gaojie.pojo.Book" scope="prototype"init-method="init" destroy-method="destory" ></bean>

Bean实例化三种方式

  • 无参构造方法实例化
  • 工厂静态方法实例化
  • 工厂实例方法实例化

无参构造方法实例化

它会根据默认无参构造方法来创建类对象,如果 bean 中没有默认无参构造函数,将会创建失败。

1
<bean id="userDao" class="cc.gaojie.dao.impl.UserDaoImpl" >

工厂静态方法实例化

工厂的静态方法返回Bean实例。

1
2
3
4
5
6
public class StaticFactoryBean {

public static UserDao createUserDao(){
return new UserDaoImpl();
}
}
1
<bean id="userDao" class="com.itheima.factory.StaticFactoryBean" factory-method="createUserDao" />

工厂实例方法实例化

工厂的非静态方法返回Bean实例。

1
2
3
4
5
6
public class DynamicFactory {

public UserDao getUserDao() {
return new UserDaoImpl();
}
}
1
2
<bean id="factory" class="cc.gaojie.factory.DynamicFactory" ></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>