【SpringBoot】-- 监听容器事件、Bean的前后置事件

news2024/12/23 1:55:16

目录

一、ApplicationContextInitializer

使用

1、自定义类,实现ApplicationContextInitializer接口

2、在META-INF/spring.factories配置文件中配置自定义类

二、ApplicationListener

使用

1、自定义类,实现ApplicationListener接口

2、在META-INF/spring.factories配置文件中配置自定义类

三、BeanFactoryPostProcessor

四、InitializingBean/DisposableBean

五、BeanPostProcessor


一、ApplicationContextInitializer

IOC容器对象创建完成后执行,可以对上下文环境做一些操作,例如运行环境属性注册等。

使用

1、自定义类,实现ApplicationContextInitializer接口

public class MyApplicationContextInitializer implements ApplicationContextInitializer {


    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        //给上下文context对象注入环境属性
        //1.准备属性
        Map<String, Object> myMap = new HashMap<>();
        myMap.put("applicationName","big-event");

        //2.获取属性资源管理对象
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        MutablePropertySources propertySources = environment.getPropertySources();

        //3.注册
        propertySources.addLast(new MapPropertySource("myMap",myMap));
    }
}

2、在META-INF/spring.factories配置文件中配置自定义类

# 接口全路径名称=自定义类的全路径名称  ctrl+alt+空格自动补全
org.springframework.context.ApplicationContextInitializer=com.zxy.initializer.MyApplicationContextInitializer

二、ApplicationListener

监听容器发布的事件,允许程序员执行自己的代码,完成事件驱动开发,它可以监听容器初始化完成、初始化失败等事件。通常情况下可以使用监听器加载资源,开启定时任务等。

使用

1、自定义类,实现ApplicationListener接口

public class MyListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        //ApplicationEvent event 对应发布的事件
        if(event instanceof ApplicationReadyEvent){
            System.out.println("MyListener..容器初始化成功");
        }
        if(event instanceof ApplicationFailedEvent){
            System.out.println("MyListener..容器初始化失败");
        }
    }
}

2、在META-INF/spring.factories配置文件中配置自定义类

org.springframework.context.ApplicationListener=com.zxy.listener.MyListener

三、BeanFactoryPostProcessor

Bean工厂后置处理器,当BeanFactory准备好之后(Bean初始化之前),会调用该接口的postProcessBeanFactory方法,经常用于新增BeanDefinition。

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    //当BeanFactory被实例化好后,回调这个函数,注册BeanDefinition
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        //注册Teacher类的BeanDefinition
        GenericBeanDefinition gbdf = new GenericBeanDefinition();
        gbdf.setBeanClass(Teacher.class);

        DefaultListableBeanFactory dbf = (DefaultListableBeanFactory) configurableListableBeanFactory;

        dbf.registerBeanDefinition("teacher",gbdf);
    }
}

四、InitializingBean/DisposableBean

初始化接口,当Bean被实例化好后,会回调里面的函数,经常用于做一些加载资源的工作。

销毁接口,当Bean被销毁之前,会回调里面的函数,经常用于做一些释放资源的工作。

@Component
public class Animal implements InitializingBean, DisposableBean {
    //销毁
    @Override
    public void destroy() throws Exception {
        System.out.println("Animal..destroy");
    }
    //初始化
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Animal..fterPropertiesSet");
    }
}

除此之外,使用注解也可以实现上述功能

   //PostConstruct,PreDestroy,提供初始化方法和销毁方法
    @PostConstruct
    public void initMethod(){
        System.out.println("Animal..PostConstruct..initMethod");
    }
    @PreDestroy
    public void destroyMethod(){
        System.out.println("Animal..PreDestroy..destroyMethod");
    }

五、BeanPostProcessor

Bean的后置处理器,当Bean对象初始化之前以及初始化之后,会回调该接口对应的方法。

  • postProcessBeforeInitialization:Bean对象初始化之前调用
  • postProcessAfterInitialization:Bean对象初始化之后调用
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    //初始化之前调用
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    //初始化之后调用
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

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

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

相关文章

“40法则”视角下的海外网络安全公司

2015 年知名投资人Brad Feld在他的博客中分享一篇名为《The Rule of 40% For a Healthy SaaS Company》的文章&#xff0c;提出了在评价海外企业软件和互联网公司财务状况时广泛使用的“Rule of 40”。“40法则”仅仅包含两个简单的参数&#xff1a;收入增长率和净利润率&#…

400G光模块产品最全分类解析

随着信息技术的迅猛发展&#xff0c;网络带宽需求不断增加&#xff0c;而400G光模块作为当前最热门的光通信技术之一&#xff0c;正在成为新一代网络的关键组成部分。本文将对400G光模块进行最全面的分类解析&#xff0c;以帮助大家深入了解其技术特点和应用场景。 一、ETU-LI…

CTF-中国蚁剑安装教程

资源目录 github地址&#xff1a; 蚁剑源代码 https://github.com/AntSwordProject 蚁剑加载器 https://github.com/AntSwordProject/AntSword-Loader 下载过程 下载这两个zip包&#xff1a; 给源代码找个空文件夹并解压缩&#xff1a; 打开加速器&#xff0c;使用管理员…

java.util详细讲解和应用

文章目录 java.util核心组件1. 集合框架&#xff08;Collection Framework&#xff09;2. 日期时间API&#xff08;java.time包&#xff09;3. Random 类4. Scanner 类5. Arrays 类6. Collections 类应用实例ArrayList 示例LocalDate 示例Random 示例 7. Iterator&#xff08;迭…

使用sqlmodel实现唯一性校验2,插入之前检查是否已存在

