如何在Spring Boot中有条件地运行CommandLineRunner Bean

news2024/10/4 17:21:14

PS 使用 Spring Boot 3.1.2 进行测试

1.使用@ConditionalOnProperty

@ConditionalOnProperty仅当特定属性存在或具有特定值时,注释才会创建 Bean 。

在此示例中,仅当或文件中的CommandLineRunner属性db.init.enabled设置为 true时,才会执行。application.properties``application.yml

数据库初始化器.java

package com.yuanmomo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;

@Component
@ConditionalOnProperty(
      name = "db.init.enabled",
      havingValue = "true",
      matchIfMissing = false
)
public class DatabaseInitializer implements CommandLineRunner {

  @Override
  public void run(String... args) {

      System.out.println("This runs when 'db.init.enabled' property is true.");

  }

}

应用程序.属性

db.init.enabled=true

2. 使用环境

Environment我们可以使用bean 和语句以编程方式检查条件if

在此示例中,CommandLineRunner仅当属性db.init.enabled设置为 true 时才会执行。

数据库初始化器.java

package com.yuanmomo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class DatabaseInitializer implements CommandLineRunner {

  @Autowired
  private Environment env;

  @Override
  public void run(String... args) {

      if ("true".equals(env.getProperty("db.init.enabled"))) {
          System.out.println("This runs when 'db.init.enabled' property is true.");
      }

  }
}

3.使用 Spring Profiles

仅当特定的 Spring 配置文件处于活动状态时,注释@Profile才会创建 Bean。

在此示例中,CommandLineRunner仅当 Spring 活动配置文件为 时, 才会执行dev

数据库初始化器.java

package com.yuanmomo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("dev")
public class DatabaseInitializer implements CommandLineRunner {

  @Override
  public void run(String... args) {

      System.out.println("This runs when profile is to dev.");

  }
}

设置Spring 活动配置文件的不同方法。

应用程序.属性

spring.profiles.active=dev

Spring Boot Maven 插件

终端

./mvnw spring-boot:run -Dspring-boot.run.profiles=dev

java -jar

终端

java -jar -Dspring.profiles.active=dev target/spring-boot-commandlinerunner-1.0.jar

4.检查其他bean是否存在

仅当应用程序上下文中存在或缺少特定 bean 时,@ConditionalOnBean和@ConditionalOnMissingBean注释才会创建 bean。

4.1 使用@ConditionalOnBean

@ConditionalOnBean如果应用程序上下文中存在特定 bean,则注释会创建该 bean 。

在这个例子中,CommandLineRunner只有当BookControllerbean 存在于应用程序上下文中时才会执行。

数据库初始化器.java

package com.mkyong;

import com.mkyong.book.BookController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;

@Component
@ConditionalOnBean(BookController.class)
public class DatabaseInitializer implements CommandLineRunner {

  @Override
  public void run(String... args) {

    //...

  }
}

4.2 使用@ConditionalOnMissingBean

@ConditionalOnMissingBean如果应用程序上下文中不存在特定 bean,则注释将创建该 bean 。

在这个例子中,CommandLineRunner只有当BookControllerbean 不存在于应用程序上下文中时才会执行。

数据库初始化器.java

package com.yuanmomo;

import com.mkyong.book.BookController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.stereotype.Component;

@Component
@ConditionalOnMissingBean(BookController.class)
public class DatabaseInitializer implements CommandLineRunner {

  @Override
  public void run(String... args) {

    //...

  }
}

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

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

相关文章

抖音巨量千川涨粉操作流程,值得学习

抖音巨量千川涨粉操作流程值得学习:rjxbb0616 1、找到抖音合作码(在抖音APP里:我-右上角三条杠-设置-账号与安全-我的合作码)复制合作码发给合作商。 2、合作商在千川平台上发布一个虚拟的热门作品到抖音,然后在千川账户建立目标账…

mysql连接池

MySQL连接池 什么是数据库连接池? ​ 定义:数据库连接池(Connection pooling)是程序启动时建立一定数量的数据库连接,并将这些连接组成 一个连接池,由程序动态地对池中的连接进行申请,使用&am…

HTML:相关概念以及标签

目录 什么是网页? 什么是HTML语言? 语法规范 HTML基本结构标签 DOCTYPE,lang以及字符集 HTML常用标签 5>图像标签(重要) 除此之外还有几个调整图片属性的标签 图像标签总结 什么是网页? 我们平时使用电脑和手机都是离不开网站和网页的,那么什么是网页呢?什么又是网…

Yolov8改进轻量级网络Ghostnetv2

1,理论部分 轻量级卷积神经网络 (CNN) 专为移动设备上的应用程序而设计,具有更快的推理速度。卷积运算只能捕获窗口区域中的局部信息,这会阻止性能进一步提高。将自我注意引入卷积可以很好地捕获全局信息,但会在很大程度上阻碍实际速度。在本文中,我们提出了一种硬件友好…

【技术分析】嘉楠科技SoC芯片K230

