关于Spring启动流程及Bean生命周期梳理

关于Spring启动流程及Bean生命周期梳理

Spring启动流程

在Spring应用程序启动时,Spring框架会完成一系列的初始化工作。具体而言,Spring启动流程如下:

  1. 加载配置文件:Spring框架首先会读取应用程序中的配置文件。对于基于XML的配置来说,通常是读取applicationContext.xml文件。对于基于Java的配置来说,通常是读取使用@Configuration注解标记的类。

  2. 创建Bean Definition:每个在配置文件或Java类中定义的Bean都会被转化成相应的Bean Definition对象。

  3. 创建Bean实例:Spring框架根据Bean Definition对象创建Bean实例。这时会调用Bean类的构造函数,实例化出一个Bean实例。

  4. 装配Bean:Spring框架会根据配置文件或Java类中的依赖关系,装配出相应的Bean对象。

  5. 初始化Bean:Spring框架使用initMethod配置或@PostConstruct注解指定的初始化方法来执行Bean的初始化工作。

  6. 使用Bean:Spring框架将创建好的Bean对象注入到其它Bean中,或将其暴露给外部使用。

  7. 销毁Bean:当Spring框架检测到应用程序将要关闭时,会调用Bean的销毁方法。

Bean生命周期

在Spring框架中,Bean的生命周期可以分为以下7个阶段:

  1. 实例化:创建一个Bean实例。

  2. 属性赋值:将配置文件或Java类中定义的属性注入到Bean实例中。

  3. BeanPostProcessor前置处理器:在Bean实例化后、属性赋值前,执行自定义的前置处理器。

  4. 初始化:执行初始化方法,可以是initMethod属性配置,也可以是使用@PostConstruct注解标记的方法。

  5. BeanPostProcessor后置处理器:在Bean初始化完成后,执行自定义的后置处理器。

  6. 使用:将Bean对象注入到其它Bean中,或将其暴露给外部使用。

  7. 销毁:当Spring框架检测到应用程序将要关闭时,执行Bean的销毁方法,可以是destroyMethod属性配置,也可以是使用@PreDestroy注解标记的方法。

示例说明

示例一

假设我们要创建一个UserService类,在其中注入一个UserDao类,并在UserService类中通过initMethod方法初始化用户数据。具体实现如下:

public class User {
    private int id;
    private String name;
    private int age;
    //...getter和setter方法省略
}

public interface UserDao {
    User getUser(int id);
}

public class UserDaoImpl implements UserDao {
    @Override
    public User getUser(int id) {
        //...查询数据库中id为id的用户
        return new User();
    }
}

public class UserService {
    private UserDao userDao;
    private List<User> userList;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void init() {
        userList = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            userList.add(userDao.getUser(i));
        }
    }
}

我们在配置文件中将UserDao注入到UserService中,并指定UserService中的init方法为初始化方法。具体配置如下:

<bean id="userDao" class="com.example.UserDaoImpl" />

<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao" />
    <property name="initMethod" value="init" />
</bean>

在应用程序启动时,Spring框架会按照上述流程,创建UserService对象,并通过它的init方法初始化用户数据。

示例二

假设我们要创建一个自定义的BeanPostProcessor前置处理器,在Bean初始化前,打印出Bean的名称和类名。具体实现如下:

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Before initialization, beanName=" + beanName + ", beanClass=" + bean.getClass().getName());
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

在配置文件中,我们将该处理器注入到Spring容器中。具体配置如下:

<bean id="myBeanPostProcessor" class="com.example.MyBeanPostProcessor" />

在应用程序启动时,Spring框架会自动执行该处理器,并在每个Bean初始化前打印出Bean的名称和类名。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Spring启动流程及Bean生命周期梳理 - Python技术站

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

