Spring Boot 自动配置之条件注解浅析

下面我将为您详细讲解“Spring Boot 自动配置之条件注解浅析”的完整攻略,包含两条示例说明。

1. Spring Boot自动配置原理

Spring Boot的自动配置原理是通过条件注解来实现的。Spring Boot启动时,会默认扫描项目中所有的@Configuration注解,然后根据条件注解(@ConditionalOnXxx)来判断该配置是否需要生效。

例如,一个@Configuration注解的类中如果有@ConditionalOnClass注解,则表示只有当项目中存在指定的类时,该@Configuration才会生效。@ConditionalOnClass注解的实现如下:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnClass {
    /**
     * The classes that must be present. Since this annotation is parsed by loading class
    * bytecode, it is safe to specify classes here that may ultimately not be on the classpath,
    * although doing so will generally not be useful unless the intention is to test for the
    * presence of a class and fail fast when it is not available.
    * @return the classes that must be present
    */
    Class<?>[] value() default {};
}

2. 示例一:条件注解@ConditionalOnWebApplication

条件注解@ConditionalOnWebApplication表示只有当项目是一个Web应用时,该@Configuration才会生效。@ConditionalOnWebApplication注解的实现如下:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnWebApplicationCondition.class)
public @interface ConditionalOnWebApplication {
    /**
    * The type of web application to check for.
    * @return the required type of web application
    */
    WebApplicationType type() default WebApplicationType.SERVLET;
}

我们可以通过以下步骤来演示它的使用:

步骤一:创建一个Spring Boot的Maven项目,命名为“web-demo”;

步骤二:添加如下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

这里我们添加了spring-boot-starter-web依赖,用于启动一个Web应用。

步骤三:创建一个@Configuration注解的类,并在该类上添加@ConditionalOnWebApplication注解。代码如下:

@Configuration
@ConditionalOnWebApplication
public class MyConfig {
    @Bean
    public String myBean() {
        return "Hello, World!";
    }
}

步骤四:创建一个SpringBootApplication,启动应用并访问http://localhost:8080,会看到如下结果:

Hello, World!

这说明我们的@Configuration生效了,因为项目是一个Web应用。

3. 示例二:条件注解@ConditionalOnMissingBean

条件注解@ConditionalOnMissingBean表示只有当指定的Bean不存在时,该@Configuration才会生效。@ConditionalOnMissingBean注解的实现如下:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnMissingBeanCondition.class)
public @interface ConditionalOnMissingBean {
    /**
    * The class of bean that should not be present.
    * @return the class of bean that should not be present
    */
    Class<?>[] value() default {};
}

我们可以通过以下步骤来演示它的使用:

步骤一:创建一个Spring Boot的Maven项目,命名为“bean-demo”;

步骤二:添加如下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

这里我们添加了spring-boot-starter-web依赖,用于启动一个Web应用。

步骤三:创建一个@Service注解的类,命名为MyService。代码如下:

@Service
public class MyService {
    public void run() {
        System.out.println("My Service is running...");
    }
}

步骤四:创建一个@Configuration注解的类,命名为MyConfig,并在该类上添加@ConditionalOnMissingBean注解。代码如下:

@Configuration
public class MyConfig {
    @Bean
    @ConditionalOnMissingBean(MyService.class)
    public String myBean() {
        return "Hello, World!";
    }
}

步骤五:创建一个SpringBootApplication,启动应用并访问http://localhost:8080,会看到如下结果:

Hello, World!

步骤六:将MyService改为如下代码:

@Service
public class MyService {
    public void run() {
        System.out.println("My Service is running...");
    }
}

步骤七:重新启动应用并访问http://localhost:8080,会看到如下结果:

My Service is running...

