Springboot启动执行特定代码的方式汇总
作者:MrDeng886 发布时间:2023-08-06 04:42:24
实现InitializingBean接口或使用@PostConstruct注解
实现InitializingBean如下
public class AnotherExampleBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
// 做一些初始化的工作
}
}
官方对其的解释是这样的:实现这个接口会让这个bean的所有必要的属性都被容器注入后(依赖注入),再去执行afterPropertiesSet()里的方法。
笔者再用一个简单的例子去实际演示一下(注意:使用@PostConstruct和实现接口是等价的,可以二选一)
我们在init方法上使用了@PostConstruct注解,并且方法里使用到了Chicken类,而这个Chicken类是通过依赖注入来设置的,所以印证了官方说的话,会在依赖注入完以后才会调用@PostConstruct注解的方法。那为什么不在构造器里往List里面方Chicken类呢,因为容器调用构造器方法的时候,Chicken类还没被注入,所以要写在@PostConstruct注解的方法里。
// 首先声明一个实体类
@Data
public class Chicken {
private String name ;
}
// 将他注入容器
@Configuration
public class UserConfig {
@Bean
public Chicken putUser(){
Chicken chinken = new Chicken();
chinken.setName("普通鸡块");
return chinken;
}
}
// 在family 类中调用 注入chinken
@Component
public class Family {
@Resource
Chicken chicken;
public static List<String> names;
@PostConstruct
public void init(){
names.add(chicken.getName());
}
public Family() {
names = new LinkedList<>();
}
}
实现ApplicationListener接口
如果一个容器里的bean实现了ApplicationListener接口,那么在任何时候,如果有ApplicationEvent(事件)在ApplicationContext(容器)中被发布,该bean会收到通知,从而可以执行相应策略。
下面是Spring提供的几种常用的ApplicationEvent事件
事件名称 | 解释 |
---|---|
ContextRefreshedEvent | 当容器ApplicationContext容器正在初始化或refreshed时会发布这个事件。这里的初始化意味着所有的bean都被加载,并且有后置处理的bean都被检测到并激活了。 |
ContextStartedEvent | 当容器启动调用start()方法是会发布这个事件,这里的开始是所有生命周期的bean都收到了一个开始的信号 |
ContextStoppedEvent | 当容器调用stop方法时会发布这个事件 |
举一个简单的例子,下面的代码我实现ApplicationListener接口并监听ContextRefreshedEvent事件,所以当springboot启动并且初始化完成后,就能执行下面的方法了。
@Component
@Slf4j
public class MenuManage implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//做一些事情
}
}
实现CommandLineRunner或ApplicationRunner 接口
实现了CommandLineRunner的bean会被springboot监测到,并在项目启动后执行run方法,如果有多个bean实现了CommandLineRunner接口,那么可以使用order注解来指定执行顺序。
@Order(2)
@Component
public class ServerStartedReport implements CommandLineRunner{
@Override
public void run(String... args) throws Exception {
//do something
}
}
而实现ApplicationRunner接口与实现CommandLineRunner的唯一不同是,后者接收的参数是main方法传进去的原始参数,而ApplicationRunner接收的参数是封装过原始参数的,可以通过参数名字name来获取指定的参数。
@Component
public class MyApplicationRunner implements ApplicationRunner{
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("ApplicationRunner:"+ Arrays.asList(args.getSourceArgs()));
System.out.println("getOptionNames:"+args.getOptionNames());
System.out.println("getOptionValues:"+args.getOptionValues("foo"));
System.out.println("getOptionValues:"+args.getOptionValues("log"));
}
}
来源:https://blog.csdn.net/qq_35347200/article/details/121678579


猜你喜欢
- 1.二叉树的概念及结构 ①概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二
- 昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没
- 本文为大家分享了java多线程的简单实现及线程池实例,供大家参考,具体内容如下一、多线程的两种实现方式1、继承Thread类的多线程/**
- SpringBoot项目经常将连接数据库的密码明文放在配置文件里,安全性就比较低一些,尤其在一些企业对安全性要求很高,因此我们就考虑如何对密
- 在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主。下面给出用java写入数据到excel表格方法:1.添加jar文件java
- Spring注解AspectJ操作AOP一、被增强类新建一个被增强的类 User,下面有个 add() 方法。package com.pin
- 前言:SpringBoot版本 : 2.2.6mybatis-generator-maven-plugin版本: 1.4.0plugin 使
- 不知道大家对千篇一律的404 Not Found的错误页面是否感到腻歪了?其实通过很简单的配置就能够让Spring MVC显示您自定义的40
- 本文实例分析了Android开发之TimePicker控件用法。分享给大家供大家参考,具体如下:新建项目:New Android Proje
- Qt文件操作类QFile简介Qt中使用QFile类来操作文件的输入/输出。继承至QIODevice,QIODevice类是输入/输出设备的基
- xUtils简介xUtils 包含了很多实用的android工具。xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),
- MyBatis简介MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参
- 由于spring和es的集成并不是特别友好,es的高低版本兼容问题、api更新频率高等问题,所以我选择是官网提供的原生Client(Rest
- 一、前言关于EasyExcel,它对poi做了进一步的封装,使得整个编写流程更加的面向对象。好处嘛,我认为流程上更加清晰即易懂、可读性更好,
- 前言相信这个方法Canvas.drawText大家一定不陌生,TextView就是使用它将文字绘制出来。可是这个方法并没有文字换行的功能,也
- 用了MyBatis的同行,应该见过foreach,它一般是这样用的:<select id="foreachTest"
- 概述在实际项目开发中如果需要支持多语言,我们需要整理项目中所有的字符串并翻译成对应的语种放在相应的文件夹下,就像这样最让我们头痛的是我们得一
- 1.嵌套函数业务开发中,我们可能会遇到这样一个场景:一个函数只会被某一处多次调用,且不想让这个函数在该类的其他地方调用,这个时候就需要对这个
- groovy是一种动态脚本语言,适用于一些可变、和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是R
- 首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。下篇再仔细讲讲为什么要这么写。效果图:实现了三个