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

目录

  • 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;}@Overridepublic 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类对象@AutowiredUser 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;}@Overridepublic 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 {@Beanpublic 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.hqwc.cn/news/15656.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日撸java三百行day74

文章目录 说明通用BP神经网络之激活函数1. 激活函数2. 激活函数分类1.1 反正切函数&#xff08;ArcTan&#xff09;1.2 指数线性函数&#xff08;ELU&#xff09;1.3 恒等函数1.4 泄漏线性整流函数(LEAKY_RELU)1.5 softsign1.6 softplus1.7 Relu函数1.8 sigmoid函数1.9 双曲正切…

学生信息管理系统——C语言版

C语言版学生信息管理系统 一&#xff0c;开发环境 操作系统&#xff1a;windows10, windows11, linux, mac等。开发工具&#xff1a;Qt, vscode, visual studio等开发语言&#xff1a;c语言 二&#xff0c;功能需求 1. 用户界面: 提供一个简洁的文本界面&#xff0c;用户可…

vs code insiders 配置c语言

vs code insiders 配置c语言 1.下载插件 2.再配置代码 &#xff08;1&#xff09;launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/…

Android Studio实现内容丰富的安卓校园新闻浏览平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号070 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看新闻列表…

springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库

一、重点 代码讲解&#xff1a;6-点赞功能-定时持久化到数据库-pipelinelua-优化pipeline_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1yP411C7dr 代码&#xff1a; blogLike_schedule/like06 xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://g…

SGM58031与单片机驱动实现

SGM58031与单片机驱动实现 文章目录 SGM58031与单片机驱动实现CUBEIDE设置I2C通讯封装SGM58031通讯实现 CUBEIDE设置 使用硬件I2C与sgm芯片通讯&#xff0c;上面即配置硬件I2C,其他参数默认即可。 I2C通讯封装 封装实现 /*** brief Manages error callback by re-initializ…

Element-UI 实现动态增加多个输入框并校验

文章目录 前言实现通过按钮动态增加表单并验证必填实现动态多个输入框为行内模式&#xff0c;其它为行外模式 前言 在做复杂的动态表单&#xff0c;实现业务动态变动&#xff0c;比如有一条需要动态添加的el-form-item中包含了多个输入框&#xff0c;并实现表单验证&#xff0…

CTFHub XSS DOM跳转 WriteUp

前文&#xff1a;DOM反射XSS 进入网站&#xff0c;直接查看源代码&#xff0c;下面是关键代码&#xff0c;这里有xss漏洞&#xff1a; <script>var target location.search.split("")if (target[0].slice(1) "jumpto") {location.href target[1…

vue项目中的vue.config.js配置文件中的proxy代理post一直在预检

记录一个比较有意思的bug,帮别人调试遇到的&#xff0c;一个哥们一直在群里问了好几次同一个问题了&#xff0c;他配置了代理&#xff0c;请求一直在发送&#xff0c;postman测试没问题&#xff0c;可以成功接收到&#xff0c;但是在项目前端请求&#xff0c;确实一点响应没有&…

Qt/C++原创项目作品精选(祖传原创/性能凶残)

00 前言说明 从事Qt开发十年有余&#xff0c;一开始是做C#.NET开发的&#xff0c;因为项目需要&#xff0c;转行做嵌入式linux开发&#xff0c;在嵌入式linux上做可视化界面开发一般首选Qt&#xff0c;当然现在可选的方案很多比如安卓&#xff0c;但是十多年前那时候板子性能低…

Nginx常用配置及和基本功能讲解

Nginx已经广泛应用于J-one和Jdos的环境部署上&#xff0c;本文对Nginx的常用的配置和基本功能进行讲解&#xff0c;适合Ngnix入门学习。 一、核心配置 找到Nginx安装目录下的conf目录下nginx.conf文件&#xff0c;Nginx的基本功能配置是由它提供的。 配置文件结构 Nginx的配…

linux中安装nginx

2.安装nginx 2.1 安装nginx前&#xff0c;需要安装的依赖&#xff08;可能是由于nginx版本旧原因&#xff0c;可能最新或较新版本不需安装这些依赖&#xff09; 如下四个依赖需要安装到linux中 2.1.1 安装 pcre 依赖 &#xff08;使用wget命令&#xff09; 步骤一&#xff1…