关于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日

相关文章

  • 哔哩哔哩如何自定义视频操作面板 哔哩哔哩自定义视频操作面板的方法

    哔哩哔哩如何自定义视频操作面板 在哔哩哔哩上,用户可以自定义视频操作面板,以满足个人需求。自定义视频操作面板的方法如下: 方法一:通过网页端设置 打开哔哩哔哩官网,在登录后进入个人中心页面 在个人中心页面,点击「设置」选项进入设置页面 在设置页面,点击「播放器设置」选项 在播放器设置页面,可以看到「视频操作面板布局」选项 点击「视频操作面板布局」选项,可以看…

    other 2023年6月25日
    00
  • Windows Azure 网站上的 WebSocket 简介

    Windows Azure 网站上的 WebSocket 简介的完整攻略 WebSocket是一种在Web浏览器和服务器之间进行双向通信的技术。它允许服务器主动向客户端发送消息,而不需要客户端发起请求。本文将提供Windows Azure网站上的WebSocket简介的完整攻略,包括以下内容: WebSocket的基本概念 Windows Azure网站上的…

    other 2023年5月6日
    00
  • ASP.NET Core MVC 过滤器(Filter)

    ASP.NET Core MVC 过滤器(Filter)攻略 过滤器(Filter)是ASP.NET Core MVC中的一个重要概念,它允许我们在请求处理过程中插入自定义逻辑。过滤器可以用于处理请求前后的操作,例如身份验证、日志记录、异常处理等。本攻略将详细介绍ASP.NET Core MVC过滤器的使用方法,并提供两个示例说明。 过滤器的类型 ASP.N…

    other 2023年8月20日
    00
  • 连载3:利用 matlab计算卷积

    利用Matlab计算卷积的完整攻略 卷积是信号处理中的一种重要操作,它可以用于信号滤波、信号去噪、图像处理等领域。Matlab是一种强大的数学计算软件,可以方便地进行卷积计算。本文将为您提供一份详细的利用Matlab计算卷积的完整攻略,包括卷积的基本概念、使用方法和两个示例说明。 卷积的基本概念 卷积是一种数学运算,它是两个函数之间的一种运算。在信号处理中,…

    other 2023年5月5日
    00
  • MySQL group by对单字分组序和多字段分组的方法讲解

    MySQL中的group by语句是用于对数据进行分组的,可以对一列或多列进行分组。下文将详细讲解MySQL group by对单个字段和多个字段进行分组的方法。 单个字段分组 假设我们有一个学生成绩表,表结构如下: id name subject score 1 Tom Math 80 2 Lily English 90 3 Tom English 85 …

    other 2023年6月25日
    00
  • springBoot项目配置文件加载优先级及同配置覆盖问题详解

    springBoot的配置文件加载优先级及同配置覆盖问题是一个比较常见的问题,特别对于初学者来说,容易造成困扰。本文将详细讲解springBoot中配置文件加载优先级及同配置覆盖问题的详细攻略,并且提供两个示例说明。 配置文件的加载优先级 springBoot的配置文件有以下几种类型: application.properties application.y…

    other 2023年6月25日
    00
  • 赌你会懵的C语言指针进阶数组场景解析

    下面我来详细讲解“赌你会懵的C语言指针进阶数组场景解析”的完整攻略。 概述 在C语言中,数组是非常常用的数据类型。但是对于数组的理解,不仅要理解数组的基本概念,还要深入理解数组和指针的关系。本文将通过两条示例来解析C语言指针进阶数组场景,并教会你如何正确地理解和使用指针和数组。 示例1:指针数组 假设我们有一个学生结构体,并且需要定义一个数组来存储多个学生的…

    other 2023年6月25日
    00
  • Opencv检测多个圆形(霍夫圆检测,轮廓面积筛选)

    Opencv是一种广泛使用的开源计算机视觉和机器学习库,可以实现许多图像处理和计算机视觉任务。其中,霍夫圆检测算法是Opencv中检测圆形的经典算法,常用于检测图像中的圆形物体。本文将详细探讨如何使用霍夫圆检测算法和轮廓面积筛选的方法来检测多个圆形,并提供两个示例说明。 准备工作 在使用Opencv进行圆形检测之前,需要进行以下准备工作: 导入Opencv库…

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