SpringBoot的@ConfigurationProperties、@Autowired、@Conditional注解

news2024/9/20 8:47:06

目录

  • 1. @ConfigurationProperties + @EnableConfigurationProperties + @Autowired注解
    • 1.1 configuration自定义配置参数自动补全功能
  • 2. @Conditional注解

1. @ConfigurationProperties + @EnableConfigurationProperties + @Autowired注解

在resources/application.properties文件中,定义key和value,格式为:前缀.类属性 = 值。如下所示:

server.port = 8088

# 格式:前缀.类属性 = 值
user.test.name = user1

如果User类的属性为userName,则参数为user.test.user-name

使用@ConfigurationProperties注解修饰User类,将application.properties中匹配前缀的值赋值给User类属性。User类必须要有无参构造器

package com.hh.springbootTest.myBean;

import org.springframework.boot.context.properties.ConfigurationProperties;

// 将application.properties中user.test前缀对应的值赋值给User类属性
@ConfigurationProperties(prefix = "user.test")
public class User {

    private String name;

    public User() {

    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "User{" + "name='" + name + "'}";
    }
}

使用@EnableConfigurationProperties开启User类的配置绑定功能。User类会自动添加到容器中。必须和@Configuration注解一起使用。如下所示:

package com.hh.springbootTest.myConfig;

import com.hh.springbootTest.myBean.User;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

// 开启User类的配置绑定功能。User类会自动添加到容器中
@EnableConfigurationProperties(User.class)
@Configuration
public class MyConfig {

}

除了使用@EnableConfigurationProperties将User添加到容器中,在User类上直接使用@Component注解等,也会将User添加到容器

使用@Autowired注解从IOC容器自动获取User类对象,如下所示:

package com.hh.springbootTest.myController;

import com.hh.springbootTest.myBean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    // 从IOC容器自动获取User类对象
    @Autowired
    User user;

    @RequestMapping("/user")
    public User userName1() {
        return user;
    }

}

然后访问http://localhost:8088/user,显示的效果如下:
ConfigurationProperties测试效果

1.1 configuration自定义配置参数自动补全功能

为了提高我们的开发效率,对application.properties或application.yaml中,我们自定义的配置参数,实现自动补全功能,操作如下:

在pom.xml中添加依赖

......省略部分......
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

......省略部分......
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            
......省略部分......

然后重新运行springboot项目。之后application.properties或application.yaml中,我们自定义的配置参数就有自动补全功能了

2. @Conditional注解

@Conditional有很多注解,常用的如下所示:

  • @ConditionalOnBean:IOC容器中有规定的组件,才执行操作
  • @ConditionalOnMissingBean:IOC容器中没有规定的组件,才执行操作
  • @ConditionalOnClass(name = “com.hh.xxx”):maven有依赖规定的类,才执行操作
  • @ConditionalOnMissingClass(value = “com.hh.xxx”):maven没有依赖规定的类,才执行操作
  • @ConditionalOnWebApplication:程序是springboot的web应用,才执行操作
  • @ConditionalOnNotWebApplication:程序不是springboot的web应用,才执行操作
  • @ConditionalOnProperty:程序中有规定的属性,才执行操作
  • @ConditionalOnResource:程序中有规定的配置文件,才执行操作
  • @ConditionalOnJava:程序是基于规定的java版本,才执行操作
  • @ConditionalOnSingleCandidate:IOC容器中规定的类只有一个实例,才执行操作

下面以@ConditionalOnMissingBean为例,进行讲解:

User类,如下所示:

package com.hh.springbootTest.myBean;

public class User {

    private String name;

    public User(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "User{" + "name='" + name + "'}";
    }
}

@ConditionalOnBean可以修饰类也可以修饰方法。characterEncodingFilter这个bean在执行完该操作后,才添加到IOC容器,所以这里的条件结果为false。则不会向IOC容器添加MyConfig和userName1。如下所示:

package com.hh.springbootTest.myConfig;

