SpringBoot笔记
学习路径目录
一.回顾什么是Spring
- Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。
- 约定大于配置
mysql linux下安装后过滤密码:
sudo grep ‘temporary password’ /var/log/mysqld.log
二.第一个SpringBoot程序
- 要在同级目录下建包,它启动的时候才会扫描到!Application启动类
2.1基础目录结构
controller
service
impl
mapper
utils
domain
config
interceoter(拦截器)
dto
@RestController //设置它返回的是字符串
@RequestMapping("/api/test")
public class DemoController{
@GetMapping("/hello")
public String func(){
System.out.println("xainqitian");
return "1234567890.";
}
@Controller //给spring标注这是一个Controller
@RequestMapping("/api/test") //请求的路径设置
public class DemoController{
@ResponseBody //这里也是设置它返回字符串,如果不加这个则返回视图.
@GetMapping("/hello")
public String func(){
System.out.println("xainqitian");
return "1234567890.";
}
修改端口号
在application.properties中设置:server.port=8081
2.2常用注解与yaml语法讲解
- yaml与properties的区别
- 可以注入到我们的配置类中
@Component
@component是spring中的一个注解,它的作用就是实现bean的注入,在探究@component前先了解一下注解?何为注解?注解本质上就是一个类,开发中我们可以使用注解 取代 xml配置文件。
web开发,提供3个@Component注解衍生注解(功能一样)取代
@Repository(“名称”):dao层
@Service(“名称”):service层
@Controller(“名称”):web层
@Autowired:自动根据类型注入 // pojo 用@component后可以使用@Autowired进行自动装配
@Qualifier(“名称”):指定自动注入的id名称
@Resource(“名称”)
@ PostConstruct 自定义初始化
@ PreDestroy 自定义销毁
————————————————
作用是:
- 添加到spring组件里面
- pojo中的属性可以用@vaule进行直接赋值
@ConfigurationProperties
- @ConfigurationProperties(prefix = “person”)
- 一般用正在配置类里面。
@PropertySource 加载指定的配置文件
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
1、我们去在resources目录下新建一个person.properties文件
name=xianqitian
2、然后在我们的代码中指定加载person.properties文件
@PropertySource(value = "classpath:person.properties")
//resources下的配置文件yaml或者properties
@Component //注册bean
public class Person {
@Value("${name}") //注意${name}
private String name;
......
}
3、再次输出测试一下:指定配置文件绑定成功!
配置文件占位符
person:
name: qinjiang${random.uuid} # 随机uuid
age: ${random.int} # 随机int
happy: false
birth: 2000/01/01
maps: {k1: v1,k2: v2}
lists:
- code
- girl
- music
dog:
name: ${person.hello:other}_旺财
age: 1
主要用做类与配置文件的属性绑定。javaconfig。
JSR303数据校验
@Validated //数据校验
@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
@Email(message="邮箱格式错误") //name必须是邮箱格式
private String name;
}
常见参数
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
.......等等
除此以外,我们还可以自定义一些数据校验规则
多环境配置
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;
- 配置文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;
例如:
application-test.properties 代表测试环境配置
application-dev.properties 代表开发环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过一个配置来选择需要激活的环境:
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;
#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
spring.profiles.active=dev
- yaml的多文档块
和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev #配置环境的名称
---
server:
port: 8084
spring:
profiles: prod #配置环境的名称
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!
- 配置文件加载位置
- 外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!
官方外部配置文件说明参考文档
在这里插入图片描述
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:
优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
我们在最低级的配置文件中设置一个项目访问路径的配置来测试互补问题;
配置项目的访问路径
server.servlet.context-path=/kuang
拓展,运维小技巧
指定位置加载配置文件
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;这种情况,一般是后期运维做的多,相同配置,外部指定的配置文件优先级最高
java -jar spring-boot-config.jar --spring.config.location=F:/application.properties
2.3自动配置原理
配置文件到底能写什么?怎么写?SpringBoot官方文档中有大量的配置,我们无法全部记住
分析自动配置原理
我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;
//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@Configuration
//启动指定类的ConfigurationProperties功能;
//进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;
//并把HttpProperties加入到ioc容器中
@EnableConfigurationProperties({HttpProperties.class})
//Spring底层@Conditional注解
//根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
//这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnWebApplication(
type = Type.SERVLET
)
//判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnClass({CharacterEncodingFilter.class})
//判断配置文件中是否存在某个配置:spring.http.encoding.enabled;
//如果不存在,判断也是成立的
//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
//他已经和SpringBoot的配置文件映射了
private final Encoding properties;
//只有一个有参构造器的情况下,参数的值就会从容器中拿
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
//给容器中添加一个组件,这个组件的某些值需要从properties中获取
@Bean
@ConditionalOnMissingBean //判断容器没有这个组件?
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
return filter;
}
//。。。。。。。
}
一句话总结 :根据当前不同的条件判断,决定这个配置类是否生效!
一但这个配置类生效;这个配置类就会给容器中添加各种组件;
这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;
配置文件能配置什么就可以参照某个功能对应的这个属性类
//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
// .....
}
我们去配置文件里面试试前缀,看提示!
这就是自动装配的原理!
精髓
1、SpringBoot启动会加载大量的自动配置类
2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;
了解:@Conditional
了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效;
@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;
那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。
我们怎么知道哪些自动配置类生效?
我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;
#开启springboot的调试类
debug=true
Positive matches:(自动配置类启用的:正匹配)
Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
Unconditional classes: (没有条件的类)
2.4静态资源存放
看源码得出的结论!
2.5xml配置Bean
<!--applicationContext.xml-->
<bean id="stu"class="com.qfedu.beans.Student"></bean>
<bean id="date"class="java.util.Date"></bean>
2.6Java配置方式:创建配置类
- 创建配置类
- 主要用来做第三方的配置
@Configuration
public class SpringConfig{
@Bean
public Student getStudent(){
return new Student();
}
@Bean
public Date getDate(){
return new Date();
}
}
例:导入Druid的Bean
springboot启动类分析@SpringBootApplication注解
2.
三.WEB开发探究
3.1 SpringBoot整合JSP
SpringBoot应用默认支持的动态网页技术是Thymeleaf,并不支持JSP;因此在SpringBoot应用想要使用JSP需要通过手动整合来实现
1.添加依赖
<dependency>
<groupId>org. apache. tomcat . embed< /groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9. 0.45</version>
</dependency>
<dependency>
<groupId>j avax. servlet</groupId>
<artifactId>jstl</artifactId>
<version>1 .2</version>
</ dependency>
2.创建JSP页面
- 2.1修改pom文件打包方式为war
- 2.2在main中创建webapp目录
- 2.3在webapp创建.jsp页面
3.可以配置视图解析器
4.将JSP页面放在WEB-INF中的访问
- 将JSP文件存放到WEB-INF目绿
- 在application.yml文件配置SpringMVC视图解析方式:
spring :
mvc :
view:
prefix: /WEB- INF/
suffix: .jsp
- 创建PageController
@Controller
public class PageController {
@RequestMapping(”/index.html" )
public String index() {
return "index" ;
}
}
3.2 基于SpringBoot整合Mybatis
1.创建SpringBoot项目,创建时添加依赖(图形式创建,lombok,Spring Web ,mysql driver, mybatis framework )
2.完成mybatis的自定义配置
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
- 版本不合适可以在Maven中修改版本号(如下)
<properties>
<java. version>1.8</java. version>
<mysql. version>5.1.47</mysql. version>
</properties>
spring:
datasource:
driver-class-name: com . mysql. jdbc .Driver
url: jdbc:mysql://localhost :3306/db_ 2010. mybatis?characterEncoding=utf-8
username: root
password: admin123
mybatis:
type-aliases- package:com.qfedu.springboot.ssm.beans//实体类的存放目录
mapper- locations:classpath:mappers/ *Mapper.xml //映射额mapper.xml所在的地址
3.在启动类配置DAO扫描
- @MapperScan(“com.XXX.XXX.dao接口”)
- @SpringBootApplication
扫描多个地方的实体类(如下方法):没有对应的mapper会报错!
3.3 整合Druid连接池
在SpringBoot中整合MyBatis的时候,默认集成了Hikari连接池,Hikarj的效率比Druid要高, 但是得益于Druid提供了比较便捷的监控系统在企业开发中,druid使用还是最多的。(自带监控系统)
1.添加druid的starter
<dependency>
<groupId>com. alibaba</groupId>
<artifactId>druid-spr ing-boot-starter</artifactId>
<version>1.1.10</version>
</ dependency>
2.配置druid数据源
spring:
datasource :
druid:
driver-class-name: com . mysql. jdbc . Driver
url: jdbc :mysql://localhost :3306/db.2010_ mybatis?characterEncoding=utf-8
username: root
password: admin123
initial-size: 1
min-idle: 1
max-active: 20
4.Thymeleaf模板引擎
引入Thymeleaf
怎么引入呢,对于springboot来说,什么事情不都是一个start的事情嘛,我们去在项目中引入一下。给大家三个网址:
Thymeleaf 官网:https://www.thymeleaf.org/
Thymeleaf 在Github 的主页:https://github.com/thymeleaf/thymeleaf
Spring官方文档:找到我们对应的版本
https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
找到对应的pom依赖:可以适当点进源码看下本来的包!
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Maven会自动下载jar包。
- Thymelea是一种既保留 了HTML的后缀能够直接在浏览器运行的能力、又实现了JSP显示动态数据的功能–静
能查看页面效果、动则可以显示数据
SpringBoot应用对Thymelea提供了良好的支持
- 添加Thymelea的start
<dependency>
<groupId>org. spr ingframework . boot</groupId>
<artifactId>spring- boot-starter-thymeleaf</artifactId>
</ dependency>
- 创建Thymeleaf模板(thymeleaf模板放在resources\templates目录)
- static日录下的资源被定义静态资源,SpringBooL应用默认放行; 如果将HTML页面创建static日录是可以直
接访问的 - templates目录下的文件会被定义为动态网页模板,SpringBoot应用会拦截templates中定义的资源; 如果
将HTML文件定义在templates目录,则必须通过控制器跳转访问。
- 创建PageController,用于转发允许“直接访问"的页面请求
@Controller
@RequestMapping(" /page" )
public class PageController {
@RequestMapping(" /test.html" )
public String test(){
return "test";
}
4.1Thymeleaf基本语法
如果要在thymeleaf模板中获取从控制传递的数据,需要使用th标签
4.1.1 在thymeleaf模板页面引入th标签的命名空间
在标签中添加命名空间:xmlns :th=“http://ww. thymeleaf .org”
4.1.2 th:text
在几乎所有的HTML双标签都可以使用th:text属性,将接收到的数据显示在标签的内容中
4.1.3 th:inline内联
- HTML内联
- CSS内联
橘色
- JavaScript内联
4.1.4 th:object 和*的使用
<div th:object="${book}">
<p th:text=" *{bookId}"></p>
<p th:text=" *{bookName}"></p>
<p th:text=" *{bookAuthor}"></p>
</div>
4.2 流程控制
4.2.1 th:each循环
4.2.2 分支
- th:if 如果条件不成立,则不显示此标签
- th:switch和th:case
4.3 碎片使用/页面公共部分(th:fragment=" ")
碎片,就是HTML片段,我们可以将多个页面中使用的相同的HTMI标签部分单独定义,然后通过thinclude可
以在HTML网页中引入定义的碎片
碎片使用案例:
1.用th:fragment=“ ” 定义碎片。
2.用th:include=“页面::片段名”引入碎片。
3.细节:引用的片段所在的页面要在controller里面进行转发处理。
引用碎片th:include 和tha:replace
四.SpringBoot应用的热部署配置
SpringBoot项目配置
- 在需要进行热部署的SpringBoot应用中添加依赖
- 配置SpringBoot的Maven插件
- 配置SpringBoot应用的变化更新策略
链接: 狂神说课程完整笔记.