Spring源码解析之Bean的生命周期

Spring源码解析之Bean的生命周期

在 Spring 容器启动时,会加载配置文件中的 bean 定义信息并通过反射机制创建 bean 实例,然后将这些 bean 实例化、初始化,最后将这些 bean 注册到 Spring 容器中,供外部调用。这个过程就是 Spring 容器管理 bean 的生命周期。在本文中,我们将探索 Spring 容器如何管理 bean 的生命周期。

1. bean 的生命周期

bean 的生命周期经过以下阶段:

  1. 实例化 (Instantiation)
  2. 属性赋值 (Populate properties)
  3. 初始化 (Initialization)
  4. 销毁 (Destruction)

下面我们将介绍这些阶段。

1.1 实例化

根据 bean 配置信息,Spring 容器会使用反射机制实例化一个 bean 对象。可以使用构造函数实例化对象,也可以使用工厂方法实例化对象。例如,下面的配置使用构造函数实例化对象:

<bean id="exampleBean" class="com.example.ExampleBean"/>

可以使用工厂方法实例化对象:

<bean id="exampleBean" factory-method="createInstance" class="com.example.ExampleBeanFactory"/>

其中,ExampleBeanFactory 是一个工厂类,createInstance 是工厂类中的工厂方法。

1.2 属性赋值

在实例化 bean 后,Spring 容器会调用 setter 方法设置 bean 的属性值。可以通过 XML 配置文件、Java 配置方式或自动扫描等方式进行属性注入。例如,下面的配置设置属性值:

<bean id="person" class="com.example.Person">
    <property name="name" value="张三" />
    <property name="age" value="20" />
</bean>

在上面的配置中,Person 类有两个属性 nameage,通过 <property> 元素设置属性值。

1.3 初始化

在属性赋值完成后,Spring 容器会调用 InitializingBean 接口中的 afterPropertiesSet() 方法或 @PostConstruct 注解标注的方法执行 bean 的初始化。可以在初始化方法中完成一些准备工作。例如,下面的代码是一个初始化方法:

public class ExampleBean implements InitializingBean {

    private String name;

    private int age;

    ...

    @Override
    public void afterPropertiesSet() throws Exception {
        // 执行初始化操作
        ...
    }
}

或者,使用 @PostConstruct 注解标注初始化方法:

public class ExampleBean {

    private String name;

    private int age;

    ...

    @PostConstruct
    public void init() {
        // 执行初始化操作
        ...
    }
}

1.4 销毁

在容器关闭时,Spring 容器会调用 DisposableBean 接口中的 destroy() 方法或 @PreDestroy 注解标注的方法销毁 bean。

例如,下面的代码是销毁方法的示例:

public class ExampleBean implements DisposableBean {

    private String name;

    private int age;

    ...

    @Override
    public void destroy() throws Exception {
        // 执行销毁操作
        ...
    }
}

或者,使用 @PreDestroy 注解标注销毁方法:

public class ExampleBean {

    private String name;

    private int age;

    ...

    @PreDestroy
    public void destroy() {
        // 执行销毁操作
        ...
    }
}

2. 示例说明

我们通过示例来说明 bean 生命周期的过程。

首先,在 src/main/java/com/example 目录下新建 Person.java 文件,内容如下:

package com.example;

public class Person {

    private String name;

    private int age;

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

    public void setAge(int age) {
        this.age = age;
    }

    public void sayHello() {
        System.out.println("Hello, I'm " + name + ", " + age + " years old.");
    }
}

然后,在 src/main/resources 目录下新建 applicationContext.xml 文件,内容如下:

<bean id="person" class="com.example.Person">
    <property name="name" value="张三" />
    <property name="age" value="20" />
</bean>

接下来,在 src/main/java/com/example 目录下新建 Main.java 文件,内容如下:

package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = context.getBean("person", Person.class);
        person.sayHello();
        ((ClassPathXmlApplicationContext) context).close();
    }
}

运行 Main 类,控制台输出:

Hello, I'm 张三, 20 years old.

在这个示例中,Person 类有两个属性 nameage,在 applicationContext.xml 中通过 <property> 元素设置属性值。在 Main 类中,通过 ApplicationContext 加载 applicationContext.xml 配置文件,并从中获取 Person 实例,调用 sayHello() 方法输出信息。在程序结束时,使用 close() 方法关闭容器,销毁 bean。

除了 XML 配置方式,还可以使用注解方式或 Java 配置方式构建 bean。例如,下面的代码是使用注解方式构建 bean:

