好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot从配置文件中获取属性的四种方法总结

方式一: @Value

基本类型属性注入,直接在字段上添加@Value("${xxx.xxx}")即可.注意这里用的是$,而不是#.@Value注入的属性,一般其他属性没有关联关系.

配置文件

?

1

2

3

4

user:

   name: Manaphy

   age: 19

   sex: male

方式二: @ConfigurationProperties

配置文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

@RestController

public class ConfigPropertiesController {

     @Value ( "${user.name}" )

     private String name;

     @Value ( "${user.age}" )

     private Integer age;

     @Value ( "${user.sex}" )

     private String sex;

     @GetMapping ( "/user" )

     public String getUser() {

         return "{name:" + name + ",age:" + age + ",sex:" + sex + "}" ;

     }

}

JavaBean

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/**

  * 将配置文件中配置的每一个属性的值,映射到这个组件中

  * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;

  * prefix = "person":配置文件中哪个下面的所有属性进行一一映射

  * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能

  */

@Component

@ConfigurationProperties (prefix = "person" )

@Data

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;

}

@Data

class Dog {

     private String name;

     private Integer age;

}

Controller层

?

1

2

3

4

5

6

7

8

9

@RestController

public class PersonController {

     @Autowired

     private Person person;

     @GetMapping ( "/person" )

     public Person getPerson() {

         return person;

     }

}

运行结果如下

我们可以导入配置文件处理器,以后编写配置就有提示了

?

1

2

3

4

5

< dependency >

     < groupId >org.springframework.boot</ groupId >

     < artifactId >spring-boot-configuration-processor</ artifactId >

     < optional >true</ optional >

</ dependency >

@Value和@ConfigurationProperties比较

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


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

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

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

方式三: @PropertySource

配置文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

person.lastName=chen

person.age= 22

person.boss= false

person.birth= 2017 / 12 / 12

person.map1.k1=v1

person.map1.k2=v2

person.map2[k1]=v1

person.map2[k2]=v2

person.list[ 0 ]=zhang

person.list[ 1 ]=wang

person.list2=zhao,qian,sun,li

person.dog.name=小狗

person.dog.age= 12

JavaBean

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

@Component

@ConfigurationProperties (prefix = "person" )

//如果只有一个主配置类文件,@PropertySource可以不写

@PropertySource ( "classpath:person.properties" )

@Data

public class Person {

     private String lastName;

     private Integer age;

     private Boolean boss;

     private Date birth;

     private Map<String, Object> map1;

     private Map<String, Object> map2;

     private List<Object> list;

     private List<Object> list2;

     private Dog dog;

}

@Data

class Dog {

     private String name;

     private Integer age;

}

测试同方式二

方式四: 使用工具类 无需注入获取.yml中的值

新建 BeanConfiguration 类,用于项目启动构造我们的工具类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

@Configuration

@Slf4j

public class BeanConfiguration {

     @Bean

     public YamlConfigurerUtil ymlConfigurerUtil() {

         //1:加载配置文件

         Resource app = new ClassPathResource( "application.yml" );

         Resource appDev = new ClassPathResource( "application-dev.yml" );

         Resource appProd = new ClassPathResource( "application-prod.yml" );

         YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();

         // 2:将加载的配置文件交给 YamlPropertiesFactoryBean

         yamlPropertiesFactoryBean.setResources(app);

         // 3:将yml转换成 key:val

         Properties properties = yamlPropertiesFactoryBean.getObject();

         String active = null ;

         if (properties != null ) {

             active = properties.getProperty( "spring.profiles.active" );

         }

         if (StringUtils.isEmpty(active)) {

             log.error( "未找到spring.profiles.active配置!" );

         } else {

             //判断当前配置是什么环境

             if ( "dev" .equals(active)) {

                 yamlPropertiesFactoryBean.setResources(app, appDev);

             } else if ( "prod" .equals(active)) {

                 yamlPropertiesFactoryBean.setResources(app, appProd);

             }

         }

         // 4: 将Properties 通过构造方法交给我们写的工具类

         return new YamlConfigurerUtil(yamlPropertiesFactoryBean.getObject());

     }

}

工具类实现

?

1

2

3

4

5

6

7

8

9

10

11

12

public class YamlConfigurerUtil {

    private static Properties ymlProperties = new Properties();

    public YamlConfigurerUtil(Properties properties) {

        ymlProperties = properties;

    }

    public static String getStrYmlVal(String key) {

        return ymlProperties.getProperty(key);

    }

    public static Integer getIntegerYmlVal(String key) {

        return Integer.valueOf(ymlProperties.getProperty(key));

    }

}

调用示例

?

1

2

3

4

5

6

7

@RestController

public class PersonController {

    @GetMapping ( "/msg" )

    public String getMessage() {

        return YamlConfigurerUtil.getStrYmlVal( "person.lastName" );

    }

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/weixin_45631876/article/details/102644421

查看更多关于SpringBoot从配置文件中获取属性的四种方法总结的详细内容...

  阅读:37次