在Spring Boot启动时运行代码

Spring Boot会自动为我们执行很多配置,但是迟早您将不得不做一些自定义工作。 在本文中,您将学习如何进入应用程序引导生命周期并在Spring Boot启动时执行代码

因此,让我们看看该框架提供了什么。

1. Bean初始化时执行方法

Spring启动您的应用程序后,运行某些逻辑的最简单方法是将代码作为所选bean引导过程的一部分执行。

你要做什么

只需创建一个类,将其标记为Spring组件,然后将应用程序初始化代码放入带有@PostConstruct批注的方法中即可。 从理论上讲,您可以使用构造函数代替单独的方法,但是将对象的构造与其实际职责分开是一种很好的做法。

@Component
class AppInitializator {private static final Logger log = LoggerFactory.getLogger(AppInitializator.class);@PostConstructprivate void init() {log.info("AppInitializator initialization logic ...");// ...}}

如果您使用应用程序上下文的延迟初始化(例如, 加快Spring Boot的启动速度 ),则应从此机制中排除具有初始化逻辑的bean。 我已经描述了当整个Spring上下文使用延迟加载时如何使用@Lazy批注快速创建bean 。

您还可以在主Spring Boot应用程序类中使用@PostConstruct批注创建方法。 不要忘记,主类也是由框架管理的组件。

@SpringBootApplication
public class InitDemoApplication {// ...@PostConstructprivate void init() {log.info("InitDemoApplication initialization logic ...");// ...}}

但是,此解决方案似乎是一种解决方法,而不是真正的解决方案。 您可以以非常有限的方式控制Spring框架创建应用程序Bean的顺序。 如果我们想在创建所有bean之前或者甚至在框架启动之前运行初始化逻辑,我们需要找到更好的方法。

2. Spring Boot启动挂钩

使用Spring Boot创建的应用程序的美妙之处在于,运行它们唯一需要的就是Java Runtime Environment和命令行界面。 无需外部工具或应用程序。 它像常规的Java SE程序一样运行。

与每个Java程序一样,您可以在输入应用程序类的static主方法中开始执行此类应用程序。 这就是您可以挂入Spring Boot初始化过程的关键所在。

创建Spring Boot钩子

首先在您的main方法中更改代码,以提取启动钩子到单独方法的附加内容。 您应该在启动应用程序之前添加Spring Boot挂钩。

public static void main(String[] args) {SpringApplication application = new SpringApplication(InitDemoApplication.class);addInitHooks(application);application.run(args);
}static void addInitHooks(SpringApplication application) {// TBD …
}

当Spring Boot应用程序启动时,它将在引导过程的各个步骤上发布几个事件。 SpringApplication类的API公开了一个方法,我们可以使用该方法为这些事件添加侦听器。

这是一个示例,该示例在Spring上下文开始创建bean之前对发布的事件运行启动方法:

static void addInitHooks(SpringApplication application) {application.addListeners((ApplicationListener<ApplicationEnvironmentPreparedEvent>) event -> {String version = event.getEnvironment().getProperty("java.runtime.version");log.info("Running with Java {}", version);});
}

活动类型

根据事件类型 ,Spring传递给侦听器的对象可能使您可以访问一些有用的操作。 在前面的示例中,我们读取了一些环境属性,但也可以根据需要对其进行修改。

这是可能的事件的列表,按Spring Boot在启动时发布事件的顺序排序:

