SpringBoot入门笔记

AOEBIU 2020/1/30 SpringBoot
$简介
SpringBoot可以去繁就简单,免去原生框架中繁琐的配置文件,可以大大提高开发速度,开箱即用
整个Spring技术栈的一个整合,简化了基于Spring开发的繁琐配置
学完了Spring,SpringMVC,Mybatis就可以接触SpringBoot了
入门
创建一个maven工程,并且导入SpringBoot的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
SpringBootApplication是SpringBoot的注解,标注主程序
@SpringBootApplication
public class helloWorld {
public static void main(String[] args) {
SpringApplication.run(helloWorld.class, args); //启动
}
}
创建一个Controller类,里面所有内容和使用springMVC时一样,但是controller包必须要和main方法所在的类平行,不然会404
@Controller
public class HelloController {
@RequestMapping("/hello")
public @ResponseBody
String hello() {
return "hello World!";
}
}
只需要这3步,SpringBoot项目就构建好了,无需其他配置文件,执行的时候只需要运行main方法而不需要额外启动web容器
可以看到IDE的控制台显示tomcat已经在8080端口启动
浏览器输入127.0.0.1:8080/hello 显示hello World!
原来的一大堆配置文件现在统统省略惹~
部署
导入这个依赖,然后在maven的生命周期中选择package打包
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
这个时候target里会生成一个jar包
调出命令行cmd里面输入java -jar 【目录】
这个时候在浏览器输入127.0.0.1:8080/hello 显示hello World!
SpringBoot插件辅助导入
选择setting-Plugins,使用SpringBoot插件
选择这个代替maven
SpringBoot会帮我们导入需要的依赖,并起好包名甚至main方法,非常方便,其余的只需要下一步即可,可以通过这个方法更快速的构建项目,第一次启动会比较缓慢,如果没有对应的jar包可以让maven从中心仓库中下载,如果下载慢请把仓库改为阿里云仓库
SpringBoot的resources目录结构
static保存静态资源如js,css,images
templates保存模板页面(因为耦合度太高SpringBoot默认不支持jsp)
application.properties:SpringBoot的配置文件覆盖默认配置或者属性注入
SpringBoot的配置
需要先导入这个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
注意:在.yaml还是.properties中userName,user-name和user_name含义相同(松散语法)
.properties进行配置
#将默认端口号改为80
server.port=80
PetInfo.user-name=xiaowangba
PetInfo.age=8080
PetInfo.map.key1=v1
PetInfo.map.key2=v2
PetInfo.list=1,2,3,4
.yaml中不会出现,但是在.properties中会出现乱码问题,进行这个设置即可
SpringBoot除了支持.properties还支持.yaml进行配置(注: .yml和.yaml含义相同)
yaml的语法key和value是一对,只要是左对齐的一列都算一个层级,属性和值都是大小写敏感的,属性加冒号与值之间必须要有一个空格
1.字符串
字符串默认不需要加引号,如果使用了双引号包裹字符串,那么会转义其中的特殊字符
如果使用了单引号,那么就不会转义特殊字符
#写法1
server:
port: 8080
path: /hello
#写法2
server: {port: 808,path: /hello}
2.数组,List和Set集合写法
#写法1
PetInfo:
-dog
-cat
-qaq
#写法2
PetInfo: [cat,dog,qaq]
3.map集合和实体类
maps: {k: v,k2: v2}
people:
name: xiaowangba
age: 8080
不论是.properties还是.yaml都需要在实体类上加上@ConfigurationProperties(prefix = "pets")与配置文件中的内容进行映射,因为必须要在容器之中才能使用所以还需要加上@Component,@Validated注解可以进行数据校验,这些注解都十分的方便
@Component
@Validated
@ConfigurationProperties(prefix = "pets")
@PropertySource("classpath:pets.properties") 读取指定配置文件,不使用默认的
public class PetInfo{
private String name;
@Email 使用了@Validated就可以使用@Email注解
private String email; 当注入的属性不符合email格式就会报错
private Integer age;
private List<String> lists;
//省略getter,setter,toString
}
配置文件
PetInfo:
name: xiaowangba
#email: 11111 报错
email:1111@123.cn 正确
age: 12
lists:
-chi
-la
使用Spring的@value注解注入,注:使用这种方法@Validated注解无效,并且无法注入集合
 
