java 注入配置文件_SpringBoot注入配置文件的3种方法

方案1:@ConfigurationProperties+@Component

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

3 /**

4 * 将配置文件中配置的每一个属性的值,映射到这个组件中5 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;6 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射7 *8 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;9 *10 */

11 @Component12 @ConfigurationProperties(prefix = "person")13 public classPerson {14 ​15 privateString lastName;16 privateInteger age;17 privateBoolean boss;18 privateDate birth;19 ​20 private Mapmaps;21 private Listlists;22 private Dog dog;

方案2:@Bean+@ConfigurationProperties

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

1 packagecom.topcheer.oss.base.datasource;2 ​3 importcom.alibaba.druid.pool.DruidDataSource;4 ​5 importcom.xiaoleilu.hutool.crypto.symmetric.SymmetricAlgorithm;6 importcom.xiaoleilu.hutool.crypto.symmetric.SymmetricCrypto;7 importcom.xiaoleilu.hutool.util.CharsetUtil;8 importcom.xiaoleilu.hutool.util.HexUtil;9 ​10 importlombok.extern.slf4j.Slf4j;11 ​12 @Slf4j13 public class UmspscDataSource extendsDruidDataSource {14 ​15 private static final long serialVersionUID = 4766401181052251539L;16 ​17 privateString passwordDis;18

19 /**

20 * 密匙21 */

22 private final static String Pkey ="1234565437892132";23

24 @Override25 publicString getPassword() {26 if(passwordDis != null && passwordDis.length() > 0) {27 returnpasswordDis;28 }29 String encPassword = super.getPassword();30 if(null ==encPassword) {31 return null;32 }33 log.info("数据库密码加解密,{" + encPassword + "}");34 try{35 //密文解密,解密方法可以修改

36 String key =HexUtil.encodeHexStr(Pkey);37 SymmetricCrypto aes = newSymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes());38 passwordDis =aes.decryptStr(encPassword, CharsetUtil.CHARSET_UTF_8);39 returnpasswordDis;40 } catch(Exception e) {41 log.error("数据库密码解密出错,{"+encPassword + "}");42 //log.error(LogUtil.e(e));43 //throw new Exception("数据库密码解密失败!", e);

44 return null;45 }46 }47 ​48 }

1 @Bean(name = "systemDataSource")2 @ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource.system")3 publicDataSource systemDataSource() {4 return newUmspscDataSource();5 }6 ​7 @Bean(name = "secondDataSource")8 @ConfigurationProperties(ignoreUnknownFields = false, prefix = "spring.datasource.second")9 publicDataSource secondDataSource() {10 return newUmspscDataSource();11 }12

13 @Bean(name="systemJdbcTemplate")14 publicJdbcTemplate systemJdbcTemplate(15 @Qualifier("systemDataSource") DataSource dataSource) {16 return newJdbcTemplate(dataSource);17 }18

19 @Bean(name="secondJdbcTemplate")20 publicJdbcTemplate secondJdbcTemplate(21 @Qualifier("secondDataSource") DataSource dataSource) {22 return newJdbcTemplate(dataSource);23 }

方案3:@ConfigurationProperties + @EnableConfigurationProperties

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

1 packagecom.dxz.property;2 ​3 importorg.springframework.boot.context.properties.ConfigurationProperties;4 ​5 @ConfigurationProperties(locations = "classpath:mail.properties", ignoreUnknownFields = false, prefix = "mail")6 public classMailProperties {7 privateString host;8 private intport;9 privateString from;10 privateString username;11 privateString password;12 privateSmtp smtp;13 ​14 //... getters and setters

15 publicString getHost() {16 returnhost;17 }18 ​19 public voidsetHost(String host) {20 this.host =host;21 }22 ​23 public intgetPort() {24 returnport;25 }26 ​27 public void setPort(intport) {28 this.port =port;29 }30 ​31 publicString getFrom() {32 returnfrom;33 }34 ​35 public voidsetFrom(String from) {36 this.from =from;37 }38 ​39 publicString getUsername() {40 returnusername;41 }42 ​43 public voidsetUsername(String username) {44 this.username =username;45 }46 ​47 publicString getPassword() {48 returnpassword;49 }50 ​51 public voidsetPassword(String password) {52 this.password =password;53 }54 ​55 publicSmtp getSmtp() {56 returnsmtp;57 }58 ​59 public voidsetSmtp(Smtp smtp) {60 this.smtp =smtp;61 }62

63 @Override64 publicString toString() {65 return "MailProperties [host=" + host + ", port=" + port + ", from=" + from + ", username=" +username66 + ", password=" + password + ", smtp=" + smtp + "]";67 }68 ​69 public static classSmtp {70 private booleanauth;71 private booleanstarttlsEnable;72 ​73 public booleanisAuth() {74 returnauth;75 }76 ​77 public void setAuth(booleanauth) {78 this.auth =auth;79 }80 ​81 public booleanisStarttlsEnable() {82 returnstarttlsEnable;83 }84 ​85 public void setStarttlsEnable(booleanstarttlsEnable) {86 this.starttlsEnable =starttlsEnable;87 }88 ​89 }90 }

启动类及测试类:

1 packagecom.dxz.property;2 ​3 importorg.springframework.beans.factory.annotation.Autowired;4 importorg.springframework.boot.autoconfigure.SpringBootApplication;5 importorg.springframework.boot.builder.SpringApplicationBuilder;6 importorg.springframework.boot.context.properties.EnableConfigurationProperties;7 importorg.springframework.web.bind.annotation.RequestMapping;8 importorg.springframework.web.bind.annotation.RequestMethod;9 importorg.springframework.web.bind.annotation.ResponseBody;10 importorg.springframework.web.bind.annotation.RestController;11 ​12 @RestController13 @SpringBootApplication14 @EnableConfigurationProperties(MailProperties.class)15 public classTestProperty1 {16 ​17 @Autowired18 privateMailProperties mailProperties;19

20 @RequestMapping(value = "/hello", method =RequestMethod.GET)21 @ResponseBody22 publicString hello() {23 System.out.println("mailProperties" +mailProperties);24 return "hello world";25 }26 ​27 public static voidmain(String[] args) {28 //SpringApplication.run(TestProperty1.class, args);

29 new SpringApplicationBuilder(TestProperty1.class).web(true).run(args);30 ​31 }32 }

结果:

4f55e3705c66f9ec1e3d62cd49fff420.png

请注意@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 总是有其他办法!) 让@ConfigurationPropertiesbeans 被添加 – 用@Configuration或者 @Component注解, 这样就可以在 component scan时候被发现了。

@ConfigurationProperties@Value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值