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

news/2024/10/4 15:15:01/

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 {@Overridepublic 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 {@Autowiredprivate Environment env;@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void run(String... args) {//...}
}

http://www.ppmy.cn/news/1534481.html

相关文章

【GEE学习第三期】GEE常用函数总结

【GEE学习第三期】GEE常用函数总结 数据统计类ee.List.sequence函数 图像处理类ee.Geometry类‌defaultVisualizationVis函数 数据输入输出数值与绘图导出影像 参考 数据统计类 ee.List.sequence函数 用法如下: ee.List.sequence (开始,结…

【力扣 | SQL题 | 每日三题】力扣1264, 1113, 1098, 1082

1. 力扣1264:页面推荐 1.1 题目: 朋友关系列表: Friendship ------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ (user…

vue访问组件的数据和方法

组件源码 <template><view class"c_container" :style"myStyle" click"clickCust"><view style"font-size: 18px;text-align: center;">{{item.name}}</view><view style"margin-top: 10px;font-siz…

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…

lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic

一、结论先行 lambda 底层实现机制 1.lambda 表达式的本质&#xff1a;函数式接口的匿名子类的匿名对象 2.lambda表达式是语法糖 语法糖&#xff1a;编码时是lambda简洁的表达式&#xff0c;在字节码期&#xff0c;语法糖会被转换为实际复杂的实现方式&#xff0c;含义不变&am…

Arduino UNO R3自学笔记17 之 Arduino为啥要用中断?

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;学习Arduino中断的概念及其功能。 1.什么是中断&#xff1f; 单片机在执行程序时&#xff0c;发生一些其它紧急的事情&#xff0c;单片机将立即暂停当前…

Python编码系列—Python访问者模式:为对象结构添加新功能的艺术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

工作笔记20240927——vscode + jlink调试

launch.json的配置&#xff0c;可以用的 {"name": "Debug","type": "cppdbg","request": "launch","miDebuggerPath": "./arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-g…