SpringBoot注入配置文件的3种方法详解

这篇文章主要介绍了SpringBoot注入配置文件的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

方案1:@ConfigurationProperties+@Component

定义spring的一个实体bean装载配置文件信息,其它要使用配置信息是注入该实体bean

/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 *   prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
​
  private String lastName;
  private Integer age;
  private Boolean boss;
  private Date birth;
​
  private Map<String,Object> maps;
  private List<Object> lists;
  private Dog dog;

方案2:@Bean+@ConfigurationProperties

我们还可以把@ConfigurationProperties还可以直接定义在@bean的注解上,这是bean实体类就不用@Component和@ConfigurationProperties了,这边是Boot的动态数据源切换的类。

package com.topcheer.oss.base.datasource;
​
import com.alibaba.druid.pool.DruidDataSource;
​
import com.xiaoleilu.hutool.crypto.symmetric.SymmetricAlgorithm;
import com.xiaoleilu.hutool.crypto.symmetric.SymmetricCrypto;
import com.xiaoleilu.hutool.util.CharsetUtil;
import com.xiaoleilu.hutool.util.HexUtil;
​
import lombok.extern.slf4j.Slf4j;
​
@Slf4j
public class UmspscDataSource extends DruidDataSource {
​
  private static final long serialVersionUID = 4766401181052251539L;
​
  private String passwordDis;

  /**
   * 密匙
   */
  private final static String Pkey ="1234565437892132";

  @Override
  public String getPassword() {
    if(passwordDis != null && passwordDis.length() > 0) {
      return passwordDis;
    }
    String encPassword = super.getPassword();
    if(null == encPassword) {
      return null;
    }
    log.info("数据库密码加解密,{" + encPassword + "}");
    try {
      // 密文解密,解密方法可以修改
      String key = HexUtil.encodeHexStr(Pkey);
      SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes());
      passwordDis = aes.decryptStr(encPassword, CharsetUtil.CHARSET_UTF_8);
      return passwordDis;
    } catch (Exception e) {
      log.error("数据库密码解密出错,{"+encPassword + "}");
      //log.error(LogUtil.e(e));
      //throw new Exception("数据库密码解密失败!", e);
      return null;
    }
  }
}
@Bean(name = "systemDataSource")
  @ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource.system")
  public DataSource systemDataSource() {
    return new UmspscDataSource();
  }
