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;
SpringBoot注入配置文件的3种方法的更多相关文章
- Springboot读取配置文件的两种方法
第一种: application.yml配置中的参数: zip: Hello Springboot 方法读取: @RestController public class ControllerTest ...
- java读取配置文件的几种方法
java读取配置文件的几种方法 原文地址:http://hbcui1984.iteye.com/blog/56496 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配 ...
- Spring---加载配置文件的几种方法(org.springframework.beans.factory.BeanDefinitionStoreException)
Spring中的几种容器都支持使用xml装配bean,包括:XmlBeanFactory ,ClassPathXmlApplicationContext ,FileSystemXmlApplicati ...
- SpringBoot 常用读取配置文件的 3 种方法!
我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如何配置呢? 本篇主要解决如下几个问题: 1.Spring Boot有哪些常用的读取配置文件方式 ...
- java读取.properties配置文件的几种方法
读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...
- flask配置文件的几种方法
配置文件的参数 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG': get_debug_flag(default=False), 是 ...
- spring注入bean的三种方法
在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...
- 【转载】java读取.properties配置文件的几种方法
读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...
- flask加载配置文件的三种方法
1.第一种方法也是我们最长用到的,包括我们项目中也是采用第一种的方法,加载配置文件 配置信息全部写在config.py里面,在主app.py的文件中写入 import config app.confi ...
随机推荐
- Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?
环境: windows python3.6.5 模块: requests selenium json re urllib 环境与模块介绍完毕后,就可以来实行我们的操作了. 第1步: 通过一个解析网站: ...
- 正则表达式在Java中使用
正则表达式 定义 用一组特殊的字符来描述一组字符串的格式 用于验证字符串是否满足格式 不关心字符串的内容是否有效 1. 基本正则表达式所谓正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式 ...
- ELK 学习笔记之 elasticsearch bool组合查询
elasticsearch bool组合查询: 相当于sql:where _type = 'books' and (price = 500 or title = 'bigdata') Note: mu ...
- ELK 学习笔记之 elasticsearch基本概念和CRUD
elasticsearch基本概念和CRUD: 基本概念: CRUD: 创建索引: curl -XPUT 'http://192.168.1.151:9200/library/' -d '{" ...
- .NET斗鱼直播弹幕客户端(上)
现在直播平台由于弹幕的存在,主播与观众可以更轻松地进行互动,非常受年轻群众的欢迎.斗鱼TV就是一款非常流行的直播平台,弹幕更是非常火爆.看到有不少主播接入弹幕语音播报器.弹幕点歌等模块,这都需要首先连 ...
- python模块常用用法
1.time模块(※※※※) import time #导入时间模块 print(time.time()) #返回当前时间的时间戳,可用于计算程序运行时间 print(time.localtime() ...
- 【Java基础】Java开发过程中的常用工具类库
目录 Java开发过程中的常用工具类库 1. Apache Commons类库 2. Guava类库 3. Spring中的常用工具类 4. 其他工具 参考 Java开发过程中的常用工具类库 1. A ...
- python入门之jieba库的使用
对于一段英文,如果希望提取其中的的单词,只需要使用字符串处理的split()方法即可,例如“China is a great country”. 然而对于中文文本,中文单词之间缺少分隔符,这是中文 ...
- cocos2dx 3.2 内存管理
一.引用计数(cocos2d-x3.2的Node类中用到) 概念:记录当前对象被引用的次数.当次数为0时释放. 1 . retain 与 release 每调用一次retain()使计数+1 每调用 ...
- Flask中g对象,以及g,session,flash之间的区别
一.g对象的使用 专门用来存储用户信息的g对象,g的全称的为global g对象在一次请求中的所有的代码的地方,都是可以使用的 g对象的使用: 设置:g.变量名= 变量值 获取:g.name 注意:g ...