Spring Boot Conditional beans 教程展示了如何根据条件将 bean 注册到 Spring Boot 应用程序上下文中。
弹簧贴 是一种流行的应用程序框架,用于在 Java、Kotlin 或 Groovy 中创建企业应用程序。
@Conditional
注释表示只有当所有指定条件都匹配时,组件才会注册到应用程序上下文中。如果一个 @Configuration
类被标记为 @Conditional
,所有的 @Bean
方法、@Import
注释和与该类关联的 @ComponentScan
注释将受条件约束。
Spring 提供了大量开箱即用的条件注释,包括 @ConditionalOnClass
、@ConditionalOnMissingBean
、 @ConditionalOnBean
、@ConditionalOnProperty
、@ConditionalOnNotWebApplication
和 @ConditionalOnExpression
。
在下面的应用程序中,我们有两个根据条件注册的 bean。
pom.xml src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── Application.java │ │ ├── bean │ │ │ ├── GenericMessage.java │ │ │ ├── MessageBean.java │ │ │ └── WelcomeMessage.java │ │ ├── conf │ │ │ └── AppConf.java │ │ └── MyRunner.java │ └── resources │ └── application.properties └── test └── java
这是 Spring Boot 应用程序的项目结构。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>SpringBootConditionalBeans</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <java.version>13</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.7</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.6.7</version> </plugin> </plugins> </build> </project>
这是 Maven pom.xml
文件。
package com.zetcode.bean; public interface MessageBean { String getMessage(); }
这是 MessageBean
。
package com.zetcode.bean; public class GenericMessage implements MessageBean { private String message; public GenericMessage(String message) { this.message = message; } public String getMessage() { return message; } }
这是用于通用消息的 GenericMessage
。
package com.zetcode.bean; public class WelcomeMessage implements MessageBean { private String message; public WelcomeMessage(String message) { this.message = message; } public String getMessage() { return message; } }
WelcomeMessage
适用于欢迎消息。
package com.zetcode.conf; import com.zetcode.bean.GenericMessage; import com.zetcode.bean.WelcomeMessage; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConf { @Bean @ConditionalOnProperty(name="welcomebean.enabled", havingValue="true") public WelcomeMessage welcomeBeanBean() { return new WelcomeMessage("Welcome!"); } @Bean @ConditionalOnMissingBean(WelcomeMessage.class) public GenericMessage messageBean() { return new GenericMessage("Today is a beautiful day."); } }
在 AppConf
中,我们有两个基于条件定义的 bean。
@Bean @ConditionalOnProperty(name="welcomebean.enabled", havingValue="true") public WelcomeMessage welcomeBeanBean() { return new WelcomeMessage("Welcome!"); }
使用 @ConditionalOnProperty
,仅当存在 welcomebean.enabled
时才会注册 WelcomeMessage
bean > 属性设置为 true
。
@Bean @ConditionalOnMissingBean(WelcomeMessage.class) public GenericMessage messageBean() { return new GenericMessage("Today is a beautiful day."); }
GenericMessage
是在 WelcomeMessage
不是的条件下注册的。
spring.main.banner-mode=off welcomebean.enabled=true
在 application.properties
文件中,我们定义了 welcomebean.enabled
属性。
package com.zetcode; import com.zetcode.bean.MessageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyRunner implements CommandLineRunner { @Autowired private MessageBean messageBean; @Override public void run(String... args) throws Exception { System.out.println(messageBean.getMessage()); } }
在 MyRunner
中,我们自动装配一个消息 bean 并打印消息。根据 welcomebean.enabled
属性,我们会收到欢迎消息或一般消息。
package com.zetcode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Application
设置 Spring Boot 应用程序。
$ mvn -q spring-boot:run ... Welcome!
我们运行应用程序。
在本教程中,我们使用了条件 bean。
地址:https://www.cundage.com/article/springboot-conditionalbeans.html