package com.example;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.stereotype.Component;

@Component
public class ExampleBean {

    private String name;

    private int age;

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

    public void setAge(int age) {
        this.age = age;
    }

    @PostConstruct
    public void init() {
        System.out.println("Initializing ExampleBean...");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("Destroying ExampleBean...");
    }
}

使用 Java 配置方式构建 bean:

package com.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public ExampleBean exampleBean() {
        return new ExampleBean();
    }
}

我们可以在项目中使用不同的方式来构建 bean,并了解它们的生命周期信息,从而更好地理解 Spring 容器对 bean 的管理。

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

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

相关文章

  • spring+hibernate 两种整合方式配置文件的方法

    下面是“spring+hibernate两种整合方式配置文件的方法”的完整攻略。 1. 环境准备 在开始之前,你需要确保已经安装好了以下环境: JDK 1.8+ Maven Spring Framework 5.x Hibernate 5.x MySQL Database 2. 整合方式一:基于Spring数据访问模块的整合 步骤一:创建Maven项目 在M…

    Java 2023年5月20日
    00
  • 详解springboot springsecuroty中的注销和权限控制问题

    详解 Spring Boot Spring Security 中的注销和权限控制问题 前言 Spring Boot Spring Security 是一个非常常用的技术组合,它们可以提供很好的安全性,和身份认证、授权、限制等重要功能,但是在实际开发中可能会遇到注销和权限控制相关的问题,需要我们了解并深入研究。 正文 注销功能 注销功能是常见的需求,用户在退出…

    Java 2023年6月3日
    00
  • SpringBoot+MyBatisPlus+MySQL8实现树形结构查询

    下面我给你详细讲解“SpringBoot+MyBatisPlus+MySQL8实现树形结构查询”的完整攻略。 一、概述 在开发中,树形结构的数据查询操作是比较常见的,而使用SpringBoot+MyBatisPlus+MySQL8来实现树形结构的查询则是一种比较简单直观的方法。 二、步骤 1. 创建数据库表 首先,我们需要在MySQL8中创建一个数据表来存储…

    Java 2023年5月20日
    00
  • Java包机制及javadoc详解

    下面是“Java包机制及javadoc详解”的完整攻略。 一、Java包机制 Java中的包(Package)是将相关的类组成的一种单元,它的作用就是解决了相同类名的问题,也方便了其他开发人员的使用。在Java中,每一个类都必须属于一个包,没有包名的类默认属于默认包。 1.1 包的定义 我们可以使用package关键字定义一个包,它必须放在类定义之前。语法格…

    Java 2023年5月20日
    00
  • 通过java备份恢复mysql数据库的实现代码

    下面我将详细讲解通过Java备份恢复MySQL数据库的实现代码的完整攻略。 1. 环境准备 1.1 安装MySQL 首先需要安装好MySQL数据库,可以在https://dev.mysql.com/downloads/mysql/下载最新版本的MySQL Community Server。 1.2 安装Java 在使用Java备份恢复MySQL数据库之前,需…

    Java 2023年5月19日
    00
  • java学习笔记之eclipse+tomcat 配置

    下面是Java学习笔记之Eclipse+Tomcat配置的完整攻略。 步骤一:下载和安装Eclipse和Tomcat Eclipse是一个集成开发环境(IDE),可以用于编写和调试Java代码,Tomcat是一个开源的Java Servlet容器,可以用于运行Java Web应用程序。 可以从官方网站上下载最新版本的Eclipse和Tomcat。 Eclip…

    Java 2023年6月2日
    00
  • 关于Java类的构造方法详解

    关于Java类的构造方法详解 类是Java的基本元素,而构造方法则是在创建类的实例时执行的一种特殊方法。本文将详细介绍Java类构造方法的相关知识以及使用技巧。 构造方法的定义 构造方法是一种特殊的方法,它的目的是在创建类的实例时执行一些初始化操作。一般情况下,构造方法和类的名称相同,不过它们没有返回值类型。在创建类的实例时,编译器会自动选择相应的构造方法并…

    Java 2023年5月26日
    00
  • Android 中利用 ksoap2 调用 WebService的示例代码

    当我们需要在Android应用中调用网络服务时,可以通过使用Web Service来实现。在Android中使用ksoap2库可以简单地实现Web Service调用。下面是使用ksoap2库在Android中调用WebService的步骤示例。 步骤一:导入ksoap2库文件 将ksoap2的jar文件拷贝到Android项目的libs目录下,并在buil…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部