@Component
@PropertySource("classpath:pets.properties") 读取指定配置文件,不使用默认的
public class PetInfo{
@Value("${pets.user-name}") 从.properties拿数据,@Value不支持松散语法
private String username;
@Value("xiaowang") 直接注入
private String username2;
@Value("#{111111*6}") 结果666666~
private Integer age;
//省略getter,setter,toString
}
两种配置文件都支持占位符
PetInfo.flag=false
PetInfo.last-name=小王八${pets.flag} 小王八false
PetInfo.first-name=${person.last-name2:666} 如果没有则使用666当默认值
PetInfo.age=${random.int[1,9]} 各种随机数
PetInfo.age=${random.long(99999)}
可以在SpringBoot自动生成的test包下测试
自动生成的@RunWith(SpringRunner.class)和@RunWith(SpringJUnit4ClassRunner.class) 完全一样,可以说就是换了个皮
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SpringbootApplicationTests {
@Autowired
private PetInfo petInfo;
@Test
public void contextLoads() {
System.out.println(Pets);
}
}
总体来说,简单注入用@value,其他情况不用@value
SpringBoot的profile
创建多个配置文件,名字不能起错,必须为application-【自定义】.properties,注意图标变化
这个时候运行使用的是80端口
#application-dev.properties
server.port=80
#application-prod.properties
server.port=8080
#application.properties
server.port=81
#使用application-dev.properties的配置文件
spring.profiles.active=dev
.yaml一个配置文件相当于三个.properties,不过需要用---隔开文档块
请注意不要让别的配置文件干扰到,这样可能导致结果错误
server:
port: 81
spring:
profiles:
active: dev 启用dev
---
server:
port: 80
spring:
profiles: dev
---
server:
port: 8080
spring:
profiles: prod
可以使用main方法测试,这两个配置文件的结果都是80端口启动
使用命令强制更改参数为dev,这个命令使用场景肯定不是在IDE里,如果在命令行使用那么拼接在java -jar 【文件名】 后面
使用虚拟机参数
SpringBoot配置文件的加载
SpringBoot只能识别这4个地方的配置文件会从高到低加载,并且低优先级的不会覆盖高优先级的,根目录下的config包下的配置文件优先级最高,类路径下的配置文件优先级最低,注:根目录下的1,2不会被maven打包
java -jar 【文件名】 --spring.conf.location【指定目录】指定额外的配置文件
外部配置加载一共有17种优先级,加载配置文件优先级的详细内容参照官方文档 (24. Externalized Configuration)
SptingBoot的日志
日志框架的统一
不同框架使用了不同的日志框架,如Mybatis使用了log4j,Spring使用了commons-logging
因为Spring需要commons-logging,所以直接去除这个jar包会导致报错,这时候我们将它替换成jcl-over-slf4j,它也实现了commons-logging,但是真正调用的却是slf4j这个接口(狸猫换太子),logbakck是slf4j的实现
log4j和java自带的logging也同理(使用别的日志框架原理也基本类似,将要代替的日志框架去除,用中间包代替)
SpringBoot底层也干的是这一件事情,可以看到slf4j代替log4j的包,命名都是用的人家的
SpringBoot引入Spring的同时也将commons-logging排除了
slf4j的使用在配置文件中调整日志输出级别,级别从高到低是trace —> debug —>info —>warn —>error
#SpringBoot默认为info级别
logging.level.xyz.mengnan=trace
#默认不生成,给日志文件存放位置,不写全路径放在该项目下
logging.file=test.log
#指定路径,如果写了logging.file这个配置不生效
logging.path=/test/log
#控制台日志格式,这也是默认格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
#输出在硬盘的日志格式
logging.pattern.file=%d{yyyy-MM-dd} == [%thread] == %-5level %logger{80} - %msg%n
%d:日期
%thread:线程名
%‐5level:级别从左显示5个字符宽度
%logger:全类名字符数
%msg:日志信息
%n:换行
默认配置可以参照这个包下的配置文件
指定配置
给类路径下放上每个框架的配置文件,SpringBoot就不使用默认的配置文件,如logback.xml不过SpringBoot官方推荐命名为logback-spring.xml因为这样就不会被其他框架识别,这个文件名只由SpringBoot识别,这个时候就可以使用springProfile标签可以指定它的name
然后通过spring.profiles.active指定不同的配置(SpringBoot的profile内容)
<!--logback-spring.xml-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{yyyy‐MM‐dd} ‐‐‐ [%thread] ‐‐‐ %‐5level
%logger{50} ‐ %msg%n
</pattern>
</springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy‐MM‐dd HH:mm:ss.SSS} == [%thread] == %‐5level
%logger{50} ‐ %msg%n
</pattern>
</springProfile>
</layout>
</appender>
#application.properties
spring.profiles.active=dev
替换SpringBoot使用的日志框架为log4j2
将原先的logback-classic和slf4j去除,替换成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
觉得这篇文章对你有有帮助吗?
发表评论
0
说扒~

条回复 个点赞
为什么没人来抢占个沙发呢?