Spring Boot Conditional beans——根据条件注册bean

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(368)   2023-06-26 07:54:18

Spring Boot Conditional beans 教程展示了如何根据条件将 bean 注册到 Spring Boot 应用程序上下文中。

弹簧贴 是一种流行的应用程序框架,用于在 Java、Kotlin 或 Groovy 中创建企业应用程序。

@有条件的

@Conditional 注释表示只有当所有指定条件都匹配时,组件才会注册到应用程序上下文中。如果一个 @Configuration 类被标记为 @Conditional,所有的 @Bean 方法、@Import 注释和与该类关联的 @ComponentScan 注释将受条件约束。

Spring 提供了大量开箱即用的条件注释,包括 @ConditionalOnClass@ConditionalOnMissingBean @ConditionalOnBean@ConditionalOnProperty@ConditionalOnNotWebApplication@ConditionalOnExpression

Spring Boot 条件 bean 示例

在下面的应用程序中,我们有两个根据条件注册的 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 应用程序的项目结构。

pom.xml
<?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 文件。

com/zetcode/bean/MessageBean.java
package com.zetcode.bean;

public interface MessageBean {

    String getMessage();
}

这是 MessageBean

com/zetcode/bean/GenericMessage.java
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

com/zetcode/bean/WelcomeMessage.java
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 适用于欢迎消息。

com/zetcode/conf/AppConf.java
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 不是的条件下注册的。

resources/application.properties
spring.main.banner-mode=off
welcomebean.enabled=true

application.properties 文件中,我们定义了 welcomebean.enabled 属性。

com/zetcode/MyRunner.java
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 属性,我们会收到欢迎消息或一般消息。

com/zetcode/Application.java
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

相关阅读

Spring Boot Vue.js 教程展示了如何使用 Vue.js 框架创建一个简单的 Spring Boot。 Vue.js Vue.js 是一个用于构建用户界面的 JavaScript ...
JavaScript 是否已经取代 Java 成为新的“一次编写,随处运行”的编程语言?这完全取决于您的观点。随着 WebAssembly 等技术的出现,Java 可以在新奇的“一次编写,随处编...
Usage of TypeScript,微软基于 JavaScript 的强类型语言, has soared compared to six years ago, according to th...
云莓将基于 Spring 构建的 Java 后端与使用 Lit 构建的 TypeScript 前端相结合,一个快速、响应式的 JavaScript 框架。基于 Vaadin Fusion 的 H...
本博客严重偏向于 GWT(和基于 GWT 的框架),但我们牢记 GWT 将来可能会被其他技术接管,因此我们始终对探索其他平台/框架持开放态度。正如他们所说,多元化可以降低风险。每种编程语言,即使...
Java JSON 教程展示了如何使用 JSON-Java 在 Java 中进行 JSON 序列化和反序列化。 JSON(JavaScript 对象显示法) 是一种轻量级数据交换格式。人类易于读...
JHipster 是一个长期存在且雄心勃勃的混合 Java 和 JavaScript 项目,致力于使用现代反应式前端简化全栈 Java 应用程序的开发。 JHipster 开发团队不断发布新版本...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Spring Boot JSON 教程展示了如何在 Spring Boot 注释中提供 JSON 数据。 春天 是一个流行的 Java 应用程序框架,弹簧贴 是 Spring 的演变,有助于创建...
根据最近一项全球开发人员调查,在开发人员偏好方面,JavaScript 和 Python 保持了持久力,而 锈 的使用率正在上升. 5 月 4 日的一份题为“开发者国家情况,第 22nd 版”的...