赞
踩
上篇简单了解了SpringBoot的概念并学会如何搭建一个SpringBoot项目,今天就来学习SpringBoot的配置文件的种类与用法
在学习SpringBoot之前,SSM项目的配置复杂程度堪称配置地狱,一开始开发者就对Spring、SpringMVC、Mybatis、tomcat进行配置,这浪费了我们大量的时间去构建项目,而且如果配置一旦出现错误,项目就有可能崩溃。
SpringBoot采用了自动配置,以前需要配置的东西,Spring Boot帮我们自动配置,使得开发者更加关注于业务代码的开发
指的是基于你引入依赖的jar包,对SpringBoot应用自动配置
它为SpingBoot框架“开箱即用”提供了基础支撑
使用过SpringBoot的都知道启动类中使用了@SpringBootApplicatin注解,打开源码我们查看一下元注解
- @Target({ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Inherited
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan(
- excludeFilters = {@Filter(
- type = FilterType.CUSTOM,
- classes = {TypeExcludeFilter.class}
- ), @Filter(
- type = FilterType.CUSTOM,
- classes = {AutoConfigurationExcludeFilter.class}
- )}
- )
- public @interface SpringBootApplication {
- @AliasFor(
- annotation = EnableAutoConfiguration.class
- )
- Class<?>[] exclude() default {};
-
- @AliasFor(
- annotation = EnableAutoConfiguration.class
- )
- String[] excludeName() default {};
-
- @AliasFor(
- annotation = ComponentScan.class,
- attribute = "basePackages"
- )
- String[] scanBasePackages() default {};
-
- @AliasFor(
- annotation = ComponentScan.class,
- attribute = "basePackageClasses"
- )
- Class<?>[] scanBasePackageClasses() default {};
-
- @AliasFor(
- annotation = ComponentScan.class,
- attribute = "nameGenerator"
- )
- Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
-
- @AliasFor(
- annotation = Configuration.class
- )
- boolean proxyBeanMethods() default true;
- }
我们主要关注三个元注解,分别为@SpringBootConfiguration、@E nableAutoConfiguration、@ComponentScan
1、@SpringBootApplication修饰的类,也会被@Configuration间接修饰,即“源配置类”
2、SpringBoot框架会对“源配置类”所在的package进行组件扫描
3、SpringBoot框架最终会导入AutoConfigurationImportSelector来实现自动配置
SpringBoot提供了两种能被识别的配置文件,分别为properties和yaml/yml文件
在同一级目录下优先级为:properties > yml > yaml
默认配置文件名称:application
概念: YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格 式,并且容易被人类阅读,也容易和脚本语言交互
语法与特点:
大小写铭感
数据值前边必须有空格,作为分隔符
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)
缩进的空格数目不重要,只要相同级的元素左侧对齐即可
示例:以定义服务器端口和主机为例
- server
- port: 8080
- address: 127.0.0.1
对象(map)
- person:
- name: zhangsan
- #行内写法
- person: {name: zhangsan}
数组(array)
- address:
- - beijing
- - shangsai
- # 行内写法
- address: {beijing,shanghai}
常量
- msg1: 'hello \n world' #单引忽略转义字符
- msg2: "hello \n world" #双引识别转义字符
下面我们将yml与properties和xml文件格式进行比较
xml
- <server>
- <port>8080</port>
- <address>127.0.0.1</address>
- </server>
properties
- server.port=8080
- server.address=127.0.0.1
yml
- server
- port: 8080
- address: 127.0.0.1
区别:
1、xml文件主要是树形结构,xml配置文件结构清晰,但是内容比较繁琐
2、properties文件主要是以key-value键值对的形式存在,文件结构简单,但难以表达层次
3、yml文件不是一种标记语言,但容易表现层级关系,而且语法简洁精炼
SpringBoot提供了以下三个注解来获取配置文件数据
@Value
@Environment
@ConfigurationProperties
第一种方式,使用@Value yml文件
- user1:
- name: zhangsan
1、Controller层,获取对象数据(user1.name)
- @Controller
- public class HelloController {
- @Value("${user1.name}")
- private String name;
-
- @ResponseBody
- @RequestMapping("/param")
- public String hello(){
- System.out.println(name);
- return "param";
- }
-
- }
2、获取数组数据
yml文件:
country: [China,Italy]
Controller测试
- @Controller
- public class HelloController {
- @Value("${user1.name}")
- private String name;
-
- @Value("${country[0]}")
- private String country1;
-
- @ResponseBody
- @RequestMapping("/param")
- public String hello(){
- System.out.println("country1 : "+country1);
- return "param";
- }
-
- }
第二种方式,使用Environment对象获取数据,这个方法比较方便
在Controller层,创建Environment对象,并自动注入,然后使用对象的getProperty方法获取数据
- @RestController
- public class Test1Controller {
- @Autowired
- Environment env;
-
- @RequestMapping("/test1")
- public String test1(){
- System.out.println("country[0] : "+env.getProperty("country[0]"));
- System.out.println("user1.name : " + env.getProperty("user1.name"));
- return "test1";
- }
- }
输出如下:
- country[0] : China
- user1.name : zhangsan
方式三:使用@ConfigurationProperties获取数据
首先创建一个Bean,加上@ConfigurationProperties注解,还有一定要加上prefix前缀
注意:Bean成员一定要跟yml的数据一一对应
- @Component
- @ConfigurationProperties(prefix = "admin")
- public class Admin {
- private String userName;
- private String password;
- private String[] hobby;
-
- public String getUserName() {
- return userName;
- }
-
- public void setUserName(String userName) {
- this.userName = userName;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password=password;
- }
-
- public String[] getHobby() {
- return hobby;
- }
-
- public void setHobby(String[] hobby) {
- this.hobby = hobby;
- }
-
- @Override
- public String toString() {
- return "Admin{" +
- "userName='" + userName + '\'' +
- ", password='" + password + '\'' +
- ", hobby=" + Arrays.toString(hobby) +
- '}';
- }
- }
然后在Controller层,创建一个Admin对象,并自动注入
- @RestController
- public class Test1Controller {
- @Autowired
- private Admin admin;
-
- @RequestMapping("/test2")
- public String test2(){
- System.out.println("userName: "+admin.getUserName());
- System.out.println("password: "+admin.getPassword());
- for (String hobby : admin.getHobby()) {
- System.out.println(hobby);
- }
- return "test2";
- }
- }
输出:
- userName: admin
- password: 123
- music
- play game
至此,本篇内容结束,如果你喜欢本篇,欢迎点赞+关注,前方不迷路,祝各位生活愉快!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。