概述 K230是嘉楠科技Kendryte系列AIoT芯片中的最新一代SoC芯片,该芯片采用全新的多异构单元加速计算架构,集成的玄铁C908具有2个高能效RISCV计算核心,内置新一代KPU(Knowledge Process Unit)智能计算单元,…

【cpp/c++ summary 工具】 Hunter 报错 CMake hunter error: Unexpected MSVC_VERSION

原因:使用的MSVC编译器版本较高,而Hunter版本较低,可在https://github.com/cpp-pm/hunter/releases配置高版本Hunter # HunterGate( # URL "https://github.com/cpp-pm/hunter/archive/v0.23.297.tar.gz" # SHA1 "33…

【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:

使用git clone 时报错unable to access xxx: SSL certificate problem: 这个报错通常是由于SSL证书问题引起的。通常可以按照以下步骤进行排查: 检查网络连接:确保你的网络连接正常,可以访问互联网。尝试使用其他网站或工具测试网络连接是否正…

netty之Netty集群部署实现跨服务端通信的落地方案

前言 在一些小型用户体量的socket服务内,仅部署单台机器就可以满足业务需求。但当遇到一些中大型用户体量的服务时,就需要考虑讲Netty按照集群方式部署,以更好的满足业务诉求。但Netty部署集群后都会遇到跨服务端怎么通信,也就是有…

【PS】删除自定义形状,添加自定义形状

删除自定义形状 在这里选择删除形状为灰色的时候,是不能直接删除的,需要打开形状窗口后才能删除。 找到形状窗口,打开它 然后就可以删除形状了。 导入形状 右键,导入形状 选择你要导入的形状包(我这个是某宝买…

Stable Diffusion绘画 | 来训练属于自己的模型:秋叶训练器使用

花了不少时间搜索尝试,都没有找到解决上一篇文章遗留问题的解决方案,导致无法使用 cybertronfurnace 这个工具来完成炼丹,看不到炼丹效果。 但考虑到,以后还是要训练自己的模型, 于是决定放弃 cybertronfurnace&…

数据结构与算法——Java实现 28.二叉树的锯齿形层序遍历

努力成为你想要成为的那种人,去奔赴你想要的生活 —— 24.10.4 103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推&#xff…

【Unity】双摄像机叠加渲染

一、前言 之前我在做我的一个Unity项目的时候,需要绘制场景网格的功能,于是就用到了UnityEngine.GL这个图形库来绘制,然后我发现绘制的网格线是渲染在UI之后的,也就是说绘制出来的图形会遮盖在UI上面,也就导致一旦这些…

第十八章(数据在内存中的储存)

1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 我本将心向明月,奈何明月照沟渠正文开始 一、.整数在内存中的储存 整数的2进制的表示方法有三种 1.原码 2.反码 3.补码 这里在第十章我们有详细讲解,有需要的同学可以自…

网络编程项目框架内容

基于TCP的云端书阅管理系统 通过网络实现图书借阅网站,包括服务器与客户端,客户端与服务器是基于TCP连接。 客户端描述:客户端运行会与服务器端进行连接,连接成功后,显示注册登录界面。此时,客户端可以选…

算法: FriendShip - Kruskal+并查集判环

题目 A-Friendship_2024.5.7 (nowcoder.com) 思路分析 求所有符合题意情况的最大值中的最小值;符合题意是指保证图的连通性。那么贪心思路,将所有已存在的关系和可能存在的关系存储起来,利用Kruskal贪心算法每次取权值最小的且不构成回路的…

从零开始讲PCIe(2)——PCI总线传输模型与机制

一、前言 在之前的内容中,我们已经对PCI有了一些基本的认识,我们了解了PCI的一般架构,标准传输周期等相关的内容,接下来我们会进一步了解PCI具体的传输模型和传输机制。 二、PCI传输模型 PCI一共有三种数据传输模型,分…

Windows安装ollama和AnythingLLM

1、Ollama安装部署 1)安装ollama 官网下载:https://ollama.com/download,很慢 阿里云盘下载:https://www.alipan.com/s/jiwVVjc7eYb 提取码: ft90 百度云盘下载:https://pan.baidu.com/s/1o1OcY0FkycxMpZ7Ho8_5oA?…

Python-初识Python

前言:在这篇博客当中,我们将步入Python知识的殿堂,Python以其简单、易学、开发效率高在近些年的发展可谓是迅猛,在许多领域都可以见到它的场景,例如:人工智能/机器学习、大数据开发、后端开发等都会用到。 …

仕考网:公务员国考有三不限岗位吗?

国家公务员考试中的“三不限”岗位,即不限制专业背景、政治面貌、基层工作经验的职位。在国考中,是有的但是数量比较少。 这些岗位主要集中在省级及以下单位,以民航空警和铁路公安为主。其中,有一半的职位是面向四项目人员&#…

基于STM32的蓝牙音乐播放器设计

引言 本项目将基于STM32微控制器设计一个简易的蓝牙音乐播放器,通过蓝牙模块接收手机的音乐信号,并使用音频解码芯片播放音乐。该项目展示了STM32在嵌入式音频处理与蓝牙通信方面的应用。 环境准备 1. 硬件设备 STM32F103C8T6 开发板(或其…