  • ApplicationStartingEvent
  • ApplicationEnvironmentPreparedEvent
  • ApplicationContextInitializedEvent
  • ApplicationPreparedEvent
  • ApplicationStartedEvent
  • ApplicationReadyEvent

我不想重复事件的文档,因此,如果您对事件描述感兴趣,就应该检查一下。 也有ApplicationFailedEvent,但仅在框架无法启动您的应用程序时才发布。

根据我的经验, 最重要的事件是ApplicationEnvironmentPreparedEvent 。 在Spring Boot启动的这一刻,还没有创建bean,但是您可以访问整个应用程序配置。 通常,这是运行一些自定义启动代码的最佳时机。

3.在没有嵌入式Tomcat的情况下启动时运行代码

尽管Spring Boot设计人员在创建框架时就考虑了构建胖JAR的问题,但一些开发人员仍将Spring Boot应用程序部署到常规的servlet容器(例如Tomcat)。 如果是这种情况,那么如果没有其他步骤,上一段中的解决方案将无法工作。

如果将应用程序部署为常规WAR文件 ,则可能已经具有SpringBootServlerInitializator的自定义实现。 您只需稍微扩展它,并在应用程序构建过程中添加初始化钩子即可。

您可以轻松地重用我们在主应用程序类中创建的addInitHooks()方法。

public class InitDemoWarInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {InitDemoApplication.addInitHooks(builder.application());return builder.sources(InitDemoApplication.class);}}

结论

简而言之,在Spring Boot启动时有两个主要选项来运行代码。 最简单的方法是初始化一个特定的bean。 对于更全球化的情况,该框架具有专用的解决方案,可以使用事件监听器进入其生命周期。 我们学习了如何实现和设置此类侦听器。

希望您觉得该帖子对您有所帮助。 您可以在我的Github存储库中找到可以正常运行的演示 。 我很高兴看到您对需要自定义钩子的用例的评论。 那应该使阅读有趣。

翻译自: https://www.javacodegeeks.com/2018/11/running-code-spring-boot-startup.html

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

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

相关文章

错误:在keystone中无法找到默认角色user_第四章 keystone认证组件安装1

1、在控制节点安装rabbitmq、memcached组件apt-get -y install rabbitmq-server memcached python-pymysql # 设置openstack用户 rabbitmqctl add_user openstack password #后一个password是密码&#xff0c;需要特别注意&#xff0c;要与后面组件访问时的密码一致 #设置ope…

【渝粤教育】电大中专建设工程法规1作业 题库

1.注册建造师应当在相应的岗位上执业。但同时&#xff0c;国家鼓励和提倡注册建造师( )。 A.一师多岗 B.一师全岗 C.一师专岗 D.专岗专职 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.下列规范性文件中,效力最高的是( )。 A.地方性法规 B.行政法规 C.行政规章…

【渝粤教育】电大中专新媒体营销实务 (13)作业 题库

1.新媒体在进行内容传播时&#xff0c;可以做到将文字、图片、视频等同时传播&#xff0c;呈现出&#xff08; &#xff09;的特点。 A.移动化 B.多元化 C.便捷性 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.第四媒体发展到宽带互联网阶段成为&#xff08; &a…

ubuntu加了张固态_将ubuntu系统迁移到ssd固态

朋友送了一个固态硬盘给我&#xff0c;因此将原机械硬盘上的系统迁移到固态硬盘上。原机械硬盘(dev/sdb)装有win10和ubuntu双系统。分区情况如下&#xff1a;sda1&#xff1a;ESP分区sda2&#xff1a;资料sda3&#xff1a;资料sda4&#xff1a;swap分区&#xff0c;被我干掉了&…

【渝粤教育】电大中专测量学 (3)作业 题库

试卷答案 1水准面是水体受地球重力的作用而形成的&#xff0c;其物理特点是在同一水准面上的任意一点具有相等的重力势位&#xff0c;上面任意一点的铅垂线都垂直于该点所在曲面的切平面。 A正确 B错误 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2在地球表面&a…

php cdi_教程:编写自己的CDI扩展

php cdi今天&#xff0c;我将向您展示如何编写CDI扩展。 CDI提供了一种扩展功能的简便方法&#xff0c;例如 添加自己的范围&#xff0c; 启用Java核心类进行扩展&#xff0c; 使用注释元数据进行扩充或修改&#xff0c; 以及更多。 在本教程中&#xff0c;我们将实现一个…

【渝粤教育】广东开放大学 海外社交媒体营销 形成性考核 (45)

选择题 题目&#xff1a;经营战略计划的制定和实施&#xff0c;要以特定的()为依据。 答案&#xff1a;看左侧 题目&#xff1a;战略经营单位是企业值得为其专门制定一种经营战略的()经营单位。 答案&#xff1a;看左侧 题目&#xff1a;从20世纪初到第二次世界大战结束&#x…

centos编译mysql5.6_centos7上编译安装mysql5.6

注意&#xff0c;在做实验室统一关闭防火墙做的&#xff0c;在生产环境需要做防火墙规则的&#xff0c;大家要注意&#xff0c;做的时候尽量都是模仿生产环境的&#xff0c;比如服务一般都在/data/soft下面&#xff0c;尽量避免在/usr/local/下面。安装编译mysql所需要的软件[r…

【渝粤教育】广东开放大学 社会工作综合能力 形成性考核 (27)

选择题 题目&#xff1a;社会工作不同于其他理论性社会科学学科的重要之点是&#xff08; &#xff09;。 题目&#xff1a;关于社会工作价值观操作原则的说法&#xff0c;正确的有( )。 题目&#xff1a;作为一名专业社会工作者&#xff0c;必须遵守的原则不包括&#xff08; …

使用ELK堆栈进行日志聚合

1.简介 随着微服务的使用&#xff0c;创建稳定的分布式应用程序和摆脱许多遗留问题变得很容易。 但是微服务的使用也带来了一些挑战&#xff0c; 分布式日志管理就是其中之一。 由于微服务是隔离的&#xff0c;因此它们不共享数据库和日志文件&#xff0c;因此实时搜索&#xf…

【渝粤教育】广东开放大学 网络整合营销 形成性考核 (53)

选择题 题目&#xff1a; 网络营销应在&#xff08; &#xff09;层面做好格局方面的准备 答案&#xff1a;看左侧 题目&#xff1a; 在互联网社交时代&#xff0c;下列哪个不是其时代特征的产物。&#xff08; &#xff09; 答案&#xff1a;看左侧 题目&#xff1a; 移动端发…

mysql主从延时这么长_MySQL主从延迟问题解决

今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题。坐好了&#xff0c;准备发车&#xff01;主从常见架构随着日益增长的访问量&#xff0c;单台数据库的应接能力已经捉襟见肘。因此采用主库写数据&#xff0c;从库读数据这种将读写分离开的主从架构便随之…

【渝粤教育】广东开放大学 跨文化商务沟通 形成性考核 (42)

选择题 题目&#xff1a; The “OK” sign means in France that you think something is _________. 答案&#xff1a;看左侧 题目&#xff1a; Many words from Chinese and English are different in both the denotational meanings and connotational meanings. Which o…

python的zip方法_python zip()函数使用方法解析

这篇文章主要介绍了python zip()函数使用方法解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下参数iterable为可迭代的对象&#xff0c;并且可以有多个参数。该函数返回一个以元组为元素的列表&#xff0c;其…

aes256加密java_使用Java和JCEKS进行AES-256加密

aes256加密java总览 由于最近爱德华斯诺登 &#xff08; Edward Snowden&#xff09;发布了文件&#xff0c;以及针对JC Penny &#xff0c; Sony和Target等在线商业商店的黑客攻击激增&#xff0c;安全性已成为近年来讨论的重要话题。 尽管本文不会为您提供帮助防止使用非法来…

【渝粤教育】电大中专Windows操作系统作业 题库

学习好Windows10应用这门课程&#xff0c;应该&#xff08;&#xff09;。 A重视理论学习 B重视上机操作&#xff0c;多练多试 C只看不练 D可以随便学习一下 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2在使用Windows时遇到困难&#xff0c;&#xff08;&#…

高可用mysql笔记_MySQL笔记-高可用方案

MySQL笔记-高可用方案一、概述MYSQL高可用方案有多种&#xff0c;本次针对其中部分方案进行实践。包括主从&#xff0c;双主&#xff0c;myqlkeepalived, mysqlmycatkeepalived。纸上得来终觉浅&#xff0c;亲自实验一下。环境信息注意两台机器时间需要保持同步&#xff0c;网络…

【渝粤教育】电大中专办公设备使用与维护 (2)_1作业 题库

1以下哪个不是现代办公硬件需求的主要依赖&#xff08;&#xff09;。 A扫描仪 B计算机 C办公桌 D打印机 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2现代办公设备可分为计算机、通信&#xff08;&#xff09;三大类。 A电子工具 B办公机械 C路由器 D碎纸机 错…

无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)

从无服务器开始时&#xff0c;您很快就会学习/听到有关函数冷启动的信息&#xff08;我相信无服务器云功能 API &#xff09;。 首次调用云功能时或长时间不调用后会发生冷启动。 基本上&#xff0c;服务器&#xff08;是的&#xff0c;有服务器&#xff01;&#xff09;需要一…

【渝粤教育】电大中专学前儿童健康教育作业 题库

1健康的定义是()年&#xff0c;世界卫生组织提出的。 A1945 B1948 C1955 D1958 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2健康不仅仅是没有疾病或虚弱&#xff0c;而是包括身体、心理和()方面的完好状态。 A精神 B躯体 C社会 D道德 错误 正确答案&#xff1a…