赞
踩
从我们的之前的学习,我们可得知,我们使用脚手架搭建的spirngboot项目是具有maven构建的,其目录结构特点我们也已经看过了,那么接下来介绍的就是全局配置,全局配置顾名思义就是的就是用来配置全局的这个设置。而在springboot里全局配置都是以键值对的形式配置的。
全局配置文件能够对一些默认配置值进行修改.Spring Boot使用一个application.propreties或者application.yaml的文件作为全局配置文件.,该文件存放在/src/main/resource 目录或者类路径的/config.
yaml文件也是yml文件,显示为yml,我们创建的时候后缀就直接用yml就可以。其关系是以缩进来显示关系,同样也是键值对的形式,key空格冒号空格value,其编写的时候会自动换行,如以下形式就是常见的yml格式
server:
port: 80
详细关于yaml文件的可以参考下面的博客:
https://www.cnblogs.com/wxmdevelop/p/7341292.html
.propreties文件,同样是键值对的形式存在的文件,其要求严格,key=value,注意value后面不要留空格,应用已久这个后缀的文件,我们在使用jdbc配置文件加载的时候就使用过,相信很多人都踩过这个后面有空格的坑,导致一直连接不上数据库,所以我们在配置的时候尽量单行后面都不留空格。
key=value
常用方式如下
#数据源连接配置
spring.datasource.url = jdbc:mysql://localhost:3306/blog_system?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username = root
spring.datasource.password = root3306
#driver-class-name可以省略
#spring.datasource.driver-class-name = com.mysql.jdbc.Driver
下面通过一个案例对Spring Boot项目中的application.properties文件的具体使用进行讲解.
https://blog.csdn.net/qq_26665293/article/details/104416267
Pet.java代码内容如下:
package com.itheima.domain; public class Pet { private String type; private String name; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Pet{" + "type='" + type + '\'' + ", name='" + name + '\'' + '}'; } }
package com.itheima.domain; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.*; @Component //用于将当前注入属性值的Person类作为Bean注入Spring容器中,只有这样它才能被@ConfigurationProperties注解赋值 @ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性通过setter方法注入该类中 public class Person { private int id; //id private String name; //名称 private List hobby; //爱好 private String[] family; //家庭成员 private Map map; private Pet pet; //宠物 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getHobby() { return hobby; } public void setHobby(List hobby) { this.hobby = hobby; } public String[] getFamily() { return family; } public void setFamily(String[] family) { this.family = family; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } public Pet getPet() { return pet; } public void setPet(Pet pet) { this.pet = pet; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + ", hobby=" + hobby + ", family=" + Arrays.toString(family) + ", map=" + map + ", pet=" + pet + '}'; } }
说明,定义了变量后,可快捷生成getter和setter方法及toString()方法:
1)生成getter和setter方法1:在未有getter和setter方法的变量上按ALT+Enter键,如图所示,即可添加该变量的getter和setter方法。
生成getter和setter方法2:在要插入getter和setter方法的空位处,按Alt+Insert键,如图所示,即可添加多个变量的getter和setter方法 。
在弹出的窗口选择要添加方法的变量,按OK即可。
2)生成toString()方法同上述方法2,如图:
单击toString()后,在弹 出的窗口中选择要使用的变量即可生成。
3)打开chapter02的resources目录下的application.properties配置文件,编写需要对Person类设置的配置属性,内容如下:
#对实体类对象Person进行属性配置
person.id=1
person.name=tom
person.hobby=play,read,sleep
person.family=father,mother
person.map.k1=v1
person.map.k2=v2
person.pet.type=dog
person.pet.name=kity
补充说明:上述内容会通过@ConfigurationProperties注解注入Person类实体类的对应属性中.
由于要配置的Person对象属性是我们自定义的,Spring Boot无法自动识别,所以不会有任何书写提示.在实际开发中,为了出现代码提示的效果来方便配置,可以在pom.xml文件中添加一个Spring Boot提从的配置处理器依赖,示例代码如下:
<!--引入配置处理器依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
package com.itheima; import com.itheima.domain.Person; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest class Chapter02ApplicationTests { @Autowired private Person person; @Test void contextLoads() { System.out.println(person); } }
YAML文件格式是Spring Boot支持的一种JSON超集文件格式,其以数据为核心,是一种更为直观且容易被 计算机识别的数据序列化格式,工作原理与application.properties是一样的。演示:
#对实体类对象Person进行属性配置 person: id: 2 name: 张三 #hobby: [sing,read,sleep] #行内式写法 hobby: - play - read - sleep family: [father,mother] map: {k1: v1,k2: v2} #注意冒号后有空格 # 缩进式写法1,注意“-”后有空格 pet: type: cat name: tom
说明:这些配置属性也将会通过@ConfigurationProperties注解注入Person类实体类的对应属性中。
在项目设计的时候可参考下面的一篇文章配置:
https://www.cnblogs.com/hlkawa/p/9723838.html
使用Spring Boot全局配置文件属性时,如果配置的属性是Spring Boot默认提供的属性,会自动扫描并读取属性值 。如果配置的属性是用户自定义属性,如前面的Person实体类属性,则必须在程序中注入这些配置属性方可生效。
@Component //用于将当前注入属性值的Person类作为Bean注入Spring容器中,只有这样它才能被@ConfigurationProperties注解赋值 @ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性通过setter方法注入该类中 public class Person { private int id; //id private String name; //名称 private List hobby; //爱好 private String[] family; //家庭成员 private Map map; private Pet pet; //宠物 public int getId() { return id; } public void setId(int id) { this.id = id; } ...
注意:要保证配置文件中的属性与对应实体类的属性名一致。
package com.itheima.domain; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.*; @Component //用于将Student类作为Bean注入Spring容器中 public class Student { @Value("${person.id}") //不仅可用于注入Person的id属性,还可以直接为id属性赋值,这是@ConfigurationProperties不支持的 private int id; @Value("${person.name}") //用于注入Person的name属性 private String name; private List hobby; private String[] family; private Map map; private Pet pet; @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", hobby=" + hobby + ", family=" + Arrays.toString(family) + ", map=" + map + ", pet=" + pet + '}'; } }
package com.itheima; import com.itheima.domain.Person; import com.itheima.domain.Student; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest class Chapter02ApplicationTests { @Autowired private Person person; @Test void contextLoads() { System.out.println(person); } @Autowired //通过@Autowired注解引入了Spring容器中的Studnet实体类Bean private Student student; @Test public void studentTest(){ System.out.println(student); } }
执行测试方法studentTest()后,效果如图:
从上面两种注解,@ConfigurationProperties底层框架基于spring boot,@value底层框架基于Spring,获取值的比较(都能从properties和yaml获值),可以了解到如下情况:
显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。
Spring Boot免除了项目大部分的手动配置,一些特定情况,我们也可以通过修改全局配置文件以适应具体生产环境。几乎所有的配置都可以写在全局配置文件中,Spring Boot会自动加载全局配置文件从而免除我们手动加载的烦恼。但是,如果我们自定义配置文件,Spring Boot是无法识别的,此时,就需要我们手动加载。这里对自定义配置文件及其加载方式进行详细讲解。
在项目chapter02的基础上的案例实现:
步骤1:打开resources目录,在项目的类路径下新建一个test.properties自定义配置文件,在该配置文件中编写需要设置的配置属性,内容如下所示:
#对实体类对象MyProperties进行属性配置
test.id=110
test.name=test
步骤2:在com.itheima.domain包自定义一个配置类MyProperties,定义id和name两个属性,定设置set和get方法,为方便打印,设置toString()方法,完成以上设置后,导入自定义配置类,指定内容如下:
package com.itheima.domain; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration //指定当前类为配置类,也可以使用@component注解代替 @PropertySource("classpath:test.properties") //指定自定义配置文件位置和名称 @EnableConfigurationProperties(MyProperties.class) //开启对应配置类的属性注入功能,使用@Component注解时无须该注解,这里是配合@Configuration注解使用 @ConfigurationProperties(prefix = "test") //指定配置文件注入属性前缀 public class MyProperties { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "MyProperties{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
@Autowired
private MyProperties myProperties;
@Test
public void myPropertiesTest(){
System.out.println(myProperties);
}
步骤4:执行上述测试方法,查看控制台输出效果,正确打印说明@PropertySource注解成功加载了自定义配置文件,如图:
传统的Spring项目配置文件主要基于XML文件,Spring Boot框架在Spring 4.x基础上进行了改进,默认不再使用XML文件配置项目,且XML配置文件不会加载到Spring容器中。如果 希望将外部的XML文件加载到程序中,可以使用@ImportResource注解加载配置文件
@ImportResource注解标注在一个配置类上,通常放置在应用启动类上,使用时需要指定XML配置文件的路径和名称。
chapter02项目的基础上示例演示:
package com.itheima.config;
public class MyService {
}
<!--使用传统的Spring框架XML方法编写的配置文件-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myService" class="com.itheima.config.MyService" /><!--通过<bean>标签将MyService标注为spring容器中的Bean组件-->
</beans>
package com.itheima; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @ImportResource("classpath:beans.xml")//加载自定义XML配置文件位置 @SpringBootApplication public class Chapter02Application { public static void main(String[] args) { SpringApplication.run(Chapter02Application.class, args); } }
步骤4:打开测试类Chapter02ApplicationTests,在该测试类中引入Applicationcontext实体类Bean,并新增一个测试方法进行输出测试。代码如下:
@Autowired
//通过@Autowired注解引入了Spring容器实例ApplicationContext
//注意存在同名ApplicationContext,导入import org.springframework.context.ApplicationContext;
private ApplicationContext applicationContext;
@Test
public void iocTest() {
//输出写法1:
System.out.println(applicationContext.containsBean("myService"));
//输出写法2:
System.out.println(applicationContext.getBean("myService"));
//输出写法3:
MyService myService = (MyService) applicationContext.getBean("myService");
System.out.println(myService);
}
步骤5:执行测试方法iocTest()后,查看控制台输出效果,结果如图:
XML配置文件的配置方法在实际开发的中特殊情况下才会使用。在Spring Boot开发中,“约定大于配置”的思路,更推荐使用配置类的方式代替xml配置。在chapter02的基础上演示实例:
package com.itheima.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //定义该类是一个配置类
public class MyConfig {
@Bean //将返回值对象作为组件添加到Spring容器中,该组件id默认为方法名
public MyService myService(){
return new MyService();
}
}
说明:MyConfig是@Configuration注解声明的配置类(类似声明了一个XML配置文件),该配置类会被 Spring Boot自动扫描识别;使用@Bean注解的myService()方法,其返回值 对象会作为组件添加到Spring容器中(类似于XML配置文件中的标签配置),并且该组件的id默认是方法名myService。
步骤2:注释启动类中的@ImportResource(“classpath:beans.xml”) // 加载自定义XML配置文件位置
步骤3:执行项目测试类的中测试方法:iocTest(),运行效果如图:
在实际开发中,应用程序通常需要部署到不同的运行环境中,如开发环境、测试环境,生产环境等。不同的环境可能需要不同的环境配置,针对这种情况,通常会对项目进行多环境配置。Spring Boot框架提供了两种多环境配置的方式,分别是profile文件多环境配和@Profile注解多环境配置 。
演示案例步骤如下:
步骤1:打开chapter02项目的resources 目录,在该目录下按Profile文件命名规则创建不同运行环境对应的配置文件,这里分别创建application-dev.properties、application-test.properties和application-prod.properties多环境配置文件,并在各个配置文件中对服务端口进行不同的设置,
application-dev.properties代码如下:
#开发环境配置文件,设置访问端口为8081
server.port=8081
application-test.properties代码如下:
#测试环境配置文件,设置访问端口为8082
server.port=8082
application-prod.properties代码如下:
#t生产环境配置文件,设置访问端口为8083
server.port=8083
步骤2:
在控制台的Terminal窗口中,cd 命令进入target目录,执行如下命令:
java -jar chapter02-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
说明: chapter02-0.0.1-SNAPSHOT.jar根据自建的实际jar包进行变换,dev可更换为其他,如test或prod,Ctrl+C结束运行,按向上键头可以获得上条命令进行修改.
运行效果如图:
#指定要激活的profile多环境配置文件
spring.profiles.active=dev
步骤3:启动chapter02项目的启动类,并查看控制台输出效果.结果如图所示:
结果可以看到多环境配置文件生效,如果想使用profile文件激活其他环境,可以在全局配置文件application.properties中设置对应的配置文件。重启项目查看效果.
演示案例步骤如下:
package com.itheima.config;
public interface DBConnector {
public void configure();
}
步骤2:在com.itheima.config包下,创建三个实现了DBConnector接口的类DevDBConnector,TestDBConnector和ProdDBConnector,并重写configure()方法,分别模拟连接不同的数据库环境.具体如下
package com.itheima.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration //将实现类声明为配置类 @Profile("dev") //指定多环境配置类标识 public class DevDBConnector implements DBConnector { @Override public void configure() { System.out.println(""); System.out.println("数据库配置环境Dev");//sout可快速输出此句 } //接口名上按ALT+Entente,可以implement methods }
package com.itheima.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration //将实现类声明为配置类
@Profile("test") //指定多环境配置类标识为test ,value="test"可以缩写为"test"
public class TestDBConnector implements DBConnector{ //接口名上按ALT+Entente,可以implement methods
@Override
public void configure(){
System.out.println("数据库配置环境test");//sout可快速输出此句
}
}
ProdDBConnector.java代码
package com.itheima.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration //将实现类声明为配置类
@Profile("prod") //指定多环境配置类标识为prod ,value="prod"可以缩写为"prod"
public class ProdDBConnector implements DBConnector{ //接口名上按ALT+Entente,可以implement methods
@Override
public void configure(){
System.out.println("数据库配置环境prod");//sout可快速输出此句
}
}
#指定要激活的profile多环境配置文件
spring.profiles.active=prod
步骤4:测试:新建一个com.itheima.controller包,在该包下新建一个表示数据库连接配置的DBController类进行测试,代码如下:
package com.itheima.controller; import com.itheima.config.DBConnector; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DBController { @Autowired private DBConnector dbConnector; @GetMapping("/showDB") public void showDB(){ dbConnector.configure(); } }
随机值设置使用到了Sping Boot内嵌的RandomValueProperty Source类,对一些隐秘属性值 或者测试用例属性值 进行随机值注入
语法格式为:${random.XX} Xx表示需要指定生成的随机数类型和范围等,示例如下:
#配置随机数,没有任何类型或范围
my.secret=${random.value}
#配置随机数为整数
my.number=${random.int}
#配置随机数为long类型
my.bignumber=${random.long}
#配置随机数为UUID类型
my.uuid=${random.uuid}
#配置随机数为小于10的随机整数
my.number.less.than.ten=${random.int(10)}
#配置范围在【1024-65536】之间的随机整数
my.number.in.range=${random.int[1024,65536]}
步骤2:在Chapter02ApplicationTest测试,代码如下:
//测试随机值设置
@Value("${my.number.less.than.ten}")//application.properties配置文件中的变量对应,my.secret可以变换不同的变量,注意格式
private String secret;
@Test
public void randomTestd(){
System.out.println(secret);
}
在Sping Boot配置文件中,配置文件的属性值 可以进行参数间的引用.方便在具有多个相互关联的配置属性中,只需要对其中一处属性预先设置,其他地方都可以引用.省去后续多处修改的麻烦.示例如下:
app.name=MyApp
#${app.name}为上一句的参数引用
app.description=${app.name} is a Spring Boot application
tom.age=${random.int[10,20]}
tom.description=tom的年龄可能是${tom.age}
说明:这里代码中使用了中文"tom的年龄可能是",可能会出现乱码,建议在项目开始前就设置,否则中间设置会让之前的中文注释变成乱码.解决方法File->Settings:
@Value("${tom.description}")
private String description;
@Value("${app.description}")
private String description2;
@Test
public void placeholderTest(){
System.out.println(description);
System.out.println(description2);
}
参考:
https://blog.csdn.net/qq_26665293/article/details/104418563
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。