启动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配置中使用时比较有用需要高度自定义的初始化和后处理操作

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

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

相关文章

【Leetcode】207.课程表

一、题目 1、题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 p r e r e q u i s i t e s [ i ] = [ a i , b

深度学习验证码项目

项目代码: GitHub - kerlomz/captcha_trainer: [验证码识别-训练] This project is based on CNN/ResNet/DenseNetGRU/LSTMCTC/CrossEntropy to realize verification code identification. This project is only for training the model. GitHub - Python3WebSpi…

OpenCV项目开发实战--详细介绍如何进行图像平移和旋转含原理讲解+实现源码

如今,图像编辑变得越来越流行,因为手机具有这种内置功能,可以让您对图像进行裁剪、旋转和执行更多操作。在这篇博文中,我们将使用 OpenCV 探索图像转换和图像旋转。 基本图像转换操作 图像平移和旋转是图像编辑中最基本的操作之一。两者都属于更广泛的仿射变换类别。因此…

win10搭建gtest测试环境+vs2019

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

ATF(TF-A)之UBSAN动态代码分析

安全之安全(security)博客目录导读 目录 一、UBSAN简介 二、TF-A中UBSAN配置选项 一、UBSAN简介 未定义行为消毒器(Undefined Behavior Sanitizer,UBSAN)是Linux内核的未定义行为动态检测器。 详细信息可参考:https://github.com/google/kernel-sanit…

js实现日历 完整版

<template><div id"calendar"><!-- 年份 月份 --><div class"title"><div class"label">活动日历</div><div class"total">当前活动 {{ list.length }} 场</div></div><div…

基于Qt C++的工具箱项目源码,含命令行工具、桌面宠物、文献翻译、文件处理工具、医学图像浏览器、插件市场、设置扩展等工具

一、介绍 1. 基本信息 完整代码下载地址&#xff1a;基于Qt C的工具箱项目源码 TBox是一款基于Qt C的工具箱。用户可以自行选择安装所需的工具&#xff08;以插件的形式&#xff09;&#xff0c;将TBox打造成专属于自己的效率软件。TBox基本界面展示如下&#xff1a; 2. 使用…

小程序首页如何进行装修设置

小程序首页是展示给用户的第一屏&#xff0c;它的装修直接影响到用户对小程序的第一印象。小程序首页的设置在小程序管理员后台->页面设置->首页&#xff0c;下图是小程序首页默认的设置。 下图&#xff0c;是小程序首页的具体表现形式。下面具体解释小程序首页各个设置项…

【PCIE720】基于PCIe总线架构的高性能计算(HPC)硬件加速卡

PCIE720是一款基于PCI Express总线架构的高性能计算&#xff08;HPC&#xff09;硬件加速卡&#xff0c;板卡采用Xilinx的高性能28nm 7系列FPGA作为运算节点&#xff0c;在资源、接口以及时钟的优化&#xff0c;为高性能计算提供卓越的硬件加速性能。板卡一共具有5个FPGA处理节…

用 python popen 后台 启动 appium 之后,出现自动结束进程的情况

appium_port get_free_appium_port() cmd f"appium -p {appium_port} &" print(cmd)subprocess.Popen(cmd,shellTrue,# 这里修改stdoutopen(f"./{appium_port}.log", "a"),stderrsubprocess.STDOUT, )python&#xff08;父进程&#xff09…

树和二叉树 | 一些遇到的小问题

1. TreeNode<T> &a TreeNode<T> &a是一个引用&#xff0c;指向类型为T的TreeNode节点。这个引用可以用来修改或访问该节点的值或属性。 2. *BiTree是什么意思&#xff1a; typedef struct BiTNode{ char data;struct BiTNode* lchild, * rchild; }BiT…

标定板生成网址,可以直接打印,matlab标定工具箱

Camera Calibration Pattern Generator – calib.io matlab 打开标定的成像 cameraCalibrator 点击完成之后 命令行中输入 cameraParams.IntrinsicMatrix

Java多线程-——静态代理以及Lambda表达式(基于狂神说的学习笔记)

静态代理 package demo02;// 静态代理模式总结&#xff1a; // 真实对象和代理对象都要实现同一个接口 // 代理对象要代理真实角色/* 好处&#xff1a; 代理对象可以做很多真实对象做不了的事情 真实对象专注做自己的事情*/ public class StaticProxy {public static void mai…

修改ubuntu服务器fs文件最大打开数

起因 在对项目进行压测的时候&#xff0c;请求异常 java.net.SocketException: socket closed&#xff0c;查看nginx代理服务器的日志。tail -f -n500 /var/log/nginx/error.log 显示 文件打开数太多socket() failed (24: Too many open files) while connecting to upstream …

Kubernetes核心组件Services

1. Kubernetes Service概念 Service是kubernetes最核心的概念&#xff0c;通过创建Service&#xff0c;可以为一组具有相同功能的POD&#xff08;容器&#xff09;应用提供统一的访问入口&#xff0c;并且将请求进行负载分发到后端的各个容器应用上。 在Kubernetes中&#xf…

C++ opencv实现letterbox

代码&#xff1a; #include <iostream> #include "string" #include "opencv2/opencv.hpp"cv::Mat preprocess_img(cv::Mat& img, int input_w,int input_h) {int w,h,x,y;float r_winput_w/(img.cols*1.0);float r_hinput_h/(img.rows*1.0);if…

虚拟信用卡:如何获取、推荐平台及对注册开发者账号的应用

虚拟信用卡是一种不需要实体卡片即可使用的信用卡&#xff0c;它的卡号、过期日期和安全码等信息都是通过电子形式提供给用户。 在使用之前&#xff0c;通常需要先进行充值。虚拟信用卡可以像实体信用卡一样&#xff0c;能与在线购物、订阅服务以及其他需要信用卡支付的场景相…

凉鞋的 Godot 笔记 108. 第二个通识:增删改查

在这一篇&#xff0c;我们来学习此教程的第二个通识&#xff0c;即&#xff1a;增删改查。 增删改查我们不只是一次接触到了。 在最先接触的场景窗口中&#xff0c;我们是对 Node 进行增删改查。 在文件系统窗口中&#xff0c;我们是对文件&文件夹进行增删改查&#xff1…

SpringBoot 时 jar 报错 没有主清单属性

SpringBoot 时 jar 报错 没有主清单属性 参考资料 使用阿里版 Spring Initializr 创建的项目。 springboot 2.6.13 JDK 1.8 这里自动开了skip。 注释后打的 jar 包就可以运行了。 <build><finalName>${name}</finalName><plugins><plugin><…

[Spring]事务的传播机制

一、背景 Mysql在修改完数据后&#xff0c;默认会自动触发事务Commit提交。 而在我们服务的一个方法里&#xff0c;需要多次修改Mysql记录。 为了保证原子性&#xff0c;我们需要将Mysql设为手动提交&#xff0c;多次修改后再commit提交。 二、Spring事务 1、编程式事务管理…