0.解决(一)中创建maven项目时的问题
看视频找官方文档的相关资料,进行pom.xml的配置,但是配置资源错误,导致maven导包不成功

看起来长得都差不多,但是经过昨天的学习,开始查找这种错误的源头,maven的配置都一样,为什么maven的包导入不成功?仔细对照两个项目的pom配置文件发现,从spring boot 导入依赖关系文件错误,才导致maven的包导入不进来
emmmm,有点强迫症,解决完这个小bug,心里舒服多了,继续学习spring boot
1.默认生成的spring boot项目
主程序已经生成好了,我们只需要我们自己的逻辑
resources文件夹中目录结构
static:保存所有静态资源;js css images;
templates:保存所有的模板页面;(Spring Boot默认从jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、tlymelaf);
application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;
配置端口号:

2.spring boot 的配置文件
1.配置文件
Spring Boot使用一个全局的配置文件,配置文件名是固定的
application.properties
application.yml
配置文件的作用:修改spring boot自动配置的默认值;spring boot在底层都给我们自动配置好;
YAML(YAML Aln't Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn't Markup Language:不是一个标记语言
标记语言:
以前的配置文件;大多都使用的是xxx.xml文件
YAML:以数据为中心,比json、xml等更适合做配置文件
YAML:配置例子
server:
port: 8081
XML:
<server>
<port>8081</port>
</server>
3.YAML语法
1.基本语法
k:(空格)v; 来表示键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一层级的
server:
port: 8081
path: /hello
属性和值也是大小写敏感
2.值的写法
字面量:普通的值(数字,字符串,布尔)
k: v;字面值直接来写
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串重要的特殊字符;特殊字符会作为本身想表示的意思
name:"zhangsan \n lisi"; 输出:zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name:"zhangsan \n lisi"; 输出:zhangsan \n lisi
对象、map(属性和值)(键值对);
k: v; 在下一行来写对象的属性和值得关系;注意缩进
对象还是k、v的方式
friends:
lastName:zhangsan
age:20
行内写法:
friends: {lastName:zhangsan,age:20}
数组(List、Set):
用-值表示数组中的一个元素
pets:
-cat
-dog
-pig
行内写法:
pets: [cat,dog,pig]
3.配置文件值注入
配置文件(YAML)
persion:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 2
bean:
package org.jsoft.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中的相关配置进行绑定
* prefix = "persion" 配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
* */
@Component
@ConfigurationProperties(prefix = "persion")
public class Persion {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@Override
public String toString() {
return "Persion{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getBoss() {
return boss;
}
public void setBoss(Boolean boss) {
this.boss = boss;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
public List<Object> getLists() {
return lists;
}
public void setLists(List<Object> lists) {
this.lists = lists;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}
package org.jsoft.bean;
public class Dog {
private String name;
private Integer age;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
}
还需要修改springboot的配置文件pom.xml
导入配置文件处理器,以后编写配置就有提示了

用properties文件配置
# idea properties配置文件utf-8
# persion
persion.last-name=张三
persion.age=18
persion.birth=2017/12/12
persion.boss=false
persion.maps.k1 = v1
persion.maps..k2 = 14
persion.lists=a,b,c
persion.dog.name = dog
persion.dog.age = 15
可能会出现中文乱码情况,解决办法如下:

另外一种获取值得方式
package org.jsoft.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中的相关配置进行绑定
* prefix = "persion" 配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
* @Component 把Persion放入到容器中
* */
@Component
//@ConfigurationProperties(prefix = "persion")
public class Persion {
/**
* <bean class ="Persion">
* <property name="lastName" value="字面量/${key }从环境变量、配置文件中获取值/#{SpEl}"></property>
* </bean>
* */
@Value("${persion.last-name}")
private String lastName;
@Value("#{11 * 2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
4.@Value获取值和@ConfigurationProperties获取值比较
| @ConfigurationProperties | @Value | |
| 功能 | 批量注入配置文件中的属性 | 一个个指定 |
| 松散绑定(松散语法) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| JSR303数据校验 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |
JSR303数据校验

配置文件中yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,用@Value;
package org.jsoft.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Value("${persion.last-name}")
private String name;
@RequestMapping("/sayHello")
public String sayHello(){
return "Hello" + name;
}
}

如果说,我们专门编写了一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
5.@PropertySource&@ImportResource
@PropertySource:加载指定的配置文件
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中的相关配置进行绑定
* prefix = "persion" 配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
* @Component 把Persion放入到容器中
* @ConfigurationProperties(prefix = "persion") 默认从全局配置中获取值
*
*
* */
@PropertySource(value = {"classpath:persion.properties"})
@Component
@ConfigurationProperties(prefix = "persion")
@Validated
public class Persion {
private String lastName;
private Integer age;
private Boolean boss;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
persion.last-name=李四
persion.age=18
persion.birth=2017/12/12
persion.boss=false
persion.maps.k1 = v1
persion.maps..k2 = 14
persion.lists=a,b,c
persion.dog.name = dog
persion.dog.age = 15
@ImportResource:导入spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在配置类上

不来编写Spring的配置文件
<?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 = "helloService" class = "org.jsoft.service.HelloService"></bean>
</beans>
SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
1.配置类=========Spring配置文件
2.使用@Bean给容器中添加组件
package org.jsoft.config;
import org.jsoft.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Configuration指明当前类是一个配置类,就是来替代之前的Spring配置文件
* 在配置文件中用<bean></bean>标签添加组件
* */
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService(){
System.out.println("配置类@Bean给容器中添加组件了、、、");
return new HelloService();
}
}
6.配置文件占位符
1.随机数
random.value、{random.int}、${random.long}
random.int(10)、{random.int[1024,65536]}
2.占位符获取之前配置的值,如果没有可以使用:默认指定值
porperties的配置文件

本文深入解析SpringBoot项目结构,探讨Maven配置问题,详细介绍默认生成的项目内容,配置文件(application.properties和application.yml)的使用,YAML语法特性,以及配置文件值注入的方法。同时,对比@Value和@ConfigurationProperties两种注入方式,讲解@PropertySource和@ImportResource的用途,并介绍配置文件占位符的使用。
675

被折叠的 条评论
为什么被折叠?



