如何在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
只有当BookController
bean 存在于应用程序上下文中时才会执行。
数据库初始化器.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
只有当BookController
bean 不存在于应用程序上下文中时才会执行。
数据库初始化器.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) {
//...
}
}