import com.hh.springbootTest.myBean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// characterEncodingFilter这个bean在执行完该操作后,才添加到IOC容器,所以这里的条件结果为false
// 则不会向IOC容器添加MyConfig和userName1
@ConditionalOnBean(name = "characterEncodingFilter")
@Configuration
public class MyConfig {

    @Bean
    public User userName1() {
        return new User("user1");
    }


}

执行程序,查看IOC容器是不存在name为userName1的组件的,如下所示:

package com.hh.springbootTest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext applicationContext =
                SpringApplication.run(MyApplication.class, args);

        // 判断IOC容器是否包含指定name的组件
        boolean containsUser1 = applicationContext.containsBean("userName1");
        System.out.println(containsUser1);      // 返回的结果是:false
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

map、foreach 和 for ,多角度对比

for 1.访问元素和操作方式------通过索引访问数组元素&#xff0c;并可以执行任意操作。 const numbers [1, 2, 3, 4, 5];// for循环示例 for (let i 0; i < numbers.length; i) {console.log("Number (for loop): " numbers[i]); } 2.索引控制--------通过…

非线性系统的混沌特性分析方法--相图/分岔图分析法

非线性系统的混沌特性分析方法–相图/分岔图分析法 ​ 混沌映射被用于生成混沌序列&#xff0c;这是一种由简单的确定性系统产生的随机性序列。一般混沌序列具有以下主要特征&#xff1a; 非线性&#xff1b;对初值的敏感依赖性&#xff1b;遍历性&#xff1b;随机性&#xf…

【Linux初阶】基础IO - 磁盘 文件系统

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;认识磁盘&#xff08;物理结构、储存结构、逻辑结构、读取单位&#xff09;&#xff0c;理解文件系统&#xf…

会声会影2023最新免费版零基础上手视频剪辑工具

比如会声会影视频编辑软件&#xff0c;既加入光影、动态特效的滤镜效果&#xff0c;也提供了与色彩调整相关的LUT配置文件滤镜&#xff0c;可选择性大&#xff0c;运用起来更显灵活。会声会影在用户的陪伴下走过20余载&#xff0c;经过上百个版本的优化迭代&#xff0c;已将操作…

【消息队列RabbitMQ】一、RabbitMQ认识

这里写目录标题 RabbitMQSpringboot整合RabbitMQRabbitMQ的常见开发模式如何保证消息的可靠生产和可靠投递什么是死值队列和延迟队列 RabbitMQ 消息队列有&#xff1a; 1、ActiveMQ 2、RabbitMQ 3、ZeroMQ 4、Kafka 什么是RabbitMQ&#xff1f; RabbitMQ是一个开源的消息队列服…

第23章:范式

一、范式 1.什么是范式 关于数据表设计的基本原则&#xff0c;规则就是范式NF。 2.范式都包括哪些&#xff1f; 第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;、巴斯-科德范式&#xff08;BCNF - Boyce…

两台电脑如何共享文件?6步快速完成!

电脑之间共享文件已经成为日常工作中不可或缺的一部分。无论是在家庭环境中与家人共享照片和视频&#xff0c;还是在办公室中与同事共享文档和数据&#xff0c;了解两台电脑如何共享文件是非常重要的。 但在实际操作中&#xff0c;如何更好的使两台电脑共享文件&#xff0c;也…

多层感知机(MLP)算法原理和代码实现

文章目录 多层感知机入门算法优化原理sklearn代码实现核心优缺点分析 多层感知机入门 神经网络在最近几年&#xff0c;是个很火的名词了。常听到的卷积神经网络(CNN)或者循环神经网络(RNN&#xff09;&#xff0c;都可以看做是神经网络在特定场景下的具体应用方式。 本文我们…

干货 | 智能网联汽车大数据基础平台构建研究

以下内容整理自大数据能力提升项目必修课《大数据系统基础》同学们的期末答辩汇报。 各位老师大家上午好&#xff0c;我们组的题目是智能网联汽车大数据基础平台的构建。我们的指导企业是西部智联。我们的汇报将从这五个方面进行展开&#xff0c;第一个方面是项目背景与需求分析…

