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日

相关文章

  • SpringMVC 异常处理机制与自定义异常处理方式

    当使用 Spring MVC 开发应用时,异常处理是非常重要的一部分。由于操作系统错误、数据库错误等各种问题可能会导致应用程序出现异常,因此在应用程序中正确处理异常是重要的。本文将介绍 Spring MVC 中的异常处理机制及如何自定义异常处理方式。 SpringMVC 异常处理机制 Spring MVC 异常处理机制的核心是将异常抛到控制器的外部并处理。S…

    Java 2023年5月27日
    00
  • Spring Boot四大神器之CLI的具体使用

    Spring Boot CLI是Spring Boot的一个命令行工具,它可以帮助我们快速创建、运行和调试Spring Boot应用程序。在本文中,我们将详细讲解Spring Boot CLI的具体使用,包括如何安装、如何创建和运行Spring Boot应用程序等。 安装 在使用Spring Boot CLI之前,我们需要先安装它。以下是安装Spring B…

    Java 2023年5月15日
    00
  • 部署Java在服务器端的EJB组件的方法

    下面我将详细讲解如何部署Java在服务器端的EJB组件。 什么是EJB组件 EJB是一个JavaEE的框架,可以让Java应用程序分布式运行。EJB组件是一组特殊的Java类,被装配成JavaEE应用程序,在容器中运行。 准备工作 在部署EJB组件之前,需要确定以下几点: 首先需要有一个JavaEE应用程序,可以使用Maven或Gradle构建 确认应用程序…

    Java 2023年5月26日
    00
  • struts1之简单mvc示例_动力节点Java学院整理

    介绍 本文将介绍如何使用Struts 1框架通过一个简单的MVC示例进行开发。本示例是基于动力节点Java学院整理的教学资料。 环境准备 在开始开发之前,需要准备好以下环境: Java Development Kit (JDK) 1.8或以上 Eclipse IDE for Java EE Developers Tomcat 8.5或以上 Struts 1.…

    Java 2023年5月20日
    00
  • 获取Java的MyBatis框架项目中的SqlSession的方法

    获取Java的MyBatis框架项目中的SqlSession对象的方法,可以从以下几个方面进行介绍。 方法一:通过MyBatis提供的SqlSessionFactory创建SqlSession对象 首先,在Java的MyBatis框架项目中,需要首先通过MyBatis提供的SqlSessionFactory创建SqlSession对象。可以通过以下步骤实现:…

    Java 2023年5月20日
    00
  • 详解Reactor如何优雅Exception异常处理

    详解Reactor如何优雅Exception异常处理 在使用Reactor进行响应式编程的过程中,异常处理是一个非常重要的部分。优雅地处理异常,可以让代码更加健壮和可靠。本文将详细讲解Reactor如何优雅地处理异常。 直接捕获异常 Reactor提供了onError方法来处理异常。当流中出现异常时,可以直接调用onError方法来捕获异常。 Flux.ju…

    Java 2023年5月27日
    00
  • Spring Boot Shiro在Web应用中的作用详解

    Spring Boot Shiro 在 Web 应用中的作用详解 简介 Shiro 是一个用于 Java 应用的轻量级安全框架,提供了认证、授权、加密以及会话管理等功能,可以方便地集成进 Spring Boot 项目中使用和配置。本文将详细介绍在 Web 应用中使用 Spring Boot Shiro 的过程和作用。 步骤 1. 添加依赖项 在 pom.xm…

    Java 2023年5月20日
    00
  • Idea运行单个main方法,不编译整个工程的问题

    当我们在使用 IntelliJ IDEA 进行 Java 开发时,有时候需要在项目中单独运行某个 Java 类的 main 方法,而不想编译整个工程。下面是完整的攻略,包含以下步骤: 步骤一:创建运行配置(Run configuration) 首先,在 IDEA 的工具栏中点击“Run” ->“Edit configurations…”进入运行配置…

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