虽然之前添加唯一性校验的方法能够解决数据唯一的问题&#xff0c;但是如果忘了处理异常&#xff0c;则可能会导致程序崩溃。 在此基础上&#xff0c;我们可以在插入数据之前检查该数据是否已存在。 原来的代码&#xff1a; from sqlmodel import Field, Session, SQLModel,…

# Maven 下载安装与配置

Maven 下载安装与配置 一、前言&#xff1a; 1、Maven 简介&#xff1a; Apache Maven是一个&#xff08; 特别是 Java 编程 &#xff09;项目管理及自动构建工具&#xff0c;由 Apache 软件基金会所提供。基于项目对象模型&#xff08; 缩写&#xff1a;POM &#xff09;概念…

【Pytorch】4.torchvision.datasets的使用

什么是torchvision.datasets、 是pytorch官方给出的关于cv领域的训练数据集&#xff0c;我们可以用官方提供的数据集进行学习与训练 如何查看 我们可以进入Pytorch官网 切换一下版本到v0.9.0&#xff0c;就可以看到官方给出的数据集了 同时也有官方训练好的cv模型可以供我们…

华为手机怎么录屏?3个简单方法教会你

随着智能手机的普及&#xff0c;录屏功能已成为许多用户日常操作中的必备工具。华为手机作为市场上的热门品牌&#xff0c;为用户提供了多种录屏方法&#xff0c;以满足不同场景和需求。 那么华为手机怎么录屏&#xff1f;本文将详细介绍3个华为手机的几种录屏方法&#xff0c…

容器Docker:轻量级虚拟化技术解析

引言 随着云计算和虚拟化技术的飞速发展&#xff0c;容器技术以其轻量级、高效、可移植的特性&#xff0c;逐渐成为了软件开发和部署的新宠。在众多容器技术中&#xff0c;Docker以其简单易用、功能强大的特点&#xff0c;赢得了广泛的关注和应用。本文将全面介绍Docker的基本概…

普通组件的注册-局部注册和全局注册

目录 一、局部注册和全局注册-概述 二、局部注册的使用示例 三、全局注册的使用示例 一、局部注册和全局注册-概述 组件注册有两种方式&#xff1a; 局部注册&#xff1a;只能在注册的组件内使用。使用方法&#xff1a;创建.vue文件&#xff0c;在使用的组件内导入并注册。…

浅谈智能电气火灾监控系统的设计及应用

摘要&#xff1a;致电气火灾的原因是多方面的&#xff0c;主要成因包括漏电、绝缘层老化、短路、电火花密集、接地发生故障、电气设备自然、接触不良和电流超负荷等。文章分析电气火灾的成因&#xff0c;并探索电气火灾监控系统的设计方案与注意事项。 关键词&#xff1a;电气…

揭秘APP广告变现:从零到月入过万的秘密

在移动互联网的时代&#xff0c;APP的开发和运营成为了一个热门的行业。然而&#xff0c;对于许多开发者来说&#xff0c;如何通过APP广告变现&#xff0c;实现收益最大化&#xff0c;是一个值得深思的问题。今天&#xff0c;就让我们通过一个小故事&#xff0c;一起来探讨一下…

助贷客户管理系统:助力助贷公司轻松实现30%增长目标!

为了解决传统助贷公司在业务过程中遇到的痛点&#xff0c;盛鑫优创科技特别设计了一款定制化的解决方案——"鑫鹿助贷客户管理系统"&#xff0c;以满足助贷行业的独特需求&#xff1a; 传统助贷公司的老板们在做业务的的过程中都有这些痛点&#xff1a; 1、没有一个…

25_Scala集合Tuple

文章目录 tuple1.元组定义2.Tuple元素访问3.如果元素的len2&#xff0c;称之为键值对对象&#xff0c;也称之为对偶元组4.补充上节Map5.Map集合遍历6.集合之间相互转化 tuple 概念&#xff1a;scala语言采用特殊的方式将无关的数据作为一个整体&#xff0c;组合在一起’ 1.元…

综合性SCI期刊,中科院3区,IF=4+,征稿范围广泛!

一、期刊名称 Scientific Reports 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;综合性期刊 影响因子&#xff1a;4.6 中科院分区&#xff1a;3区 出版方式&#xff1a;开放出版 版面费&#xff1a;$2590 三、期刊征稿范围 期刊发表来自自然科学、心…

EXCEL——VLOOKUP函数

一、VLOOKUP函数的语法 VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup]) lookup_value 需要在数据表首列进行搜索的值&#xff0c;可以是数值&#xff0c;引用或字符串 table_array 要在其中搜索数据的文字、数字或逻辑值表&#xff0c;可以是对区域或…

Day 41 343.整数拆分 96.不同的二叉搜索树

整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 …

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注&#xff1a;Vite 需要 Node.js 版本 18&#xff0c;20 1.选定路径后再cmd输入创建…

深度学习之基于Resnet50卷积神经网络脊柱骨折CT影像图片诊断系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 脊柱骨折是骨科中一种常见的损伤类型&#xff0c;准确的诊断对于患者的治疗和康复至关重要。传统的脊…

SPD1179 电路设计---汽车电机控制设计

概述 SPD1179 是旋智针对汽车应用推出的一颗高度集成的片上系统&#xff08;SOC&#xff09; 微控制器&#xff0c;内置 32 位高性能 ARMCortex-M4F 内核&#xff0c;最高 100MHz 的软件可编程时钟频率&#xff0c; 32KB SRAM&#xff0c; 128KB 嵌入式 FLASH&#xff0c; 1KB …