【Spring】05 生命周期之初始化回调

news2024/11/19 9:33:04

文章目录

      • 1. 回调是什么
      • 2. 初始化回调
        • 2.1 实现 InitializingBean 接口
        • 2.2 配置 init-method
      • 3. 执行顺序
      • 4.优势及应用
      • 总结

在 Spring 框架中,生命周期回调(Lifecycle Callbacks)是一种强大的机制,它允许我们在 Spring 容器中的 Bean 生命周期的不同阶段执行特定的操作。这为我们提供了一种灵活的方式来管理和控制 Bean 的生命周期。

1. 回调是什么

在 Spring 中,每个 Bean 都有一个生命周期,它从被创建到被销毁的过程中经历了不同的阶段。生命周期回调就是在这些阶段执行特定方法的机制。

Spring 提供了两种生命周期回调的方式:初始化回调和销毁回调。

在这里插入图片描述

发现它是不是有点像模版方法设计模式!

本节将介绍 初始化回调,下一节介绍 销毁回调。

2. 初始化回调

Spring 的初始化回调机制提供了一种在 Bean 实例化后,依赖注入之后执行特定逻辑的方式。这种机制带来了一些好处,使得开发者能够更灵活地管理和定制 Bean 的初始化过程。

接下来我们从以下两种方式来实现初始化回调

2.1 实现 InitializingBean 接口

1)配置 Bean

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="springDemo" class="org.example.cheney.SpringDemo">
        <constructor-arg value="SpringDemo"/>
    </bean>
</beans>

2)创建 Spring 并实现 InitializingBean

package org.example.cheney;

import org.springframework.beans.factory.InitializingBean;

public class SpringDemo implements InitializingBean {
    private String name;

    public SpringDemo(String name) {
        this.name = name;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Bean " + name + "初始化啦(By InitializingBean)");
    }
}

3)创建启动类

package org.example.cheney;

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

public class App {
    public static void main(String[] args) {
        String location = "applicationContext.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(location);
    }
}

输出结果:

在这里插入图片描述

2.2 配置 init-method

1)配置 Bean

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="springDemo" class="org.example.cheney.SpringDemo" init-method="initMethod">
        <constructor-arg value="SpringDemo"/>
    </bean>
</beans>

2)创建 Spring 并创建 initMethod()

package org.example.cheney;

public class SpringDemo {
    private String name;

    public SpringDemo(String name) {
        this.name = name;
    }

    public void initMethod() {
        System.out.println("Bean " + name + "初始化啦(By init-method)");
    }
}

3)创建启动类

package org.example.cheney;

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

public class App {
    public static void main(String[] args) {
        String location = "applicationContext.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(location);
    }
}

输出结果:

在这里插入图片描述

此处还可以设定 beans 层面的默认方法,如下图

在这里插入图片描述

3. 执行顺序

在 Spring 中,初始化回调的执行顺序是:实现 InitializingBean 接口的 afterPropertiesSet 方法 -> 配置 init-method 。

在这里插入图片描述

Spring的初始化回调机制提供了一种在Bean实例化后,依赖注入之后执行特定逻辑的方式。这种机制带来了一些好处,使得开发者能够更灵活地管理和定制Bean的初始化过程。

4.优势及应用

  • 统一的初始化逻辑: 通过实现 InitializingBean 接口或配置 init-method,可以将 Bean 的初始化逻辑集中在一个统一的位置,提高代码的可读性和维护性。
  • 依赖注入后的进一步处理: 在 Bean 的初始化回调中,你可以确保所有的依赖都已经注入完成,然后执行一些进一步的处理逻辑,例如资源的加载、状态的检查等。
  • 框架集成: 某些框架或库可能需要在应用程序启动时进行初始化,通过Spring 的初始化回调,你可以很方便地将这些框架或库的初始化逻辑集成到你的应用程序中。
  • 资源管理: 在初始化回调中执行资源的初始化,比如打开数据库连接、建立网络连接等,确保资源的正确获取和配置。
  • 灵活的配置方式: 你可以选择使用 XML 配置、Java 配置或注解方式来定义初始化回调,根据个人或团队的偏好来进行选择,提供了灵活性。
  • 与Spring生命周期其他阶段的配合: 初始化回调与 Spring 生命周期的其他阶段(例如 Bean 的销毁阶段)配合使用,使得整个 Bean 的生命周期管理更加完善。
  • 在初始化回调中抛出异常: 如果在初始化回调中发生异常,Spring 会捕获并将其转换为BeanInitializationException,从而阻止应用程序的正常启动,提高了对初始化过程的安全性。

