spring的InitializingBean接口、DisposableBean接口

2023-11-16

本文介绍spring中与bean有关的一些接口

afterPropertiesSet

afterPropertiesSet() 方法是 Spring 框架中的一个初始化方法,主要用于在 Bean 实例化和属性注入完成后执行一些初始化操作。
具体来说,当 Spring 容器实例化一个 Bean 并完成其属性注入后,会检查该 Bean 是否实现了 InitializingBean 接口。如果实现了该接口,则在实例化和属性注入完成后,Spring 容器会自动调用 afterPropertiesSet() 方法,以便执行一些额外的初始化操作。
通常情况下,afterPropertiesSet() 方法可以用于执行一些需要在 Spring Bean 初始化期间完成的操作,例如:初始化数据库连接池、初始化缓存等等。通过实现 InitializingBean 接口,可以让这些初始化工作与 Bean 的创建和属性注入过程无缝衔接,从而简化了开发者的工作。
需要注意的是,afterPropertiesSet() 方法并不是强制要求实现的方法,如果不需要进行额外的初始化操作,也可以不实现该方法。此外,在 Spring Boot 等现代化的 Spring 应用程序中,通常采用注解的方式来进行初始化操作,而不是实现 InitializingBean 接口。例如,可以使用 @PostConstruct 注解来标注需要在 Bean 初始化完成后执行的方法。

例子:

public class MyDataSource implements DataSource, InitializingBean {

    private String url;
    private String username;
    private String password;
    private Connection connection;

    public void setUrl(String url) {
        this.url = url;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public Connection getConnection() throws SQLException {
        if (connection == null) {
            connection = DriverManager.getConnection(url, username, password);
        }
        return connection;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // 在 Bean 初始化完成后,执行一些初始化操作
        Class.forName("com.mysql.jdbc.Driver"); // 加载 MySQL 驱动程序
    }

    // 实现其他 DataSource 接口的方法...
}

在该示例中,MyDataSource 类实现了 InitializingBean 接口,并重写了 afterPropertiesSet() 方法。在该方法中,实现了加载 MySQL 驱动程序的操作,以便在后续的数据库连接操作中使用。
在 Bean 实例化和属性注入完成后,Spring 容器会自动调用 afterPropertiesSet() 方法,以便执行该类中的初始化操作。当该 Bean 被其他组件引用时,可以直接获取初始化完成的连接对象,而不需要手动加载 MySQL 驱动程序。这样可以让初始化操作与 Bean 的创建和属性注入过程无缝衔接,从而简化了开发者的工作。
需要注意的是,afterPropertiesSet() 方法中的初始化操作应该尽量简单,不应该包含过多的业务逻辑,以免影响应用程序的性能。此外,在初始化过程中,需要进行错误和异常处理,以便在出现错误或异常时,能够及时排查和解决问题。

这里要注意,@PostConstruct 注解是 JavaEE中常用的一个注解,用于标注一个方法,表示该方法需要在 Bean 实例化和属性注入完成后执行一些初始化操作。被@PostConstruct修饰的方法,会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。@PostConstruct在构造函数执行之后、init()方法执行之前执行。@PreDestroy在destroy()方法执行之后执行。

除了 InitializingBean 接口之外,还有一些类似的 Spring 接口,可以用于在 Spring Bean 初始化期间执行一些额外的操作。以下是一些常见的接口:
DisposableBean 接口:该接口定义了一个 destroy() 方法,用于在 Spring Bean 销毁时执行一些清理操作。与 InitializingBean 接口类似,当 Spring 容器检测到 Bean 实现了该接口时,会在销毁 Bean 之前调用 destroy() 方法。
以下是一个示例,演示了如何实现 DisposableBean 接口,在 Spring Bean 销毁时执行一些清理操作:

public class MyResource implements DisposableBean {

    private InputStream inputStream;

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    // 实现其他方法...