这说明@Configuration不生效了,因为我们的MyService存在了,条件不满足。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 自动配置之条件注解浅析 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Android发布项目到jitpack的完整步骤

    下面是Android发布项目到jitpack的完整步骤的攻略: 准备工作 确认自己已经有Github账号,如果没有请先去注册Github账号。 将自己的项目上传到Github,确保项目能够正常编译。 注册JitPack账号 打开JitPack官网,进入首页,点击右上角的“Sign in”进入注册页面。 如果已有Github账号,则可以直接使用Github账号…

    GitHub 2023年5月16日
    00
  • Idea里github的图形化操作配置方法

    以下是在Idea中配置GitHub图形化操作的完整攻略: 步骤1:配置GitHub账号 打开Idea并进入设置(Settings)界面; 选择“Version Control”选项; 在GitHub主机下点击“+”按钮,输入您的GitHub账号信息; 点击“Test”按钮,验证账号是否成功添加。 步骤2:克隆GitHub代码仓库 打开Idea并进入欢迎界面;…

    GitHub 2023年5月16日
    00
  • xorm根据数据库生成go model文件的操作

    xorm是一个基于Go语言的ORM(对象关系映射)库,它可以帮助我们在应用程序中快速、高效地访问和管理关系型数据库。在使用xorm时,可以根据数据库中的表结构生成相应的Go Model文件,这样不仅可以减轻我们的工作量,还可以避免手写代码时出现的错误。下面是生成Go Model文件的完整攻略: 步骤一:安装xorm 在开始操作之前,需要先安装xorm。可以使…

    GitHub 2023年5月16日
    00
  • golang常用库之gorilla/mux-http路由库使用详解

    让我来为你详细讲解一下“golang常用库之gorilla/mux-http路由库使用详解”的完整攻略。 一、gorilla/mux-http路由库介绍 gorilla/mux 是一个用于 Go 语言编写的路由器和调度程序。它可以轻松地处理静态和动态路由,并提供更多的功能,如中间件。在我们进行 Go 语言 Web 应用程序开发时,使用 gorilla/mux…

    GitHub 2023年5月16日
    00
  • WPF框架之Prism介绍

    WPF框架之Prism介绍 什么是Prism框架 Prism框架是一个开源项目,旨在帮助开发人员更轻松地构建复杂的、可重用的、模块化的WPF和Silverlight应用程序。它提供了一组用于实现常见功能的库和工具,包括: 用于绑定和命令的Parser库 用于UI组件、消息传递、内存管理和导航的基础类库 适用于WPF和Silverlight的模块加载器和依赖项…

    GitHub 2023年5月16日
    00
  • Git远程操作详解

    下面我将详细讲解Git远程操作的完整攻略,并给出两条示例说明。 Git远程操作详解 1. Git远程仓库的创建 Git的远程仓库一般是用来存放代码的,可以通过以下步骤来创建Git的远程仓库: 打开GitHub网站,注册或登录账号。 在页面右上角点击“+”按钮,选择“New repository”。 在“Repository name”中输入你想要创建的仓库名…

    GitHub 2023年5月16日
    00
  • 分享10个很棒的学习Android开发的网站

    下面我将详细讲解如何分享10个很棒的学习Android开发的网站。 1. 确定分享的网站 首先要确定分享的网站,需要挑选出适合不同学习阶段的网站,如入门级、进阶级、高级级别的网站。可以参考一些知名的中英文Android开发社区,如掘金,CSDN,Android Developer等。 2. 确定分享的内容 分享内容可以是针对入门级、进阶级、高级级别的网站列表…

    GitHub 2023年5月16日
    00
  • 如何在 ubuntu linux 上配置 go 语言的 qt 开发环境

    下面是 “如何在 Ubuntu Linux 上配置 Go 语言 Qt 开发环境” 的完整攻略,包含两个示例说明。 1. 安装 Qt 通过以下命令安装 Qt: sudo apt-get update sudo apt-get install qt5-default qttools5-dev-tools qtcreator 2. 下载并安装 Go 在 Ubunt…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部