​
  @Bean(name = "secondDataSource")
  @ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource.second")
  public DataSource secondDataSource() {
    return new UmspscDataSource();
  }

  @Bean(name="systemJdbcTemplate")
  public JdbcTemplate systemJdbcTemplate(
      @Qualifier("systemDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
  }

  @Bean(name="secondJdbcTemplate")
  public JdbcTemplate secondJdbcTemplate(
      @Qualifier("secondDataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
  }

方案3:@ConfigurationProperties + @EnableConfigurationProperties

我们和上面例子一样注解属性,然后用 Spring的@Autowire来注入 mail configuration bean:

package com.dxz.property;
​
import org.springframework.boot.context.properties.ConfigurationProperties;
​
@ConfigurationProperties(locations = "classpath:mail.properties", ignoreUnknownFields = false, prefix = "mail")
public class MailProperties {
  private String host;
  private int port;
  private String from;
  private String username;
  private String password;
  private Smtp smtp;
​
  // ... getters and setters
  public String getHost() {
    return host;
  }
​
  public void setHost(String host) {
    this.host = host;
  }
​
  public int getPort() {
    return port;
  }
​
  public void setPort(int port) {
    this.port = port;
  }
​
  public String getFrom() {
    return from;
  }
​
  public void setFrom(String from) {
    this.from = from;
  }
​
  public String getUsername() {
    return username;
  }
​
  public void setUsername(String username) {
    this.username = username;
  }
​
  public String getPassword() {
    return password;
  }
​
  public void setPassword(String password) {
    this.password = password;
  }
​
  public Smtp getSmtp() {
    return smtp;
  }
​
  public void setSmtp(Smtp smtp) {
    this.smtp = smtp;
  }

  @Override
  public String toString() {
    return "MailProperties [host=" + host + ", port=" + port + ", from=" + from + ", username=" + username
        + ", password=" + password + ", smtp=" + smtp + "]";
  }
​
  public static class Smtp {
    private boolean auth;
    private boolean starttlsEnable;
​
    public boolean isAuth() {
      return auth;
    }
​
    public void setAuth(boolean auth) {
      this.auth = auth;
    }
​
    public boolean isStarttlsEnable() {
      return starttlsEnable;
    }
​
    public void setStarttlsEnable(boolean starttlsEnable) {
      this.starttlsEnable = starttlsEnable;
    }
  }
}

启动类及测试类:

package com.dxz.property;
​
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
@SpringBootApplication
@EnableConfigurationProperties(MailProperties.class)
public class TestProperty1 {
​
  @Autowired
  private MailProperties mailProperties;

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  @ResponseBody
  public String hello() {
    System.out.println("mailProperties" + mailProperties);
    return "hello world";
  }
​
  public static void main(String[] args) {
    //SpringApplication.run(TestProperty1.class, args);
    new SpringApplicationBuilder(TestProperty1.class).web(true).run(args);
​
  }
}

结果:

请注意@EnableConfigurationProperties注解。该注解是用来开启对@ConfigurationProperties注解配置Bean的支持。也就是@EnableConfigurationProperties注解告诉Spring Boot 能支持@ConfigurationProperties。如果不指定会看到如下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.dxz.property.MailProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

注意: 还有其他办法 (Spring Boot 总是有其他办法!) 让@ConfigurationProperties beans 被添加 – 用@Configuration或者 @Component注解, 这样就可以在 component scan时候被发现了。

  @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot配置文件中数据库密码加密两种方案(推荐)

    SpringBoot项目经常将连接数据库的密码明文放在配置文件里,安全性就比较低一些,尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密. 介绍两种加密方式:jasypt 可加密配置文件中所有属性值; druid 自带了加解密,可对数据库密码进行加密. jasypt 加解密 jasypt 是一个简单易用的加解密Java库,可以快速集成到 Spring 项目中.可以快速集成到 Spring Boot 项目中,并提供了自动配置,使用非常简单. 步骤如下: 1)引入maven依赖 <de

  • Spring boot将配置属性注入到bean类中

    一.@ConfigurationProperties注解的使用 看配置文件,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.com - foo.bar.com - jiaobuchong.com 下面我要将上面的配置属性注入到一个Java Bean类中,看码: import org.springframework.boot.context.properties.ConfigurationProperties; import

  • 兼容Spring Boot 1.x和2.x配置类参数绑定的工具类SpringBootBindUtil

    为了让我提供的通用 Mapper 的 boot-starter 同时兼容 Spring Boot 1.x 和 2.x,增加了这么一个工具类. 在 Spring Boot 中,能够直接注入 XXProperties 类的地方不需要使用这个工具类. 但是在Spring 的接口和启动流程设计中,有些情况下只能通过EnvironmentAware接口得到Environment对象,此时你想得到 XXProperties 类没有更好的办法. 也许有人直接从Environment 对象中遍历获取所有的配置信

  • SpringBoot 配置提示功能(超详细)

    目的 配置自动提示的辅助功能可以让配置写起来更快,准确率大大提高. springboot jar 包含提供所有支持的配置属性细节的元数据文件.文件的目的是为了让 IDE 开发者在用户使用 application.properties 或 application.yml 文件时提供上下文帮助和代码补全. 大多数元数据文件是在编译时通过处理用 @ConfigurationProperties 注释的所有项自动生成的.也可以手动编写部分元数据. 版本 参考 SpringBoot 2.2.0.RELEA

  • SpringBoot配置类编写过程图解

    这篇文章主要介绍了SpringBoot配置类编写过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.编写properties文件 2.编写配置类 3.编译项目将target\classes\META-INF\spring-configuration-metadata.json文件copy到resources\META-INF目录 这样以达到配置文件中自动提示配置项 4.配置文件中配置 5.其他类中可自动注入使用 以上就是本文的全部内容,

  • Spring boot工具类静态属性注入及多环境配置详解

    由于需要访问MongoDB,但是本地开发环境不能直接连接MongoDB,需要通过SecureCRT使用127.0.0.2本地IP代理.但是程序部署到线上生产环境后,是可以直接访问MongoDB的,因此开发好程序后,总是要修改一下MongoDB服务器的IP才能提交代码,这样很是不方便. private static final String PUBCHAT_HOST = "127.0.0.2"; // private static final String PUBCHAT_HOST =

  • Spring Boot Logback配置日志过程解析

    这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 出于性能等原因,Logback 目前是springboot应用日志的标配: 当然有时候在生产环境中也会考虑和三方中间件采用统一处理方式. 配置时考虑点 支持日志路径,日志level等配置 日志控制配置通过application.yml下发 按天生成日志,当天的日志>50MB回滚 最多保存10天日志 生成的日志中Pattern自

  • SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    FastJson是阿里开源的一个高性能的JSON框架,FastJson数据处理速度快,无论序列化(把JavaBean对象转化成Json格式的字符串)和反序列化(把JSON格式的字符串转化为Java Bean对象),都是当之无愧的fast:功能强大(支持普通JDK类,包括javaBean, Collection, Date 或者enum):零依赖(没有依赖其他的任何类库). 1.写一个自定义序列化类 /** * 自定义序列化类 * @param <T> */ public class FastJ

  • SpringBoot注入配置文件的3种方法详解

    这篇文章主要介绍了SpringBoot注入配置文件的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方案1:@ConfigurationProperties+@Component 定义spring的一个实体bean装载配置文件信息,其它要使用配置信息是注入该实体bean /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配

  • SpringBoot 常用读取配置文件的三种方法详解

    目录 前言 一.使用 @Value 读取配置文件 二.使用 @ConfigurationProperties 读取配置文件 1.类上添加@Configuration注解 2.使用@EnableConfigurationProperties注解 3.使用@ConfigurationPropertiesScan扫描 三.使用 Environment 读取配置文件 四.常用的几种数据结构配置读取 我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如

  • SpringBoot注册Servlet的三种方法详解

    本文栈长教你如何在 Spring Boot 注册 Servlet.Filter.Listener. 一.Spring Boot 注册 Spring Boot 提供了 ServletRegistrationBean, FilterRegistrationBean, ServletListenerRegistrationBean 三个类分别用来注册 Servlet, Filter, Listener,下面是 Servlet 的示例代码. import javax.servlet.http.HttpS

  • 详解SpringBoot读取配置文件的N种方法

    我们在项目开发中经常会用到配置信息,例如数据库连接的帐号.密码等,而为了方便维护,我们通常将这些信息放到配置文件中.在需要用到这些配置信息时,可以通过代码获取.下面我们看看Spring中有哪些获取配置信息的方法. PropertiesLoaderUtils读取 通过ClassPathResource加载配置文件资源,结合PropertiesLoaderUtils类读取,源码如下: ClassPathResource resource = new ClassPathResource("applic

  • Springboot配置返回日期格式化五种方法详解

    目录 格式化全局时间字段 1.前端时间格式化(不做无情人) 2.SimpleDateFormat格式化(不推荐) 3.DateTimeFormatter格式化(不推荐) 4.全局时间格式化(推荐) 实现原理分析 5.部分时间格式化(推荐) 总结 应急就这样 格式化全局时间字段 在yml中添加如下配置: spring.jackson.date-format=yyyy-MM-dd HH:mm:ss 或者 spring: jackson: ## 格式为yyyy-MM-dd HH:mm:ss date-

  • SpringBoot读取配置文件的五种方法总结

    目录 1.使用 @Value 读取配置文件 2.使用 @ConfigurationProperties 读取配置文件 3.使用 Environment 读取配置文件 4.使用 @PropertySource 读取配置文件 中文乱码 注意事项 5.使用原生方式读取配置文件 总结 Spring Boot 中读取配置文件有以下 5 种方法: 使用 @Value 读取配置文件. 使用 @ConfigurationProperties 读取配置文件. 使用 Environment 读取配置文件. 使用 @

  • SpringBoot处理接口幂等性的两种方法详解

    目录 1. 接口幂等性实现方案梳理 1.1 基于 Token 1.2 基于请求参数校验 2. 基于请求参数的校验 在上周发布的 TienChin 项目视频中,我和大家一共梳理了六种幂等性解决方案,接口幂等性处理算是一个非常常见的需求了,我们在很多项目中其实都会遇到.今天我们来看看两种比较简单的实现思路. 1. 接口幂等性实现方案梳理 其实接口幂等性的实现方案还是蛮多的,我这里和小伙伴们分享两种比较常见的方案. 1.1 基于 Token 基于 Token 这种方案的实现思路很简单,整个流程分两步:

  • SpringBoot+WebSocket实现即时通讯的方法详解

    目录 环境信息 服务端实现 导入依赖 创建配置类 创建一个注解式的端点并在其中通过配套注解声明回调方法 服务端主动发送消息给客户端 客户端实现 Java客户端实现 在前端环境(vue)中使用websocket 环境信息 名称 版本号 Spring Boot 2.4.5 Idea 2021.3.2 服务端实现 导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp

  • SpringBoot+Elasticsearch实现数据搜索的方法详解

    目录 一.简介 二.代码实践 2.1.导入依赖 2.2.配置环境变量 2.3.创建 elasticsearch 的 config 类 2.4.索引管理 2.5.文档管理 三.小结 一.简介 在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用. 实际的项目开发过程中,我们通常基于某些主流框架平台进行技术开发,比如 SpringBoot,今天我们就以 SpringBoot 整合 ElasticSearch 为例,给大家详细的介绍 Elast

  • Spring为IOC容器注入Bean的五种方式详解

    这篇文章主要介绍了Spring为IOC容器注入Bean的五种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一 @Import导入组件,id默认是组件的全类名 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: @Conditional({WindowsCondition.class}) @Configuration @Import({Color.class,Red.class,MyImportSelector

随机推荐