uni-app基础知识

发展 DCloud于2012年开始研发小程序技术&#xff0c;优化webview的功能和性能&#xff0c;并加入W3C和HTML5中国产业联盟。 2015年&#xff0c;DCloud正式商用了自己的小程序&#xff0c;产品名为“流应用”&#xff0c;它不是B/S模式的轻应用&#xff0c;而是能接近原生功能…

Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库

Debezium系列之&#xff1a;基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库 一、背景二、技术路线三、配置四、从mysql同步数据到Elasticsearch和PostgreSQL数据库五、总结 一、背景 基于 Debezium 的端到端数据流用例&#xff0c;将数据流式传…

I/O 多路复用小结

Socket 模型 Socket 编程是一种使用 Socket 模型进行网络通信的编程技术。它是一种基于网络套接字的编程模型&#xff0c;用于实现不同计算机之间的数据传输。 事实上&#xff0c;在进行网络通信前&#xff0c;通信双方都要创建一个 Socket&#xff0c;双方的数据读写都要依赖于…

【Python】执行SQL报错

可以再数据库查询界面执行的SQL&#xff0c;一直报错 unsupported format character Y (0x59) at index 61 SQL如下&#xff1a; datapd.read_sql_query(sql"""selectdate_format(create_time,%Y-%m) as mon,count(distinct order_id) as ord_cntfrom prod.o…

HTTP与HTTPS

HTTP与HTTPS介绍 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息&#xff0c;HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息&…

qt源码--事件系统

qt的事件传播主要依赖于QCoreApplication、QAbstractEventDispatcher&#xff08;会根据不同的平台生成各自的处理对象&#xff09;、QEvent&#xff08;各种事件类型&#xff09;等。 首先看下QCoreApplication的实现&#xff1a; 2、了解QCoreApplication的构造函数 其构造函…

在最新ICP备案域名的基础上,结合其他网络营销手段,打造强大的品牌推广效果

API接口是一种软件系统之间进行交互的方式&#xff0c;通过API接口&#xff0c;可以在不同的系统之间传递数据、命令等信息。在网络营销中&#xff0c;API接口可以帮助我们更加高效地进行品牌推广。本文将以在最新ICP备案域名的基础上&#xff0c;结合其他网络营销手段&#xf…

JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)

1.标记-清除算法 最基础的算法&#xff0c;分为两个阶段&#xff0c;“标记”和“清除” 原理&#xff1a; - 标记阶段&#xff1a;collector从mutator根对象开始进行遍历&#xff0c;对从mutator根对象可以访问到的对象都打上一个标识&#xff0c;一般是在对象的header中&am…

vue-router 4.0 动态路由会跳转到 404 页面的问题

引子 开发过前端单页面应用的小伙伴们&#xff0c;应该对前端路由都不陌生吧。 无论是用 vue 或者 react&#xff0c;都有官方提供的 router 方案。 但是有些场景下&#xff0c;处于安全性和友好性考虑&#xff0c;我们需要用到动态路由。 如果你不知道什么叫动态路由&…

翻遍整个牛客网,整理出了全网最全的Java面试八股文大合集,整整4000多页

大家从 Boss 直聘上或者其他招聘网站上都可以看到 Java 岗位众多&#xff0c;Java 岗位的招聘薪酬天差地别&#xff0c;人才要求也是五花八门。而很多 Java 工程师求职过程中&#xff0c;也是冷暖自知。很多时候技术有&#xff0c;但是面试的时候就是过不了&#xff01; 为了帮…

4.7 x64dbg 应用层的钩子扫描

所谓的应用层钩子&#xff08;Application-level hooks&#xff09;是一种编程技术&#xff0c;它允许应用程序通过在特定事件发生时执行特定代码来自定义或扩展其行为。这些事件可以是用户交互&#xff0c;系统事件&#xff0c;或者其他应用程序内部的事件。应用层钩子是在应用…