文章目录
注意:当application.properties与application.yml两个文件同时存在时,当属性名相同时application.properties中的属性会 覆盖 application.yml中的属性。
一、yml区别
1.1 自定义的yml或者properties
@Component
@PropertySource("classpath:config/my.properties")
public class MyTestConfig {
@Value("${my.test}")
public String testss;
}
@GetMapping("/test123")
public void test123() throws IOException {
String testss = myTestConfig.testss;
System.out.println("===="+testss);
}
结果:====123456
1.2 原始的application.yml
# 配置yml层级树键值文件要注意的两个问题
# 1. 兄弟节点必须对齐
# 2. 如果写值,冒号后面必有一个空格
# 覆盖自动配置类的默认属性
server:
port: 9002
servlet:
contextPath: /
# 定义自已项目中需要的属性
# 标量类型(8基本+string)
my: //这儿是自己控制器类通过注解@ConfigurationProperties(prefix = "my")
host: 127.0.0.1
port: 3306
# 对象类型
user:
name: 小华华
age: 18
sex: 男
# 数组类型
address:
- 天河九巷
- 天河八巷
- 天河十巷
# 对象数组类型
users:
- name: 李小三
age: 18
sex: 女
- name: 李小一
age: 20
sex: 男
二、方法
方式一:@ConfigurationProperties + set方法 : java语言中的全部数据类型
- java类的定义属性名必须与配置文件中的属性一致
- 所有的属性必须提供setter方法
package cn.itcast.controller;
import cn.itcast.pojo.User;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
/** 第一种方式: 注入属性 */
@RestController //-----------------控制器
@ConfigurationProperties(prefix = "my")
public class PropController1 {
private String host;
private int port;
private User user; //pojo类,那就得自定义一个user类了,属性名要与配文一致
private String[] address;
private List<User> users;
@GetMapping("/test1")
public String test1(){
System.out.println("======test1=======");
System.out.println("host = " + host);
System.out.println("port = " + port);
System.out.println("user = " + user);
System.out.println("address = " + Arrays.toString(address));
System.out.println("users = " + users);
return "test1方法,访问成功!";
}
/** 注入的属性必须提供setter方法 */
public void setHost(String host) {
this.host = host;
}
public void setPort(int port) {
this.port = port;
}
public void setUser(User user) {
this.user = user;
}
public void setAddress(String[] address) {
this.address = address;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
package cn.itcast.pojo;
public class User {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
方式二:@Value: 基本数据类型和String
@Value注解只能注入基本数据类型与String
@Value注解注入的属性不需要setter方法
package cn.itcast.controller;
import cn.itcast.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
/** 第二种方式: 注入属性 */
@RestController
@ConfigurationProperties(prefix = "my")
public class PropController2 {
@Value("${my.host}")
private String host;
@Value("${my.port}")
private int port;
private User user;
private String[] address;
private List<User> users;
@GetMapping("/test2")
public String test2(){
System.out.println("======test2=======");
System.out.println("host = " + host);
System.out.println("port = " + port);
System.out.println("user = " + user);
System.out.println("address = " + Arrays.toString(address));
System.out.println("users = " + users);
return "test2方法,访问成功!";
}
public void setUser(User user) {
this.user = user;
}
public void setAddress(String[] address) {
this.address = address;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
方式三:创建bean对象
将需要注入的属性定义成一个属性类,创建bean对象。这样做属性类就可以重复使用。
@ConfigurationProperties: 配置属性,变成属性类了
@Component: 创建普通bean对象(泛指组件,当组件不好归类的时候,可以使用这个注解)
package cn.itcast.configuration;
import cn.itcast.pojo.User;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
@ConfigurationProperties(prefix = "my")
@Component
public class UserProperties {
private String host;
private int port;
private User user;
private String[] address;
private List<User> users;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String[] getAddress() {
return address;
}
public void setAddress(String[] address) {
this.address = address;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
启用属性类来用配置的属性
package cn.itcast.controller;
import cn.itcast.configuration.UserProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/** 第三种方式: 注入属性 */
@RestController
public class PropController3 {
@Autowired(required = false)
private UserProperties userProperties;
@GetMapping("/test3")
public String test3(){
System.out.println("======test3======");
System.out.println(userProperties.getHost());
System.out.println(userProperties.getPort());
System.out.println(userProperties.getUser());
System.out.println(userProperties.getAddress());
System.out.println(userProperties.getUsers());
return "test3方法,访问成功!";
}
}
三、直接使用整个配置文件,不设置前缀
第一步,定义一个配置文件
# 存储一些配置
qhl.GetDataList.Device.url= https://xxx
第二步:读取配置文件
package com.zykj.newsell.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.stereotype.Component;
/**
* 自定义配置properties的属性类
*
* @author lc
* @version 1.0
* @date 2022/4/13 15:39
*/
@Data
@Component
@PropertySource("classpath:configInfo.properties")
public class ConfigInfo {
@Value("${qhl.GetDataList.Device.url}")
public String deviceUrl;
}
第三步:使用
package com.zykj.newsell.controller;
import com.zykj.newsell.common.response.ResultInfo;
import com.zykj.newsell.config.ConfigInfo;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 第三方接口
*
* @author lc
* @version 1.0
* @date 2022/4/13 15:26
*/
@Api(value = "第三方接口")
@RestController
@RequestMapping("/three/qhl")
public class ThreeController {
@Autowired
private ConfigInfo configInfo;
/**
*
*
* @return
*/
@PostMapping("/getDeviceList")
public ResultInfo getDeviceList() {
String dashboardUrl = configInfo.getDashboardUrl();
System.out.println(dashboardUrl);
return ResultInfo.ok();
}
}