总结

生命周期回调(Lifecycle Callbacks)是 Spring 框架中一个强大的特性,它为开发者提供了在 Bean 的生命周期不同阶段执行特定操作的灵活方式。通过初始化回调,我们能够更好地管理和控制应用程序中的组件。在实际开发中,合理使用生命周期回调可以提高应用程序的稳定性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里发布高质量图像转视频AI模型I2VGen-XL

受益于扩散模型快速发展&#xff0c;视频合成近年来取得了显著进步。然而&#xff0c;在语义准确性、清晰度和时空连续性方面仍存在挑战。这主要源于缺乏良好对齐的文本视频数据以及视频的复杂结构&#xff0c;使得模型难以同时确保卓越的语义和质量。 阿里团队提出了一种级联…

怎么把图片转文字?这几个图片转文字方法一定要知道!

怎么把图片转文字&#xff1f;无论是从书籍、网络还是社交媒体上&#xff0c;我们经常需要从图片中提取文字来进行复制、编辑或翻译。手动操作耗时耗力&#xff0c;效率低下&#xff0c;那么怎么把图片转文字呢&#xff1f;今天我将介绍三种不同的方法来实现图片转文字。 图片转…

DevOps搭建(六)-安装Maven详细步骤

1、官网下载 下载地址&#xff1a; Maven – Download Apache Maven 2、上传压缩包到服务器 把下载好的压缩包上传到服务器上。 3、解压压缩包 解压压缩包到安装目录/usr/local/ tar -zxvf apache-maven-3.9.3-bin.tar.gz -C /usr/local/ 切换到/usr/local目录下ls命令看…

持续集成交付CICD:GitLabCI操作Harbor仓库

目录 一、实验 1.GitLabCI操作Harbor仓库 二、问题 1.gitlab-runner连接docker daemon报错 一、实验 1.GitLabCI操作Harbor仓库 &#xff08;1&#xff09;修改GitLabCI共享库代码并提交到mater CI.yaml .pipelineInit:tags:- buildstage: .prevariables:GIT_CHECKOUT: …

代码随想录第三十三天(一刷C语言)|斐波那契数爬楼梯使用最小花费爬楼梯

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 动态规划步骤&#xff1a; 确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 一、斐波那契数 思路&#xff1a;参考carl文档 1、dp[i]的定义为&#xff…

FPGA巩固基础:秒表的设计

设计要求&#xff1a; 6位8段数码管&#xff0c;低三位显示毫秒计数&#xff0c;最高位显示分钟&#xff0c;其余两位显示秒计数。 开始案件与暂停按键&#xff0c;复位按键直接全部归零。 扩展部分&#xff1a;每计满一次&#xff0c;led移位一次。 框图设计&#xff1a; …

Android BluetoothAdapter 使用(二)

Android BluetoothAdapter 使用(二) 本篇文章主要讲下蓝牙设备的配对. 1: 蓝牙设备列表展示 下 面是蓝牙设备adapter的代码: package com.test.bluetooth;import android.bluetooth.BluetoothDevice; import android.content.Context; import android.view.LayoutInflater;…

Netty—NIO万字详解

文章目录 NIO基本介绍同步、异步、阻塞、非阻塞IO的分类NIO 和 BIO 的比较NIO 三大核心原理示意图NIO的多路复用说明 核心一&#xff1a;缓存区 (Buffer)Buffer类及其子类Buffer缓冲区的分类MappedByteBuffer类说明&#xff1a; 核心二&#xff1a;通道 (Channel)Channel类及其…

解决vue3 动态引入报错问题

之前这样写的&#xff0c;能使用&#xff0c;但是有警告 警告&#xff0c;查了下&#xff0c;是动态引入的问题&#xff0c;看到说要用glob 然后再我的基础上&#xff0c;稍微 改了下&#xff0c;就可以了&#xff1a; 最后打印了下&#xff0c;modules[../../components/flowc…