    @Override
    public void destroy() throws Exception {
        // 在 Spring Bean 销毁时,执行一些清理操作
        if (inputStream != null) {
            inputStream.close();
        }
    }
}

在该示例中,MyResource 类实现了 DisposableBean 接口,并重写了 destroy() 方法。在该方法中,实现了关闭 InputStream 对象的操作,以避免资源泄漏。当 Spring 容器销毁该 Bean 时,会自动调用 destroy() 方法,以便执行清理操作。
需要注意的是,destroy() 方法中的清理操作应该尽量简单,不应该包含过多的业务逻辑,以免影响应用程序的性能。此外,在清理操作中,需要进行错误和异常处理,以免出现错误或异常时导致应用程序崩溃。
除了实现 DisposableBean 接口之外,还可以通过注解的方式来标注需要在 Spring Bean 销毁时执行的方法。例如,可以使用 @PreDestroy 注解来标注需要在 Bean 销毁时执行的方法。这样可以在代码中更加直观地标识需要执行的清理操作。

beanNameAware

BeanNameAware 接口:该接口定义了一个 setBeanName() 方法,用于在 Spring Bean 实例化时获取该 Bean 的名称。当 Spring 容器检测到 Bean 实现了该接口时,会在实例化 Bean 之后调用 setBeanName() 方法。
BeanFactoryAware 接口:该接口定义了一个 setBeanFactory() 方法,用于在 Spring Bean 加载到 BeanFactory 后获取该 BeanFactory 的引用。当 Spring 容器检测到 Bean 实现了该接口时,会在将 Bean 加载到 BeanFactory 之后调用 setBeanFactory() 方法。
ApplicationContextAware 接口:该接口定义了一个 setApplicationContext() 方法,用于在 Spring Bean 实例化后获取该 Bean 所在的 ApplicationContext。当 Spring 容器检测到 Bean 实现了该接口时,会在实例化 Bean 和设置 Bean 属性之后、初始化 Bean 之前调用 setApplicationContext() 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring的InitializingBean接口、DisposableBean接口 的相关文章

  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 使用 HttpUrlConnection Android 将 base64 编码的图像发送到服务器

    我正在尝试使用 HttpUrlConnection 将 base64 编码的图像发送到服务器 我遇到的问题是大多数图像均已成功发送 但有些图像会生成 FileNotFound 异常 我的图像编码代码可以在下面找到 public static
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 哪个 Swing 布局管理器可以获得我想要的布局?

    我正在尝试按照这个模型制作一个基本的登录菜单 我决定将整个菜单放入 JPanel 中 以便在连接成功后我可以切换到另一个面板 所以我决定使用 Borderlayout 将标题放在北区 将连接按钮放在南区 我将边框布局的中心本身设置为面板 我
  • Spring3/Hibernate3/TestNG:有些测试给出 LazyInitializationException,有些则没有

    前言 我在单元测试中遇到了 LazyInitializationException 的问题 而且我很难理解它 正如你从我的问题中看到的那样Spring 中的数据库会话 https stackoverflow com questions 13
  • 将过滤器添加到 Eclipse 中的 Project Explorer

    我想向 Project Explorer 添加一个新的过滤器 以向用户隐藏一些在 Eclipse RCP 应用程序中自动创建的项目 到目前为止我已经找到了两个扩展点 org eclipse ui ide resourceFilters 允许
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • 如何拦截 REST 端点以接收所有标头?

    我当前的代码是 Path login RequestScoped public class LoginResource GET SecurityChecked public Response getUser HeaderParam AUTH
  • JFace ColumnWeigthData 导致父级增长

    我有一个 Eclipse RCP 应用程序 并且想要在TableViewer using ColumnWeigthData as ColumnLayoutData 问题是父表单 ScrolledForm在示例代码中 每当我布局表格时都会增加
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • Java:java.util.ConcurrentModificationException

    我正在制作 2D 目前正在研究用子弹射击 子弹是一个单独的类 所有项目符号都存储在称为项目符号的数组列表中 当它超出屏幕一侧 Exception in thread main java util ConcurrentModification
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 使用 secp256r1 曲线和 SHA256 算法生成 ECDSA 签名 - BouncyCastle

    我正在尝试使用带有 secp256r1 曲线 P256 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名 我也在使用 Bouncy Castle 库 下面的代码 public class MyTest param args pu
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • java.lang.ClassNotFoundException:com.fasterxml.jackson.core.JsonProcessingException

    我在用着templateRest发布User反对Rest Server但我遇到了以下错误 线程 main java lang NoClassDefFoundError 中出现异常 com fasterxml jackson core Jso
  • 如何用表达式语言获取布尔属性?

    如果我有一堂这样的课 class Person private int age public int getAge return age public boolean isAdult return age gt 19 我可以得到age像这样
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne

随机推荐

  • Taro安装、启动命令、创建项目、修改端口号以及如何在微信开发者工具内运行

    1 安装Taro开发工具 npm install g tarojs cli 或者yarn global add tarojs cli 使用npm可能会有一些报错的信息 建议使用cnpm安装 2 使用命令创建模板 taro init myAp
  • 教你如何基于Redis来实现高性能延时消息队列!

    最近在倒腾自建博客后端系统 需要用到延时任务的功能 但手头只有一套MySQL和Redis 如果搞一套MQ成本有点大 于是想着用redis实现延时消息队列 有些场景用数据库的定时扫表也能简单实现延时消息的功能 不过对于我这边的实际场景 比如计
  • C#学习笔记 任务操作

    利用线程 可以方便地进行异步操作 但是线程模型有一个缺点 就是无法处理返回值 要在不同线程之间传递数据比较麻烦 任务则解决了这个问题 完整代码在这里 https github com techstay csharp learning not
  • 流程控制和数组(下)

