欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-10 08:02:40
目录springboot 属性配置中获取值首先,定义一个实体类去写属性测试和生产区分springboot 获取值和配置文件1、@configurationproperties(prefix = &qu...

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;
    @requestmapping(value = "/gril",method = requestmethod.get)
    public string hellogril(){
        return cubsize + age;
    }
}

运行结果:

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

如果当属性很多之后,要写很多的@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();
    }
}

运行结果:

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

这样就不会需要去写太多的@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 ;
    }
}

运行结果:

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

测试和生产区分

当在项目开发的时候,如果区分测试和生产环境,那么就得区分开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<string,object> maps;
    private list<object> 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)需要导入的依赖:配置文件处理器,配置文件进行绑定会有提示

   <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-configuration-processor</artifactid>
            <version>2.2.1.release</version>
   </dependency>

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

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<string,object> maps;
    private list<object> 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<string,object> maps;
    private list<object> 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<string,object> maps;
    private list<object> 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

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

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