SpringBoot注入配置文件的3种方法详解
这篇文章主要介绍了SpringBoot注入配置文件的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
方案1:@ConfigurationProperties+@Component
定义spring的一个实体bean装载配置文件信息,其它要使用配置信息是注入该实体bean
/**
*将配置文件中配置的每一个属性的值,映射到这个组件中
*@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
*prefix="person":配置文件中哪个下面的所有属性进行一一映射
*
*只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix="person")
publicclassPerson{
privateStringlastName;
privateIntegerage;
privateBooleanboss;
privateDatebirth;
privateMapmaps;
privateList
方案2:@Bean+@ConfigurationProperties
我们还可以把@ConfigurationProperties还可以直接定义在@bean的注解上,这是bean实体类就不用@Component和@ConfigurationProperties了,这边是Boot的动态数据源切换的类。
packagecom.topcheer.oss.base.datasource;
importcom.alibaba.druid.pool.DruidDataSource;
importcom.xiaoleilu.hutool.crypto.symmetric.SymmetricAlgorithm;
importcom.xiaoleilu.hutool.crypto.symmetric.SymmetricCrypto;
importcom.xiaoleilu.hutool.util.CharsetUtil;
importcom.xiaoleilu.hutool.util.HexUtil;
importlombok.extern.slf4j.Slf4j;
@Slf4j
publicclassUmspscDataSourceextendsDruidDataSource{
privatestaticfinallongserialVersionUID=4766401181052251539L;
privateStringpasswordDis;
/**
*密匙
*/
privatefinalstaticStringPkey="1234565437892132";
@Override
publicStringgetPassword(){
if(passwordDis!=null&&passwordDis.length()>0){
returnpasswordDis;
}
StringencPassword=super.getPassword();
if(null==encPassword){
returnnull;
}
log.info("数据库密码加解密,{"+encPassword+"}");
try{
//密文解密,解密方法可以修改
Stringkey=HexUtil.encodeHexStr(Pkey);
SymmetricCryptoaes=newSymmetricCrypto(SymmetricAlgorithm.AES,key.getBytes());
passwordDis=aes.decryptStr(encPassword,CharsetUtil.CHARSET_UTF_8);
returnpasswordDis;
}catch(Exceptione){
log.error("数据库密码解密出错,{"+encPassword+"}");
//log.error(LogUtil.e(e));
//thrownewException("数据库密码解密失败!",e);
returnnull;
}
}
}
@Bean(name="systemDataSource")
@ConfigurationProperties(ignoreUnknownFields=false,prefix="spring.datasource.system")
publicDataSourcesystemDataSource(){
returnnewUmspscDataSource();
}
@Bean(name="secondDataSource")
@ConfigurationProperties(ignoreUnknownFields=false,prefix="spring.datasource.second")
publicDataSourcesecondDataSource(){
returnnewUmspscDataSource();
}
@Bean(name="systemJdbcTemplate")
publicJdbcTemplatesystemJdbcTemplate(
@Qualifier("systemDataSource")DataSourcedataSource){
returnnewJdbcTemplate(dataSource);
}
@Bean(name="secondJdbcTemplate")
publicJdbcTemplatesecondJdbcTemplate(
@Qualifier("secondDataSource")DataSourcedataSource){
returnnewJdbcTemplate(dataSource);
}
方案3:@ConfigurationProperties+@EnableConfigurationProperties
我们和上面例子一样注解属性,然后用Spring的@Autowire来注入mailconfigurationbean:
packagecom.dxz.property;
importorg.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(locations="classpath:mail.properties",ignoreUnknownFields=false,prefix="mail")
publicclassMailProperties{
privateStringhost;
privateintport;
privateStringfrom;
privateStringusername;
privateStringpassword;
privateSmtpsmtp;
//...gettersandsetters
publicStringgetHost(){
returnhost;
}
publicvoidsetHost(Stringhost){
this.host=host;
}
publicintgetPort(){
returnport;
}
publicvoidsetPort(intport){
this.port=port;
}
publicStringgetFrom(){
returnfrom;
}
publicvoidsetFrom(Stringfrom){
this.from=from;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicSmtpgetSmtp(){
returnsmtp;
}
publicvoidsetSmtp(Smtpsmtp){
this.smtp=smtp;
}
@Override
publicStringtoString(){
return"MailProperties[host="+host+",port="+port+",from="+from+",username="+username
+",password="+password+",smtp="+smtp+"]";
}
publicstaticclassSmtp{
privatebooleanauth;
privatebooleanstarttlsEnable;
publicbooleanisAuth(){
returnauth;
}
publicvoidsetAuth(booleanauth){
this.auth=auth;
}
publicbooleanisStarttlsEnable(){
returnstarttlsEnable;
}
publicvoidsetStarttlsEnable(booleanstarttlsEnable){
this.starttlsEnable=starttlsEnable;
}
}
}
启动类及测试类:
packagecom.dxz.property;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.boot.builder.SpringApplicationBuilder;
importorg.springframework.boot.context.properties.EnableConfigurationProperties;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.ResponseBody;
importorg.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
@EnableConfigurationProperties(MailProperties.class)
publicclassTestProperty1{
@Autowired
privateMailPropertiesmailProperties;
@RequestMapping(value="/hello",method=RequestMethod.GET)
@ResponseBody
publicStringhello(){
System.out.println("mailProperties"+mailProperties);
return"helloworld";
}
publicstaticvoidmain(String[]args){
//SpringApplication.run(TestProperty1.class,args);
newSpringApplicationBuilder(TestProperty1.class).web(true).run(args);
}
}
结果:
请注意@EnableConfigurationProperties注解。该注解是用来开启对@ConfigurationProperties注解配置Bean的支持。也就是@EnableConfigurationProperties注解告诉SpringBoot能支持@ConfigurationProperties。如果不指定会看到如下异常:
Causedby:org.springframework.beans.factory.NoSuchBeanDefinitionException:Noqualifyingbeanoftype[com.dxz.property.MailProperties]foundfordependency:expectedatleast1beanwhichqualifiesasautowirecandidateforthisdependency.Dependencyannotations:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
注意:还有其他办法(SpringBoot总是有其他办法!)让@ConfigurationPropertiesbeans被添加–用@Configuration或者@Component注解,这样就可以在componentscan时候被发现了。
| @ConfigurationProperties | @Value | |
|---|---|---|
| 功能 | 批量注入配置文件中的属性 | 一个个指定 |
| 松散绑定(松散语法) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。