    文章目录 Java 类 Arrays Java 类 Arrays Java提供的Arrays类里包含的一些statics修饰的方法可以直接操作数组 这个Arrays类里包含了如下的几个static修饰的方法 static修饰的方法可以直接通
  • 【数据挖掘】数据清洗

    数据挖掘 数据清洗 数据挖掘一般流程 数据挖掘一般流程 需求分析 数据挖掘任务分类 1 预测 分类 回归 2 聚类 文档归类 3 关联性分析 购物篮分析 4 异常检测 信用卡欺诈 获取数据 sql linux 爬虫 数据清洗 主要 去重 缺
  • Halcon极坐标变换检测缺陷

    一 原图 二 通过极性变换拉直 三 检测缺陷 This example checks bottle necks for defects First the bottle is detected with basic morphology e
  • ARouter 之注解 @JvmField 和 @Autowired

    文章目录 1 定义 2 使用 3 源码分析 4 为什么 Autowired 要搭配 JvmFiled 同时使用 1 定义 在 Activity 进行数据传递一般都会通过 getIntent putxxx getxxx 方法 在 Fragme
  • 【华为OD机试真题 python】查找重复代码【2022 Q4

    题目描述 查找重复代码 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给定两行代码 字符串长度 1 lt length lt 100 由英文字母 数字和空格组
  • s2.ubuntu搭建s3c2440平台arm-linux-gcc交叉编译工具链安装+资源下载

    交叉编译工具包arm linux gcc 3 4 5 glibc 2 3 6 tar bz2 zip 蓝奏云 文件实际后缀是 bz2 下载后去掉 zip后缀 然后放入Ubuntu系统 具体步骤 1 复制交叉编译链的包到Ubuntu中 这里我
  • Spring学习(五):Spring中注入一些细节

    1 字面值 字面值 可用字符串表示的值 可以通过
  • Misc

    我可是黑客 用winehx打开 下拉到最后 moctf e4sy 1ma9e m1sc 假装安全 用kali的binwalk分离 打开记事本 mcfCrflyS1eot eul ld 扫扫出奇迹 用QR Research直接扫 或者用Ste
  • Linux 4G 通信实验

    目录 4G 网络连接简介 高新兴ME3630 4G 模块实验 ME3630 4G 模块简介 ME3630 4G 模块驱动修改 1 Linux内核添加代码 USB设备信息 2 Linux内核添加代码 添加ECM支持程序 3 配置使能Linux
  • 计算机怎么快速查找应用,win10系统如何快速查找应用?win10系统快速查找应用的方法...

    win10电脑经常会安装各种程序应用 因为没有添加到桌面 所以这个时候很难找到 如果一个一个程序查找很浪费时间 有什么快速查找应用的方法 针对此疑问 小编和大家说说win10系统快速查找应用的方法 具体方法如下 1 首先你要找到 开始菜单
  • Vue3+Element-Plus 实现表单中搜索功能 三五

    1 当用户在表单搜索框中 输入要搜索的用户名 点击搜索按钮后 查找到相对应的用户数据 2 实现搜索功能的步骤 2 1 首先 使用v model 指令 将文本输入框的数据与 data 中的数据做双向绑定 2 2 其次 为搜索按钮绑定单击事件
  • Java中Math类中的常用方法

    Java中Math类中的常用方法 代码实例 public class Demo1 Math public static void main String args System out println Math PI System out
  • 使用备份工具mysqldump备份数据库

    MySQL自带的备份工具mysqldump 可以很方便的对MySQL进行备份 通过该命令工具可以将数据库 数据表或全部的库导出为SQL脚本 便于该命令在不同版本的MySQL服务器上使用 例如 当需要升级MySQL服务器时 可以先使用mysq
  • Java 读取jar内包资源文件和读取jar包外资源文件

    Java 读取jar包内资源文件 读取jar 包内资源文件application properties InputStream appPropertiesInputStream ApplicationPropertiesHolder cla
  • U-Net 模型改进和应用场景研究性综述

    U Net综述 1 文章介绍 2 U Net介绍 3 结构改进 4 非结构改进 4 1 预处理 数据增强 4 2 训练 数据归一化 4 3 训练 激活函数 4 4 训练 损失函数 4 5 结构改进总结 5 U Net应用场景 5 1 视网膜
  • PAN和MS融和综述(pansharpening)

    PAN和MS融和综述 pansharpening 一 基于成分替代的图像融和 1 基于IHS变换的图像融合方法 IHS方法是将原始多光谱图像从RGB空间变换到IHS空间 然后用高分辨率图像或用不同投影方式得到的待融合图像替代I分量 在IHS
  • spring的InitializingBean接口、DisposableBean接口

    本文介绍spring中与bean有关的一些接口 afterPropertiesSet afterPropertiesSet 方法是 Spring 框架中的一个初始化方法 主要用于在 Bean 实例化和属性注入完成后执行一些初始化操作 具体来