SpringBoot 属性配置中获取值的方式

网友投稿 315 2022-08-28


SpringBoot 属性配置中获取值的方式

目录SpringBoot 属性配置中获取值首先,定义一个实体类去写属性测试和生产区分SpringBoot 获取值和配置文件1、@ConfigurationProperties(prefix = "student")方式2、@Value方式3、@PropertySource4、@ImportResource和@Bean

SpringBoot 属性配置中获取值

在配置文件中定义属性的值,然后再获取,在这里做一个总结,首先,在application.yml文件中定义端口和属性的值,当然,在.application.properties文件中也能定义,只是格式不同而已:

appliaction.yml:

server:

port: 8081

cubSize: B

age: 18

然后再定义一个controller,用@Value这个注解来获取到值:

package com.dist.tr.controller;

import com.dist.tr.entity.GrilProperties;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

@RestController

@RequestMapping

public class BeautifulGirlContrller {

@Value("${cubSize}")

private String cubSize;

@Value("${age}")

private Integer age;

http:// @RequestMapping(value = "/gril",method = RequestMethod.GET)

public String HelloGril(){

return cubSize + age;

}

}

运行结果:

如果当属性很多之后,要写很多的@Value 的注解嘛???答案当然是No,有简便的写法:

application.yml 文件

server:

port: 8081

gril:

name: lisa

height: 165

首先,定义一个实体类去写属性

GrilProperties实体:

注意我们用到了这个注解:@ConfigurationProperties(prefix = “gril”)

package com.dist.tr.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component;

@Component

@ConfigurationProperties(prefix = "gril")

public class GrilProperties {

private String name;

private String height;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getHeight() {

return height;

}

public void setHeight(String height) {

this.height = height;

}

}

在controller 中的写法:

首先用注解@Autowired 注入这个实体,如果不在实体中加@Component这个注解,在idea中发现会有红线出现。

package com.dist.tr.controller;

import com.dist.tr.entity.GrilProperties;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

@RestController

@RequestMapping

public class BeautifulGirlContrller {

@Autowired

private GrilProperties grilProperties;

@RequestMapping("/grilPerproties")

public String grilPerproties(){

return grilProperties.getName()+grilProperties.getHeight();

}

}

运行结果:

这样就不会需要去写太多的@Value注解了。

还有中形式,就是在配置文件中也可以有这种情况出现:

server:

port: 8081

cubSize: B

age: 18

context: "cubSize:${cubSize},age:${age}"

这种情况证明获取的属性值呢?

在controller中编码:

package com.dist.tr.controller;

import com.dist.tr.entity.GrilProperties;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

@RestController

@RequestMapping

public class BeautifulGirlContrller {

@Value("${context}")

private String context;

@RequestMapping("/grilSize")

public String girlcubSize(){

return context ;

}

}

运行结果:

测试和生产区分

当在项目开发的时候,如果区分测试和生产环境,那么就得区分开application.yml 文件:

新建application-dev.yml 文件和application-prod.yml文件:

然后在使用测试或者是生产的时候,application.yml 文件中这样写:

spring:

profiles:

active: prod

决定是用测试环境还是生产环境。

SpringBoot 获取值和配置文件

@ConfigurationProperties、@Value、@PropertySource、@ImportResource和@Bean

1、@ConfigurationProperties(prefix = "student")方式

(1)定义两个实体类,其中student实体类的属性包括Course类:

@Data

@Component

@ConfigurationProperties(prefix = "student")//告诉springboot将本类中的所有属性和配置文件的相关配置进行绑定

public class Student { //prefix:配置文件中哪一个名称下面的属性进行一一映射

private String sname;

private int age;

private Map maps;

private List list;

private Course course;

}

@Data

public class Course {

private String courseno;

private String coursename;

}

(2)创建yaml配置文件:

student:

sname: zhai

age: 12

maps: {k1: 12,k2: 13}

list:

- zhai

- zhang

course:

courseno: 202007

coursename: javaweb

(3)创建properties文件:

#配置student

student.age=12

student.sname=zhai

student.maps.k1=1

student.maps.k2=2

student.list=a,b,c

student.course.courseno=202007

student.course.coursename=java

(4)测试类:

//可以在测试期间很方便地类似编码一样进行自动注入等容器的功能

@SpringBootTestclass Springboot03ApplicationTests {

@Autowired

Student student;

@Test

void contextLoads() {

System.out.println(student);

}

}

(5)需要导入的依赖:配置文件处理器,配置文件进行绑定会有提示

org.springframework.boot

spring-boot-configuration-processor

2.2.1.RELEASE

2、@Value方式

(1)书写配置文件

#配置student

student.sname=zhai

student.age=12

student.maps.k1=1

student.maps.k2=2

student.list=a,b,c

student.course.courseno=202007

student.course.coursename=java

(2)获取值:

@Data

@Component

public class Student {

@Value("${student.sname}")

private String sname;

@Value("#{2*9}")

private int age;

private Map maps;

private List list;

private Course course;

}

(3)@ConfigurationProperties(prefix = "")方式与@Value方式的比较

@ConfigurationProperties(prefix = "")方式支持批量注入配置文件的属性,@Value方式需要一个个指定@ConfigurationProperties(prefix = "")方式支持松散绑定,@Value方式不支持,

yml中写的last-name,这个和lastName是一样的,后面跟着的字母默认是大写的。这就是松散绑定

@Value方式支持jsR303校验

@Data

@Component

@Validated

public class Student {

@NonNull

private String sname;

private int age;

private Map maps;

private List list;

private Course course;

}

@Value方式支持SpEl

如果我们只是在某一个业务逻辑中需要获取配置文件的某一项值,可以使用@Value,如果是一个javaBean来和配置文件进行映射,则要使用@ConfigurationProperties(prefix = "")方式

@RestController

public class HelloController {

@Value("${student.sname}")

private String sname;

@RequestMapping("/hello")

public String hello(){

return "hello"+sname;

}

}

配置文件:

#配置student

student.sname=zhai

student.age=12

student.maps.k1=1

student.maps.k2=2

student.list=a,b,c

student.course.courseno=202007

student.course.coursename=java

3、@PropertySource

(1)配置文件(student.properties)

#配置student

student.sname=zhai

student.age=12

student.maps.k1=1

student.maps.k2=2

student.list=a,b,c

student.course.courseno=202007

student.course.coursename=java

(2)实体类获取值

@Data

@Component

@PropertySource(value = {"classpath:student.properties"})

public class Student {

private String sname;

private int age;

private Map maps;

private List list;

private Course course;

}

@PropertySource是从指定路径下获取数据,默认是从application.properties下获取数据

4、@ImportResource和@Bean

(1)指定spring的配置文件

@SpringBootApplication(scanBasePackages = "com")

@ImportResource(locations = {"classpath:beans.xml"})

public class Springboot02Application {

public static void main(String[] args) {

SpringApplication.run(Springboot02Application.class, args);

}

}

(2)书写spring的配置文件:beans.xml

(3)书写如下配置,可以省略配置文件的书写,用注解来代替

@Configuration

public class MyAppConfig {

@Bean

public HelloService helloService(){

return new HellService();

}

}

@Configuration说明这是一个配置类,就是在替代之前的配置文件

@Bean标记在方法上,该方式将方法的返回值添加到容器中,容器中组件的ID默认是方法名

总结:

(1)@ConfigurationProperties与@Value


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python之第三方库pyfiglet:一个专门用来生成艺术字的库(只支持英文)
下一篇:python第三方库psutil库详解------获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息:psutil = process and system utilities
相关文章

 发表评论

暂时没有评论,来抢沙发吧~