相关文章

  • 打开Excel表格时出现死机的解决方法

    解决Excel表格打开时出现死机的方法攻略 当打开Excel表格时出现死机问题时,可以尝试以下方法来解决: 1. 检查系统和软件要求 首先,确保你的计算机满足Excel的系统和软件要求。检查以下几个方面: 操作系统要求:确保你的计算机操作系统与Excel的兼容。Excel通常支持最新的Windows和Mac操作系统版本。 硬件要求:检查你的计算机硬件是否满足…

    other 2023年8月6日
    00
  • 微信小程序自定义tab实现多层tab嵌套功能

    selectedTab: ‘X’, selectedSubTab: ‘1’ }, handleTabChange(event) { const { tab } = event.currentTarget.dataset; this.setData({ selectedTab: tab }); }, handleSubTabChange(event) { co…

    other 2023年7月28日
    00
  • MySQL 字符类型大小写敏感

    MySQL 字符类型大小写敏感攻略 MySQL 是一个常用的关系型数据库管理系统,它提供了多种字符类型用于存储和处理数据。其中一个重要的特性是字符类型的大小写敏感性。在本攻略中,我们将详细讲解 MySQL 字符类型大小写敏感的相关知识,并提供两个示例说明。 1. 字符类型大小写敏感性的概念 在 MySQL 中,字符类型的大小写敏感性指的是对于字符串比较操作是…

    other 2023年8月16日
    00
  • C语言的编程之美之内存函数

    C语言的编程之美之内存函数 前言 在C语言中,内存函数是常用的函数之一,它们用于操作内存,包括内存拷贝、内存移动、内存比较等等。本文将介绍几个常用的内存函数,并提供相应实例。 内存拷贝函数 – memcpy() memcpy()函数用于将某一段内存区域的内容拷贝到另一段内存区域中,可以用于拷贝任意类型的数据到任意位置。其函数原型如下: void *memcp…

    other 2023年6月27日
    00
  • 逆水寒九灵什么属性重要 基本属性对九灵加成数据测试介绍

    当然,下面是关于逆水寒九灵基本属性加成数据测试的完整攻略,包含两个示例说明: 基本属性对九灵加成数据测试介绍 首先,选择一个九灵,例如「风灵」作为测试对象。 确定九灵的基本属性,包括攻击力、防御力、生命值等。 创建一个测试角色,并记录下其基本属性。 使用测试角色攻击一个固定的目标,记录下造成的伤害。 将测试角色装备上九灵「风灵」,并记录下装备后的基本属性。 …

    other 2023年10月17日
    00
  • 4G内存只显示3G是怎么回事,另外1G内存在哪?

    4G内存只显示3G是怎么回事,另外1G内存在哪? 当你购买一台计算机或移动设备时,通常会标明其内存容量。例如,4G内存表示该设备具有4GB(千兆字节)的内存容量。然而,当你查看操作系统或系统信息时,可能会发现它只显示3GB的可用内存,而不是4GB。这是因为系统保留了一部分内存用于其他用途。 内存管理和系统保留 操作系统需要管理内存以便运行各种应用程序和系统进…

    other 2023年8月2日
    00
  • 从零开始学习SQL查询语句执行顺序

    很抱歉,作为文本模型,我无法以标准的markdown格式回答您的问题。但是,我可以为您提供一份详细的攻略,包含从零开始学习SQL查询语句执行顺序的完整步骤和两个示例说明。 从零开始学习SQL查询语句执行顺序 步骤1:了解SQL查询语句的基本结构 SQL查询语句通常由多个关键字和子句组成,包括SELECT、FROM、WHERE、GROUP BY、HAVING和…

    other 2023年10月17日
    00
  • mysql 直接拷贝data 目录下文件还原数据的实现

    MySQL直接拷贝data目录下文件还原数据的实现攻略 有时候,我们可能需要将MySQL数据库从一个服务器迁移到另一个服务器,或者需要还原已备份的数据。在这种情况下,直接拷贝MySQL的data目录下的文件是一种快速且方便的方法。下面是实现这一过程的详细攻略: 停止MySQL服务:首先,停止正在运行的MySQL服务,以确保数据文件不会被修改或覆盖。 备份原始…

    other 2023年10月18日
    00
合作推广
合作推广
分享本页
返回顶部