背景意义:
1.有时候我我们要改变不同的值,有时候,写在java代码里面,还不如写在配置文件里,这样就不需要进行更改java代码了。
2.有时候我们的项目需要进行服务器部署,同时,一般在服务器部署之前需要先进行本地测试。但是,在本地测试的过程中,mysql的数据库密码啊,redis的密码是不一样的,如果我们进行直接更改的话,效率很慢,但是,我们可以设置两个配置文件,但在本地跑的时候,用本地的配置文件,当在云上跑的时候,用云上的。
配置文件内容读取
首先,在配置文件上写上,我们的配置内容。
这时候,就可以把内容取出来了:
方法一:直接使用@Value来进行取值
package com.example.hellotest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ConfigTestController {
@Value("${person.name}")
private String name;
@GetMapping("/name")
@ResponseBody
public String getName(){
return "获取到的姓名是" + name;
}
}
2.可以把它封装成为一个类,直接加@component交给spring管理
类代码如下:
package com.example.hellotest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConfigClass {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private String age;
@Value("${person.high}")
private String high;
@Value("${person.weight}")
private String weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getHigh() {
return high;
}
public void setHigh(String high) {
this.high = high;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
@Override
public String toString() {
return "ConfigClass{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", high='" + high + '\'' +
", weight='" + weight + '\'' +
'}';
}
}
Controller如下;
package com.example.hellotest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ConfigTestController {
@Autowired
ConfigClass configClass;
@GetMapping("/name")
@ResponseBody
public String getName(){
return "获取到的信息是" + configClass.toString();
}
}
结果如下:
注意:类要自动注解要注意路径问题,
我把启动类放在hellotest路径下,如果把ConfigcClass类放在domain下是不可以进行自动注入的,除非把启动类进行配置过。
2.使用@ConfigurationProperties注解读取
如果配置文件中有比较多的统一配置项,则可以用另外一种方式来获取,以上配置文件中person为例:
这时候,需要在pom文件中进行jar导入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
controller
package com.example.hellotest;
import com.example.domain.ConfigClass;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ConfigTestController {
@Autowired
PersonConfig personConfig;
@GetMapping("/name")
@ResponseBody
public String getName(){
return "获取到的信息是" + personConfig.toString();
}
}
结果如下;
配置文件读取
在系统读取文件时默认读取application文件的,但是有的时候你的代码可能在不同的环境中跑,或者说你需要不同的配置文件来满足不同的需求,那就需要让系统读取其他的配置文件。
先建几个配置文件:
然后,就可以在application.yml进行指定启动那个配置文件:
再次访问结果如下:说明配置文件启动成功:
Lombok
lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的java代码的工具。
首先,先要进行安装Lombok
disable:禁用,因为这里我已经安装好了
其次要添加相关的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
在项目的开发过程中通过注解来开启Lombok相应的功能,其注解以及对应功能如下:
@Data:自动生成Getter/Setter 、 toString 、 equals 、 hashCode 、不带参数的构造方法。
@Getter/@Setter:自动生成Getter/Setter方法
@NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出 NPE(NullPointerException)。
@ToString:用在类上可以自动覆写 toString 方法,当然还可以加其他参数
例如 @ToString(exclude=”id”) 排除 id 属性
@AllArgsConstructor : 全部参数构造函数
@NoArgsConstructor : 无参数构造函数
测试如下:
package com.example.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
public class Person {
private int id;
private String name;
private String iphone;
private String sex;
}
controller
package com.example.hellotest;
import com.example.domain.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class PersonController {
@RequestMapping("/person")
@ResponseBody
public String person(){
Person person = new Person(1,"xiaolu","2155555","nan");
return person.toString();
}
}