Springboot最佳实践:在Spring Boot启动时添加方法运行(下)

简介: Springboot最佳实践:在Spring Boot启动时添加方法运行

3. Spring Boot中的应用程序事件

Spring框架在不同情况下触发不同事件。它还会在启动过程中触发许多事件。我们可以使用这些事件来执行代码,例如,在Spring Boot应用程序启动后,可以使用ApplicationReadyEvent执行代码。

如果我们不需要命令行参数,这是在应用程序启动后执行代码的最佳方法。

@Component
public class RunAfterStartup{
@EventListener(ApplicationReadyEvent.class)
public void runAfterStartup() {
    System.out.println("Yaaah, I am running........");
}

输出:

Yaaah, I am running........

春季靴子中最重要的事件是

  • ApplicationContextInitializedEvent :在准备ApplicationContext并调用ApplicationContextInitializers之后但在加载bean定义之前触发
  • ApplicationPreparedEvent :在加载bean定义后触发
  • ApplicationStartedEvent :在刷新上下文之后但在调用命令行和应用程序运行程序之前触发
  • ApplicationReadyEvent :在调用任何应用程序和命令行运行程序之后触发
  • ApplicationFailedEvent :如果启动时发生异常则触发

可以创建多个ApplicationListeners。可以使用@Order批注或Ordered接口对其进行订购。

该顺序与其他相同类型的ApplicationListener共享,但不与ApplicationRunners或CommandLineRunners共享。

4.方法上的@Postconstruct注解

可以使用@PostConstruct批注标记方法。每当使用此注释标记方法时,将在依赖项注入后立即调用该方法。

@PostConstruct方法链接到特定的类,因此它仅应用于特定于类的代码。每个类只有一个带有postConstruct批注的方法。

@Component
public class PostContructImpl {
    public PostContructImpl() {
        System.out.println("PostContructImpl Constructor called");
    }
    @PostConstruct
    public void runAfterObjectCreated() {
        System.out.println("PostContruct method called");
    }
}

输出:

PostContructImpl Constructor called
postContruct method called

需要注意的是,如果class标记为lazy,则意味着在请求时创建了class。之后,将执行标有@postConstruct批注的方法。

标有postConstruct批注的方法可以具有任何名称,但是不能具有任何参数。它必须是无效的,并且不能是静态的。

请注意,@postConstruct批注是Java EE模块的一部分,在Java 9中被标记为已弃用,在Java 11中已被删除。我们仍然可以通过将java.se.ee添加到应用程序中来使用它。

5. InitializingBean接口

InitializingBean解决方案的工作原理与postConstruct批注完全相似。不必使用注释,我们必须实现InitializingBean接口。然后,我们需要重写afterPropertiesSet()方法。

InitializingBean是org.springframework.beans.factory包的一部分。

@Component
public class InitializingBeanImpl implements InitializingBean {
    public InitializingBeanImpl() {
        System.out.println("InitializingBeanImpl Constructor called");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBeanImpl afterPropertiesSet method called");
    }
}

您必须考虑如果同时使用@PostConstruct批注和InitializingBean会发生什么。那么在这种情况下,@PostConstruct方法将在InitializingBean的afterPropertiesSet()方法之前调用。

6. @bean批注的init属性

我们可以在@Bean批注中使用initMethod属性提供一种方法。bean初始化后将调用此方法。

initMethod中提供的方法必须为空,并且不能包含任何参数。此方法甚至可以是私有的。

public class BeanInitMethodImpl {
    public void runAfterObjectCreated() {
        System.out.println("yooooooooo......... someone called me");
    }
}
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    @Bean(initMethod="runAfterObjectCreated")
    public BeanInitMethodImpl getFunnyBean() {
        return new BeanInitMethodImpl();
    }
 }

输出:

yooooooooo......... someone called me

如果您具有同一类的InitializingBean实现和@Bean批注的initMethod属性,则将initMethod之前调用InitializingBean的afterPropertiesSet方法。

结合不同的方法:

最后,有时我们可能需要组合多个选项。然后,它们将按照以下顺序执行:

  • 建设者
  • 后构造方法
  • afterPropertiesSet方法
  • Bean初始化方法
  • ApplicationStartedEvent
  • ApplicationRunner或CommandLineRunner取决于顺序
  • ApplicationReadyEvent

快速阅读

  • 春季启动应用程序启动后,有多种方法可以运行代码
  • 我们可以使用CommandLineRunner或ApplicationRunner接口
  • 使用ApplicationRunner接口访问已解析的参数,而不是原始字符串数组
  • Spring Boot事件在应用程序启动时执行代码
  • 标有@PostConstruct批注的方法在对象初始化后执行
  • 对象初始化之后调用InitializingBean接口的afterPropertiesSet()方法
  • @Bean批注具有属性“ initMethod”以提供将在bean初始化后调用的方法

相关话题

  • Spring Boot项目设置指南
目录
相关文章
|
18天前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
95 12
|
18天前
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
62 10
|
15天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
59 5
|
29天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
40 2
|
1月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
45 1
|
19天前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
27 0
|
2月前
|
存储 安全 Java
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
97 2
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
159 1
|
缓存 安全 前端开发
SpringBoot整合SpringSecurity带图片验证码简单实现
针对把code码放到httpServletRequest中易引发并发问题,考虑之后,实现把code码放入到login的提交表单内,与用户名和密码一起发送。
SpringBoot整合SpringSecurity带图片验证码简单实现