当前位置: 首页 > article >正文

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

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.kler.cn/news/332958.html

相关文章:

  • 富格林:警悟可信经验安全投资
  • 【vs code(cursor) ssh连不上服务器】但是 Terminal 可以连上,问题解决 ✅
  • 【设计模式】软件设计原则——接口隔离迪米特
  • 编码与解码
  • 高考技术——pandas使用
  • 如何使用 Gradio 创建聊天机器人
  • 通讯录动态+文件版本
  • XHTML 简介
  • 酒店业CRM和酒店数据管理大数据—未来之窗行业应用跨平台架构
  • SHA-1 是一种不可逆的、固定长度的哈希函数,在 Git 等场景用于生成唯一的标识符来管理对象和数据完整性
  • Redis: 主从复制原理
  • linux无法使用ll命令
  • 动手学深度学习(李沐)PyTorch 第 7 章 现代卷积神经网络
  • 408 笔记错题本
  • 【自动驾驶】最近计划看的论文
  • 个人网络安全的几个重点与防御
  • 【韩顺平Java笔记】第7章:面向对象编程(基础部分)【214-226】
  • 中断-NVIC与EXTI外设详解(超全面)
  • [深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪
  • 河南做网站与SEO:如何提升搜索引擎排名