详解Spring 中 Bean 的生命周期

yizhihongxing

下面我来详细讲解一下 Spring 中 Bean 的生命周期的完整攻略。

1. Bean 的生命周期概述

Bean 的生命周期可以被分为以下几个阶段:

  1. 实例化阶段:在容器中创建一个 Bean 的实例,一般是通过 Java 的反射机制实现;
  2. 属性赋值阶段:容器通过 setter 方法或者直接赋值,将 Bean 的属性值填充到 Bean 实例中;
  3. 初始化阶段:Bean 进行一些初始化操作,比如调用自定义的初始化方法等;
  4. 使用阶段:容器将 Bean 实例提供给应用程序使用;
  5. 销毁阶段:Bean 生命结束,容器对 Bean 执行销毁操作。

下面我将详细介绍每个阶段的执行过程以及示例说明。

2. 实例化阶段

Bean 的实例化过程是由 IoC 容器负责的,一般使用 Java 的反射机制来实现。在实例化过程中,容器会调用 Bean 的无参构造器来创建一个 Bean 的实例,然后将 Bean 的属性值进行填充。

示例:

public class User {

    public User() {
        System.out.println("User 实例化");
    }

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
<bean id="user" class="com.example.User">
    <property name="name" value="张三" />
</bean>

在上面的示例中,当容器实例化 id 为 user 的 Bean 时,会调用 User 的无参构造器来创建一个 Bean 实例,之后再将属性 name 设置为 "张三"。

3. 属性赋值阶段

属性赋值阶段是在 Bean 实例化之后进行的。容器会通过调用 Bean 的 setter 方法或者直接赋值的方式,将 Bean 的属性值填充到 Bean 实例中。

示例:

public class Car {

    private String brand;

    public Car() {
        System.out.println("Car 实例化");
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }
}
<bean id="car" class="com.example.Car">
    <property name="brand" value="BMW" />
</bean>

在上面的示例中,当容器实例化 id 为 car 的 Bean 时,会将属性 brand 的值设置为 "BMW"。

4. 初始化阶段

在完成属性赋值之后,容器会开始初始化 Bean,执行 Bean 的自定义初始化操作,如调用 Bean 的初始化方法等。

示例:

public class Animal {

    private String name;

    public Animal() {
        System.out.println("Animal 实例化");
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void init() {
        System.out.println("Animal 初始化");
    }
}
<bean id="animal" class="com.example.Animal" init-method="init">
    <property name="name" value="狗" />
</bean>

在上面的示例中,当容器实例化 id 为 animal 的 Bean 时,会将属性 name 的值设置为 "狗",之后再调用 init() 方法。

5. 使用阶段

在初始化过程完成之后,Bean 开始进入使用阶段。容器会将 Bean 实例提供给应用程序使用。

示例:

public class Fruit {

    private String name;

    public Fruit() {
        System.out.println("Fruit 实例化");
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void eat() {
        System.out.println("吃 " + name);
    }
}
<bean id="fruit" class="com.example.Fruit">
    <property name="name" value="苹果" />
</bean>

在上面的示例中,当容器实例化 id 为 fruit 的 Bean 时,会将属性 name 的值设置为 "苹果"。应用程序可以通过调用 Bean 的 eat() 方法来使用。

6. 销毁阶段

Bean 的生命周期最终会结束,这个阶段是由容器负责的。当容器决定销毁 Bean 时,会调用 Bean 的自定义销毁方法进行处理。

示例:

public class Book {

    private String name;

    public Book() {
        System.out.println("Book 实例化");
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void init() {
        System.out.println("Book 初始化");
    }

    public void destroy() {
        System.out.println("Book 销毁");
    }
}
<bean id="book" class="com.example.Book" init-method="init" destroy-method="destroy">
    <property name="name" value="Java 编程思想"/>
</bean>

在上面的示例中,当容器决定销毁 id 为 book 的 Bean 时,会调用 Bean 的 destroy() 方法。

总结

上面就是 Spring 中 Bean 的生命周期的完整攻略。无论是实例化、属性赋值、初始化、使用还是销毁,容器都会在相应的阶段执行相应的操作。对于开发者来说,需要知道 Bean 的生命周期模型,才能更加深入的理解 Spring 框架的基本原理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring 中 Bean 的生命周期 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Android可筛选的弹窗控件CustomFiltControl

