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

这篇具有很好参考价值的文章主要介绍了启动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;

    @PostConstruct
    public void init() {
        // 初始化操作
    }
}

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

import org.springframework.beans.factory.InitializingBean;

public class MyBean implements InitializingBean {
    @Override
    public 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 {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在Bean的初始化前执行自定义操作
        if (bean instanceof MyBean) {
            ((MyBean) bean).setCustomProperty("Custom initialization");
        }
        return bean;
    }

    @Override
    public 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.");
    }

    @PostConstruct
    public void postConstructInit() {
        System.out.println("@PostConstruct: Custom initialization after construction.");
    }

    @Override
    public 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 {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor - BeforeInitialization: " + beanName);
        return bean;
    }

    @Override
    public 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的特点和执行顺序:文章来源地址https://www.toymoban.com/news/detail-725886.html

特点/方法 @PostConstruct InitializingBean 自定义初始化方法(@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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 启动Flink显示初始化状态怎么解决?

    Flink On Yarn模式 问题 思路 具体实现思路 脚本如下 flinkInitDeal.sh

    2024年02月14日
    浏览(72)
  • Android性能优化之游戏引擎初始化ANR

    近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 java 调用栈: 从调用栈中发现onActivityResult()执行对游戏侧的

    2024年02月15日
    浏览(49)
  • 【C++】构造函数和初始化列表的性能差距

    构造函数和初始化列表的性能差距对比测试 在C++类和对象中,你可能听到过更加推荐用初始化列表来初始化类内成员。如果类内成员是自定义类型,则只能在初始化列表中调用自定义类型的构造函数。 但初始化列表和在构造函数体内直接赋值有无性能差距呢?今天就用一份

    2024年02月11日
    浏览(43)
  • SpringBoot启动时的几种初始化操作

    1、静态代码块 static静态代码块,在类加载的时候即自动执行。 2、构造方法 在对象初始化时执行。执行顺序在static静态代码块之后。 3、通过注解@PostConstruct实现 @PostConstruct注解使用在方法上,它可以被用来标注一个 非静态的 void 方法 ,这个方法会在该类被 Spring 容器初始化

    2024年02月09日
    浏览(44)
  • 一文详解 springboot 项目启动时异步执行初始化逻辑

    你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 前言 前面的工作中,为了提高地区数据的响应时间,需要加载全国区划数据到 redis 中缓存起来,这个过程希望在项目时启动。 由于初始化全国区划到 redis 中这个过程是

    2024年02月12日
    浏览(49)
  • PLSQL启动报错:Initialization error,不能初始化

    出现场景:我这里原来有个旧版的PLSQL,想用新版的又装了个新版,启动的时候报错 第一个提示明显看到是和程序位数相关的,不管是32位还是64位要做到向匹配 第二个提示可以看到是和oci.dll文件的设置相关 登录的时候先点取消,不使用用户登录,进入客户端 检查PLSQL的OC

    2024年01月23日
    浏览(65)
  • CentOS Stream 10 计划已启动,即将进入初始化阶段

    导读 但初始化的 CentOS Stream 10 暂时不会对外开放,也不会有太多活跃信息。从 Fedora 周期的规律来看,至少还有六个月的时间,CentOS Stream 10 才会正式启动开发流程,接受来自外部的贡献。周五的公告指出:你会看到 CentOS Stream 10 的活动,但现在还不是时候参与进来。可用性

    2024年02月11日
    浏览(45)
  • 轻松使用Docker启动MySQL并初始化SQL(Dockerfile)

    在本教程中,我们将使用Docker来启动MySQL容器,并通过初始化SQL脚本来创建数据库和表。此外,我们还将演示如何将MySQL密码外置到环境变量文件中,以增加安全性。 在开始之前,请确保已经安装了Docker。如果尚未安装,可以参考我前面的教程 首先,我们需要创建一个名为

    2024年02月22日
    浏览(72)
  • DPDK系列之二十八内存分配启动和初始化

    在前面对DPDK中的内存进行了各个模块的分析,这次开始整体流程的分析说明。重点是分析一下内存从开始准备到最终应用的过程,从而把各个分别讲的模板贯穿起来,从而能够更好的了解和认识DPDK中内存的使用。 DPDK中,启动时对内存的处理如下: 1、大页内存的处理 这个在

    2024年02月10日
    浏览(53)
  • 常见问题03:SpringBoot项目启动初始化数据(执行sql文件)

    使用外部资源中定义的 SQL 脚本填充、初始化或清理数据库。 调用addScript(org.springframework.core.io.Resource)以添加单个 SQL 脚本位置。 调用addScripts(org.springframework.core.io.Resource…)以添加多个 SQL 脚本位置。 请参阅此类中的 setter 方法以获取更多配置选项。 调用populate(java.sql.Connect

    2024年02月13日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包