Javascript高频面试题

系列文章目录 文章目录 系列文章目录前言1.JavaScript常见数据类型null 和 undefind区别symbol&#xff08;ES6新增&#xff09;、bigInt&#xff08;ES10新增&#xff09; 2.JavaScript判断数据类型的方式3. 和 区别&#xff0c;分别在什么情况使用&#xff1f;4.变量声明 va…

c#winform学生信息管理系统sqlserver

vs2022开发 数据库sqlserver和c#winform结合设计的学生信息管理系统 一&#xff0e;需求分析 1.1设计可视化界面&#xff0c;具有身份验证功能&#xff0c;需要登录时输入账号及密码。 1.2学生用户能够注册自己的账号&#xff0c;添加自己的基本注册信息&#xff1a;学号、密…

JAVA的关键字、标识符和命名规范

目录 一、Java 二、关键字 三、标识符 四、命名规范 一、Java Java是一种面向对象的高级编程语言&#xff0c;最初由Sun Microsystems公司于1995年发布。它的特点是可移植性强、可靠性高、安全性好以及简单易学。Java是一种跨平台的语言&#xff0c;它可以在不同的操作系统…

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

背景 在项目过程中&#xff0c;有时候你需要调用非C#编写的DLL文件&#xff0c;尤其在使用一些第三方通讯组件的时候&#xff0c;通过C#来开发应用软件时&#xff0c;就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。 步骤 1. 创建一个CSharp…

java web系统的常见安全问题

一、背景 java开发的系统在发布到互联网后都需要进行安全扫描&#xff0c;本文主要总结开发web系统需要注意的与系统安全相关的问题。因为在做需求开发时&#xff0c;很少产品会将系统安全的因素考虑在内&#xff0c;总觉得实现个需求很简单&#xff0c;就是一些页面&#xff0…

Leetcode—131.分割回文串【中等】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—131.分割回文串 算法思想 实现代码 class Solution { public:bool isPalindrome(string s, int left, int right) {while(left < right) {if(s[left] ! s[right--]) {return false;}}return true;}vector<vector…

云服务配置docker镜像容器以及常用操作命令

首先通过ssh进入云服务器。如何ssh进入云服务器。 简单讲解一下docker中镜像和容器&#xff0c;打个比方&#xff0c;镜像相当于印钱的那个模板&#xff0c;容器相当于从模板上拓下来的钱&#xff0c;不同的模板可以印出不同的钱。但容器被修改后也可以变成新的镜像&#xff0…

flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032

原因分析&#xff0c;启动yarn-session.sh&#xff0c;会向resourcemanager的端口8032发起请求&#xff1a; 但是一直无法请求到8032端口&#xff0c;触发重试机制会不断尝试 备注&#xff1a;此问题出现时&#xff0c;我的环境ambari部署的HA 高可用hadoop&#xff0c;三个节点…

Amortized Bootstrapping of LWE:使用 BFV 打包处理

参考文献&#xff1a; [AP13] Alperin-Sheriff J, Peikert C. Practical bootstrapping in quasilinear time[C]//Annual Cryptology Conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 2013: 1-20.[MS18] Micciancio D, Sorrell J. Ring packing and amortized F…

电源适配器老化测试方法分享 电源测试系统助力老化测试

电源适配器老化测试是指对适配器进行高负荷、长时间的运行测试&#xff0c;从而评估电源适配器的性能、稳定性和可靠性。通过老化测试可以检测电源适配器长时间的使用情况&#xff0c;从而指导适配器的设计和研发&#xff0c;提高电源适配器的质量。由于老化测试要求长时间运行…

DVGO 代码阅读

BBx 的大小范围是 根据 相机的 位姿来构建的&#xff0c;会刚好 Cover 相机的移动范围&#xff0c;相当于 StreetSurf 里面的 close-range 的部分&#xff0c;代码在compute_bbox_by_cam_frustrm_unbounded 这个函数里面&#xff1a; xyz_min, xyz_max _compute_bbox_by_cam_f…