    CustomFiltControl是一款基于Android平台的可筛选的弹窗控件,能够极大地提高用户选择筛选条件的效率和便捷性。下面将为大家提供CustomFiltControl的完整攻略。 一、控件使用说明 1.1 导入依赖库 首先,在您的Android项目中的build.gradle文件中添加以下依赖: implementation ‘com.githu…

    other 2023年6月27日
    00
  • OpenCV-Python 理解特征 | 三十六

    OpenCV-Python 理解特征|三十六的完整攻略 本文将为您提供 OpenCV-Python 理解特征|三十六的完整攻略,包括介绍、特征提取和两个示例说明。 介绍 在计算机视觉领域,特征是指图像或视频中的可识别的局部结构,如角点、边缘、斑点等。特征提取是计算机视觉中的重要任务之一,可以用于图像匹配、目标跟踪、三维重建等应用。OpenCV-Python …

    other 2023年5月6日
    00
  • 64位下无法运行32位程序的解决方法 提示未指定提供程序,也没有指派的默认提供程序

    64位下无法运行32位程序的解决方法 在64位操作系统下,有时候会遇到无法运行32位程序的问题。这通常是因为缺少32位程序所需的运行环境或者配置不正确。下面是解决这个问题的完整攻略。 步骤一:安装32位运行环境 首先,你需要安装32位运行环境,以便能够在64位操作系统上运行32位程序。具体的步骤如下: 打开控制面板,点击\”程序\”或\”程序和功能\”。 在…

    other 2023年7月28日
    00
  • Android NDK 开发中 SO 包大小压缩方法详解

    Android NDK 开发中 SO 包大小压缩方法详解 在 Android Native Development Kit (NDK) 开发中,编译生成的动态链接库库(也称为SO包)体积较大是一个常见的问题,这会导致应用包的体积过大,影响应用的下载和安装速度。在本文中,我们将分享一些有用的技巧,帮助你在发布前有效地压缩SO包,减小应用的体积。 压缩SO包的方…

    other 2023年6月26日
    00
  • 关于javascript作用域的常见面试题分享

    关于JavaScript作用域的常见面试题分享 JavaScript作用域是指变量、函数和对象的可访问范围。在面试中,经常会涉及到与JavaScript作用域相关的问题。下面是一些常见的面试题以及它们的详细解答。 1. 什么是作用域? 作用域是指在程序中定义变量的区域,它决定了变量的可见性和生命周期。JavaScript中有全局作用域和局部作用域两种。 全局…

    other 2023年7月29日
    00
  • PHP根据IP地址获取所在城市具体实现

    PHP根据IP地址获取所在城市具体实现攻略 1. 获取IP地址 首先,我们需要获取用户的IP地址。在PHP中,可以使用$_SERVER[‘REMOTE_ADDR’]来获取用户的IP地址。例如: $ip = $_SERVER[‘REMOTE_ADDR’]; 2. 发送请求获取城市信息 接下来,我们需要向IP地址查询接口发送请求,以获取IP地址对应的城市信息。有…

    other 2023年7月30日
    00
  • 链接库动态链接库详细介绍

    链接库动态链接库详细介绍 什么是链接库? 链接库是一些可重复使用的程序代码和数据的集合,它们在运行期间被共享。链接库可以分为静态链接库和动态链接库两种。 静态链接库 静态链接库在编译时被链接到程序中,且相对路径是确定的。当程序执行时,它们被加载到内存中并驻留在进程的地址空间中,直到进程终止。静态链接库的好处是,程序不需要在运行时查找和加载库,因此它们的执行速…

    other 2023年6月26日
    00
  • Linux(CentOS)常用操作指令(一)

    Linux(CentOS)常用操作指令(一) Introduction 在使用Linux(CentOS)操作系统时,我们经常需要使用到一些常用的指令,本篇文章将会介绍一些基础的操作指令,以供大家参考。 Command list 以下是一些常用的Linux(CentOS)操作指令: 1. cd cd指令是切换当前目录的命令。比如我们要进入”/home”目录,只…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部