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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。