当前位置: 首页 > news >正文

启动Java应用的黑魔法:初始化性能解密@PostConstrut,InitialzingBean,init-method,BeanPostProcessor

我们在项目中经常会遇到启动时做一些逻辑的处理,比如配置信息的预加载,缓存信息的预加载等等,那都有哪些方法了,我们一起来探讨一下:

1. 方式

1. 构造方法初始化: 使用构造方法进行对象的基本属性初始化。这是最基本的初始化方式。

public class MyBean {private String name;private int age;public MyBean(String name, int age) {this.name = name;this.age = age;}
}

2.JDK @PostConstruct注解: 使用@PostConstruct注解标记一个方法,该方法会在Bean创建后自动调用。

import javax.annotation.PostConstruct;public class MyBean {private String name;@PostConstructpublic void init() {// 初始化操作}
}

3. Spring 的InitializingBean接口: 实现InitializingBean接口,重写afterPropertiesSet()方法,该方法会在Bean创建后自动调用。

import org.springframework.beans.factory.InitializingBean;public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() {// 初始化操作}
}

4.Spring 的@Bean初始化方法: 如果你使用Java配置类定义Bean,可以在@Bean注解中指定初始化方法

@Configuration
public class MyConfig {@Bean(initMethod = "customInitMethod")public MyBean myBean() {return new MyBean();}
}class MyBean{private void init(){//初始化操作}}

5.Spring 提供的BeanPostProcessor

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 在Bean的初始化前执行自定义操作if (bean instanceof MyBean) {((MyBean) bean).setCustomProperty("Custom initialization");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 在Bean的初始化后执行自定义操作return bean;}
}

执行顺序

首先,创建一个Spring Boot应用程序。

1.创建Spring Boot应用程序的主类 MySpringBootApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}

2. 创建一个Bean类 MyBean.java

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;@Component
public class MyBean implements InitializingBean {public MyBean() {System.out.println("Constructor: Bean is being created.");}@PostConstructpublic void postConstructInit() {System.out.println("@PostConstruct: Custom initialization after construction.");}@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean: Custom initialization after property set.");}public void customInitMethod() {System.out.println("init-method: Custom initialization method defined in Spring Boot.");}
}

3.创建一个自定义的BeanPostProcessor类 CustomBeanPostProcessor.java

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("BeanPostProcessor - BeforeInitialization: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("BeanPostProcessor - AfterInitialization: " + beanName);return bean;}
}

运行Spring Boot应用程序后,您将看到初始化过程中的打印输出。在控制台上,您将看到它们的执行顺序如下:

Constructor: Bean is being created.
@PostConstruct: Custom initialization after construction.
InitializingBean: Custom initialization after property set.
BeanPostProcessor - BeforeInitialization: myBean
init-method: Custom initialization method defined in Spring Boot.
BeanPostProcessor - AfterInitialization: myBean

这显示了它们的典型执行顺序,即构造方法 > @PostConstruct > InitializingBean > init-method > BeanPostProcessor(在初始化之前和之后执行)。这些初始化方法可以根据需求组合使用,以自定义Bean的初始化过程。

3.比较

以下是一个使用Markdown表格形式来比较@PostConstructInitializingBean、自定义初始化方法(@Bean初始化方法)、以及BeanPostProcessor的特点和执行顺序:

特点/方法@PostConstructInitializingBean自定义初始化方法(@Bean初始化方法)BeanPostProcessor
需要导入的包import javax.annotation.PostConstruct;import org.springframework.beans.factory.InitializingBean;无需导入特定包import org.springframework.beans.BeansException;
执行顺序在Bean的构造后执行在Bean的构造后执行在Bean的构造后执行在Bean的初始化前和后执行
适用对象所有Spring Bean所有Spring Bean所有Spring Bean针对特定Bean或所有Bean
执行时机Bean创建后,属性设置之后Bean创建后,属性设置之后Bean创建后,属性设置之后Bean创建后,初始化前和后
用途自定义初始化操作自定义初始化操作自定义初始化操作自定义初始化和后处理操作
配置方式使用@PostConstruct注解实现InitializingBean接口在Spring配置中使用init-method属性注册为Bean并由Spring容器自动应用
主要优点简便易用,无需额外接口实现简便易用,无需额外接口实现可用于不使用注解的情况,较灵活强大的自定义初始化和后处理功能
主要适用场景通常用于自定义初始化逻辑通常用于自定义初始化逻辑在XML配置中使用时比较有用需要高度自定义的初始化和后处理操作

相关文章:

启动Java应用的黑魔法:初始化性能解密@PostConstrut,InitialzingBean,init-method,BeanPostProcessor

我们在项目中经常会遇到启动时做一些逻辑的处理,比如配置信息的预加载,缓存信息的预加载等等,那都有哪些方法了,我们一起来探讨一下: 1. 方式 1. 构造方法初始化: 使用构造方法进行对象的基本属性初始化。…...

STM32-C语言结构体地址

定义2个结构体 typedef struct _demo_node_{ //结构体本身的地址struct _demo_node_* pprenode; //实际地址开始的位置,最下面的输出结果可以看出struct _demo_node_* pnextnode;unsigned long member_num;unsigned short age;char addr[0]; …...

Go HTTP 调用(下)

今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出! 前言 上篇文章 Go HTTP 调用&#…...

mysql5.7获取json数组中的某个对象

前言 表中的一个字段类型是字符串,存的是一个对象数据。 现在要根据对象中的某个属性,获取到整个对象信息。 如果是mysql8,则可以使用JSON_TABLE。 示例:https://blog.csdn.net/weixin_44071721/article/details/123347229 sele…...

PTE考试解析

Pte 考试题目 注入漏洞 空格被过滤 用/**/代替空格,发现#被过滤 对#进行url编码为%23 输入构造好的payload http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/**/and/**/11%23 http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/*…...

UE4和C++ 开发-UE4怎么删除C++类

1 关闭visual stdio,关闭UE4引擎。 2 打开你的项目文件夹。找到你要删除的.h,.cpp文件删除。 3、删除Binaries文件夹。 4 右击.uproiect文件,点击Generate Visual Studio project files. 5 双击.uproiect文件,忽略警告打开就看到已经删除了想要删除的C类…...

基于图像识别的迁移学习之一

案例分析 加载数据部分同上一个案例,只需把数据输入到预训练的VGG-16或者ResNet50中。VGG-16的网络结构为右侧图绿色栏所示,其中block1中有2个包含64个卷积核的卷积层,block2包含2个128个卷积核的卷积层,block3有3个包含256个卷积…...

k8s使用

一、Kubernetes好处 ​ kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。 ​ kubernetes的本质…...

HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)

图片标签 HTML中&#xff0c;可以使用标签来插入图片。具体的语法为&#xff1a; <img src"图片路径" alt"替代文本">其中&#xff0c;src属性用于指定图片的路径&#xff0c;可以是相对路径或绝对路径。常见的有相对当前HTML文件的路径&#xff0…...

jwttoken+redis+springsecurity

思路 jwttoken不设置过期时间 redis管理过期时间&#xff0c;并且续签 redis中key"login:"userId, valuejwtUser 再次访问时&#xff0c;解析token中userId&#xff0c;并且根据过期时间自动续签JWT 实现登录认证 Token 自动续期方案 pom文件配置 <!--Redis--&…...

asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 会议预约管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 会议预约管理系统 二、…...

十六、【橡皮擦工具组】

文章目录 橡皮擦背景橡皮擦1. 一次取样2. 连续取样3. 取样背景色板 魔术橡皮擦 橡皮擦 橡皮擦跟我们平常生活中所用的橡皮擦是一样&#xff0c;它是将图层的内容擦除,只剩下空白部分。另外当我们按住Alt的键去擦除空白部分的时候&#xff0c;也可以将背景的部分显示出来。 另…...

BAT学习——计算当前路径下指定格式文件的MD5值,将文件名与MD5值写入文本

将以下内容粘贴到bat脚本中&#xff0c;双击运行&#xff0c;生成MD5.txt文件&#xff0c;需要其他格式&#xff0c;修改循环中的.rar 多个格式使用or分开 *.rar or *.bat脚本内容 echo off setlocal enabledelayedexpansionrem 设置输出文件名 set "outputFileMD5.txt&…...

排序算法(stable_sort(), sort())

sort函数我相信大家都不陌生&#xff0c;今天介绍一个新的排序算法stable_sort stable_sort&#xff1a;稳定排序算法&#xff0c;维持相等元素的原有顺序。 stable_sort 假如我们定义一个字符串数组 vector<string> words; //fox jumps over quick red slow the turtl…...

【atoi函数详解】

文章目录 一. 什么是atoi函数二. 模拟实现函数atoi三. 总结atoi 一. 什么是atoi函数 atoi函数是将常量字符串转化为整数 int atoi(const char str);* 注意&#xff1a;该函数的返回值为int&#xff0c;所以不能超过int范围&#xff0c;如果数字很大超过就会截断&#xff0c;返…...

字符串左旋 与 字符串旋转结果

字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 方法1 三步翻转法 要求:abcdef 左旋两个 整体逆序:fedcba左边逆序:cdef ba右边逆序:cdef ab #include<stdio.h> #include<…...

真人现在猫鼠躲猫猫游戏搭建流程:专业思考与深度思考

真人现在猫鼠躲猫猫游戏是种充满乐趣和挑战的团队竞技游戏。本文将从游戏规则设计、场地布置、技术实现和用户体验等方面&#xff0c;深入探讨人现在猫鼠躲猫猫游戏的搭建流程&#xff0c;并结合专业思考与深度思考&#xff0c;为游戏搭建提供全面指导。 一、游戏规则设计&…...

计算机导论实验——Linux基础入门

使用Xshell登录 Linux 主机 linux命令&#xff1a; cd&#xff1a;去哪里 pwd&#xff1a;在哪里 ls&#xff1a;查看当前有什么文件 mkdir&#xff1a;创建新目录 cp&#xff1a;复制 cat&#xff1a;连接或显示文件 rm&#xff1a;删除 mv&#xff1a;用于移动或重命名文件…...

服务运营 |摘要:学术+业界-近期前沿运筹医疗合作精选

推文作者&#xff1a;李舒湉 编者按 本文归纳整理了近期INFORMS Journal on Applied Analytics中的相关业界合作研究。 这些研究成果体现了运筹学在医疗健康领域实践的效果。文中的学术业界合作使用了不同的研究工具。第一篇文章使用仿真模型帮助诊所进行不同拥挤程度下诊所使用…...

基于Dockerfile创建镜像

基于现有镜像创建 1.首先启动一个镜像&#xff0c;在容器里做修改 docker create -it centos:7 /bin/bash #常用选项&#xff1a; -m 说明信息&#xff1b; -a 作者信息&#xff1b; -p 生成过程中停止容器的运行。 2.然后将修改后的容器提交为新的镜像&#xff0c;需要使用…...

架构实战关键知识点

1.维基百科的“系统”定义&#xff1a;https://zh.wikipedia.org/wiki/%E7%B3%BB%E7%B5%B1 2.维基百科的“软件模块”定义&#xff1a;https://zh.wikipedia.org/wiki/%E8%BB%9F%E9%AB%9 4%E6%A8%A1%E7%B5%84 3.维基百科的“软件组件”定义&#xff1a;https://zh.wikipedia.or…...

M1Mac开启x86_64命令行archlinux虚拟机的最佳实践(qemu)

categories: [Tips] tags: Linux MacOS 写在前面 UTM 虚拟机可以卸载了, 命令行才是永远滴神, M1 MacBook Air 又能再战了! 之前一直用 UTM 的虚拟化开启 x86_64 的 Linux 虚拟机的, 但是我发现 UTM 好像不是必须的, 只要有qemu 就可以了, 下面就看看如何不通过图形界面前端…...

深度神经网络压缩与加速技术

// 深度神经网络是深度学习的一种框架&#xff0c;它是一种具备至少一个隐层的神经网络。与浅层神经网络类似&#xff0c;深度神经网络也能够为复杂非线性系统提供建模&#xff0c;但多出的层次为模型提供了更高的抽象层次&#xff0c;因而提高了模型的能力。深度神经网络是一…...

系统架构设计:11 论湖仓一体架构及其应用

目录 一 湖仓一体(Lakehouse) 1 数据仓库 2 数据湖 3 数据仓库和数据湖 4 湖仓一体(Lakehouse)...

Linux系统编程_文件编程第1天:打开、写入、读取、关闭文件等编程

1. 文件编程概述&#xff08;399.1&#xff09; 内容超多&#xff1a; 文件系统原理及访问机制文件在内核中的管理机制什么是文件信息节点inode文件的共享文件权限&#xff0c;各种用户对其权限。。。。。。 应用为王&#xff0c;如&#xff1a; 账单游戏进度配置文件等 关心如…...

scapy构造ND报文

控制报文之&#xff1a;找邻居报文 什么是ND报文 ND报文是指网络中的 Neighbor Discovery&#xff08;ND&#xff09;控制报文。Neighbor Discovery 是 IPv6 网络中的一种协议&#xff0c;它用于管理网络节点之间的邻居关系、地址解析、路由缓存维护和自动配置等任务。ND 协议…...

c++设计模式之单例设计模式

&#x1f482; 个人主页:[pp不会算法v](https://blog.csdn.net/weixin_73548574?spm1011.2415.3001.5343) &#x1f91f; 版权: 本文由【pp不会算法^v^】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦…...

App自动化测试环境搭建

目录 1、java jdk安装 2、node.js安装 3、安装模拟器安装 4、Android SDK 安装 5、Appium-Server安装 6、appium客户端安装  7、Appium-Python-Client安装 只做记录和注意点&#xff0c;详细内容不做解释 环境&#xff1a;winappium夜神模拟器python 需要用到的工具&a…...

win10搭建gtest测试环境+vs2019

首先是下载gtest&#xff0c;这个我已经放在了博客上方资源绑定处&#xff0c;这个适用于win10vs版本&#xff0c;关于liunx版本的不能用这个。 或者百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码&#xff1a;vfxz 下…...

【代码随想录】算法训练营 第二天 第一章 数组 Part 2

977. 有序数组的平方 题目 暴力解法 思路 原地更新所有数组元素为其平方数后&#xff0c;再使用sort函数排序&#xff0c;对vector使用sort函数时&#xff0c;两个参数分别是vector的起始元素和终止元素。 代码 class Solution { public:vector<int> sortedSquares(…...