¶一、Spring Boot 入门
¶1. Spring Boot 简介
简化Spring应用开发的一个框架;
整个Spring技术栈的一个大整合;
J2EE开发的一站式解决方案;
¶2. 微服务
2014,martin fowler
微服务:架构风格(服务微化)
一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;
单体应用:ALL IN ONE
微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元;
¶3. 环境准备
http://www.gulixueyuan.com/ 谷粒学院
环境约束
-
jdk1.8:Spring Boot 推荐jdk1.7及以上
-
maven3.x:maven 3.3以上版本
-
IntelliJIDEA2018
-
SpringBoot 1.5.9.RELEASE
¶(1)MAVEN设置;
给maven 的settings.xml配置文件的profiles标签添加
1 | <profile> |
¶(2)IDEA设置
IDEA整合maven
¶4. HelloWorld
一个功能:
浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串;
¶(1)创建一个maven工程
¶(2)导入依赖
1 | "1.0" encoding="UTF-8" xml version= |
1、父项目spring-boot-starter-parent是场景启动器的版本仲裁中心,控制着SpringBoot的版本,跟换版本再次修改。
2、spring-boot-starter-web:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件。更多的场景启动器请查看官方文档
3、Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
4、SpringBoot对J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar
中
¶(3)编写一个主程序
1 | package com.qcmoke; |
-
1、@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
-
2、Spring Boot会将主配置类(@SpringBootApplication标注的类)的所在包及该包下面所有子包里面的所有组件扫描到Spring容器中
在本例中Spring Boot会到HelloWorldMainApplication所在的包即com.qcmoke包下和Controller包下扫描所有组件。由此就可以扫描到了com.qcmoke.Controller.HelloController组件
¶(4)编写相关的Controller
1 | package com.qcmoke.Controller; |
¶(5)运行主程序测试
¶(6)简化部署
将这个应用打成jar包,直接使用java -jar的命令可进行执行:
1 | F:\myproject\springboot\spring_01_helloworld\target>java -jar spring_01_helloworld-1.0-SNAPSHOT.jar |
部署完成
在此过程中不需要安装tomcat,因为springboot会将tomcat服务器直接嵌入到了生产的jar包中了。当运行这个jar包的时候,嵌入的tomcat也同样运行了起来。
浏览器输出http://localhost:8080/hello就可以访问部署的springboot应用了。
¶5. 使用Spring Initializer快速创建Spring Boot项目
¶(1)IDEA Spring Initializer
使用 Spring Initializer快速创建项目
IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目。选择需要的模块,向导会联网创建Spring Boot项目。
选择场景启动器(依赖)
默认生成的Spring Boot项目的特点:
- 主程序已经生成好了,我们只需要我们自己的逻辑
- resources文件夹中目录结构
- static:保存所有的静态资源; js css images;
- templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);
- application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;
此外还会附带一些版本控制和markdown等文件,由于当前项目用不到,故我们可以选择将这些文件删除掉。
编写相关的Controller
1 | package com.qcmoke.controller; |
运行测试
¶(2)STS
使用 Spring Starter Project快速创建项目
待完成…
¶二、springboot配置
¶1. 配置文件
SpringBoot默认使用的配置文件是resources目录下的application.properties和application.yml。要求文件名称是不能变的。而通过Spring Initializer创建的项目默认只生成一个名称为application.properties的配置文件。
¶(1)配置文件的作用
SpringBoot在底层都给我们自动配置好了默认值,可以通过修改配置文件从而修改SpringBoot自动配置的默认值。这些默认值包括端口等。
¶(2)配置文件语法介绍
由于properties文件较为普遍使用,这里对其语法就不进行过多讲解。
¶①YAML语法
YAML(YAML Ain’t Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn’t Markup Language:不是一个标记语言;
标记语言:
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以数据为中心,比json、xml等更适合做配置文件;
¶②基本语法使用
k:(空格)v
:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
1 | server: |
注意:属性和值是大小写敏感的。
¶③值的写法
字面量:普通的值(数字,字符串,布尔)
k: v
:字面直接来写;
字符串默认不用加上单引号或者双引号;
""
:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi"
:输出;zhangsan 换行 lisi
''
:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’
:输出;zhangsan \n lisi
对象、Map(属性和值)(键值对),有两种方式
Ⅰ k: v
:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v
的方式
1 | friends: |
Ⅱ 行内写法:
1 | friends: {lastName: zhangsan,age: 18} |
数组(List、Set),有两种方式
Ⅰ 用-
值表示数组中的一个元素
1 | pets: |
Ⅱ 行内写法
1 | pets: [cat,dog,pig] |
¶(3)测试yaml文件获取值注入到组件中
-
组件:Person.java
-
配置文件:application.yml
-
方案:通过在组件中添加注解@ConfigurationProperties(prefix = “配置文件中的某个属性名称”)来让组件能够与配置文件中的某个属性建立关联
导入配置文件处理器依赖,让配置文件能够有提示
1 | <dependency> |
导入依赖完成需要重新运行springboot项目以生效。
要注入的组件类
Person.java
1 | package com.qcmoke.bean; |
Dog.java
1 | package com.qcmoke.bean; |
编写配置文件,将配置文件中的属性值注入到Person对象里。
application.yml
1 | person: |
编写单元测试类
SpringBoot02ConfigApplicationTests.java
1 | package com.qcmoke; |
¶(4)测试properties配置文件获取值注入到组件中
-
组件:Person.java
-
配置文件:application.properties
-
方案:通过在组件中添加注解
@ConfigurationProperties(prefix = "配置文件中的某个属性名称")
来让组件能够与配置文件中的某个属性建立关联
对于properties文件,需要解决idea中默认utf-8可能会输出乱码的问题。
➡️idea设置
导入配置文件处理器依赖,让配置文件能够有提示
1 | <dependency> |
导入依赖完成需要重新运行springboot项目以生效。
要注入的组件类
Person.java
1 | package com.qcmoke.bean; |
Dog.java
1 | package com.qcmoke.bean; |
编写配置文件,将配置文件中的属性值注入到Person对象里。
application.properties
1 | person.last-name=李四 |
编写单元测试类
SpringBoot02ConfigApplicationTests.java
1 | package com.qcmoke; |
¶(5)@Value从配置文件获取值注入组件属性
- 组件:Person.java
- 配置文件:application.yml(或者application.properties)
- 方案:通过在组件中添加注解@Value()来让组件能够与配置文件中的某个属性建立关联
以下没有修改的文件同上⬆️
Person.java
1 | package com.qcmoke.bean; |
¶(6)配置文件注入值数据校验
- 组件:Person.java
- 配置文件:application.properties(或者application.yml)
- 方案:通过在组件中添加注解@ConfigurationProperties(prefix = “配置文件中的某个属性名称”)注入值来让组件能够与配置文件中的某个属性建立关联的同时使用@Validated和特定校验注解。
以下没有修改的文件同上⬆️
application.properties
1 | person.last-name=lisi .com |
Person.java
1 | package com.qcmoke.bean; |
¶(7)@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法),例如属性名称为驼峰或者横线不敏感 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties都能获取到值。
@Value和@ConfigurationProperties的使用场景:
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,可选择使用@Value。
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接选择使用@ConfigurationProperties。
¶(8)@PropertySource
-
作用 : 加载指定的自定义配置文件。
-
使用背景:
@ConfigurationProperties
默认加载的是全局配置文件,如果全部的配置都写到主配置文件里,那么主配置文件将会越来越难维护。我们可以将与框架无关的配置写在非主配置文件中,尽量解耦。 -
使用方法:在组件中添加注解
@PropertySource(value = {"自定义配置文件路径"})来指定自定义配置文件
并且配合@ConfigurationProperties(prefix = "属性名")
指定具体属性。 -
案例:
以下所有未说明的文件同上次案例。
①注释掉所有主配置文件的person相关配置。
②person.properties(自定义配置文件)
1 | person.last-name=wangwu@qq.com |
③Person.java(组件)
1 | package com.qcmoke.bean; |
¶(9)@ImportResource
-
作用:导入spring配置文件(
.xml
),让配置文件里面的内容生效; -
使用方法:自己编写的spring配置文件
.xml
配置文件,不能自动识别;想让xml配置文件生效,可使用@ImportResource(locations = {"spring配置文件xml的路径"})
标注在一个配置类上加载进来。
案例:
以下没有修改的文件同上⬆️
beans.xml
1 | "1.0" encoding="UTF-8" xml version= |
PersonService.java
1 | package com.qcmoke.service; |
SpringBoot02Config5Application.java
1 | package com.qcmoke; |
SpringBoot02Config5ApplicationTests.java
1 | package com.qcmoke; |
¶(10)配置文件占位符
在properties
或yaml
配置文件中是可以使用占位符的
¶①随机数
${random.value}
- 类似uuid
的随机数,没有"-
"连接${random.int}
- 随机取整型范围内的一个值${random.long}
- 随机取长整型范围内的一个值${random.long(100,200)}
- 随机生成长整型100-200
范围内的一个值${random.uuid}
- 生成一个uuid
,有短杠连接${random.int(10)}
- 随机生成一个10以内的数${random.int(100,200)}
- 随机生成一个100-200
范围以内的数
¶②占位符
${key:defaultValue}
- 若key
不存在,则将defaultValue
的值赋值给取值的对象
案例:
除以下特别说明的文件需要修改,其他文件同上⬆️
person.properties
1 | person.last-name=${random.uuid}@qq.com |
¶2. 多环境配置
springboot默认激活的的是主配置文件application.properties/yml。但很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等,在不同的环境,我们需要不同的包去运行项目,那么就需要有多种配置方案,而且希望不同配置文件管理不同的环境配置,这种情况,文件名只要是application-{profile}.properties/yml,然后在主配置文件application.properties/yml通过以下配置来激活即可。
1 | spring: |
案例:
多环境配置文件有:
- application-dev.yml (开发环境)
1 | server: |
- application-prod.yml (生产环境)
1 | server: |
激活不同环境下的配置文件(三种方式)
(1)主配置文件指定方式
application.yml
1 | spring: |
(2)命令行:
1 | java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev; |
也可以直接在测试的时候,ide中配置传入命令行参数
(3)虚拟机参数;
1 | -Dspring.profiles.active=dev |
¶3. 多文档块配置
要求配置文件是yml格式。
1 | server: |
¶4. 配置文件加载位置
¶4.1 加载优先级
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件,优先级由高到底,高优先级的配置会覆盖低优先级的配置;
–file:./config/
–file:./
–classpath:/config/
–classpath:/
如果以上4个位置都有主配置文件,那么SpringBoot会从这四个位置全部加载主配置文件,达到互补配置的效果;
¶4.2 自定义加载位置
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
1 | java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties |
¶5. 外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
1.命令行参数
所有的配置都可以在命令行上进行指定
1 | java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc |
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
*5.RandomValuePropertySource配置的random.属性值
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
¶6. 配置类
在spring中,给spring容器添加组件有两种方式:
- 通过配置文件添加组件 (前面已经介绍)
- 通过配置类的方式添加组件
而SpringBoot推荐给容器中添加组件的方式是使用全注解的方式,也就是配置类的方式。
¶(1)配置类添加组件
会用到两个重要的注解
- @Configuration 指明当前类是一个配置类,相当于spring.xml
- @Bean 将方法的返回值添加到容器中。默认的bean id就是方法名
¶(2)案例
以下没有修改的文件同上⬆️
(1)创建配置类
PersonConfig.java
1 | package com.qcmoke.config; |
(2)取消主配置文件的@ImportResource
注解
SpringBoot02Config5Application.java
1 | package com.qcmoke; |
¶三、日志
¶1. 市面上的日志框架
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…
日志门面 (日志的抽象层) | 日志实现 |
---|---|
Log4j JUL(java.util.logging) Log4j2 Logback |
左边选一个门面(抽象层)、右边来选一个实现;
日志门面: SLF4J;
日志实现:Logback;
SpringBoot:底层是Spring框架,Spring框架默认是用JCL而SpringBoot选用 SLF4j和logback。
每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件;
¶2. 遗留问题
Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、xxxx
统一日志记录,即使是别的框架和我一起统一使用slf4j进行
¶3. 统一日志记录
如何让系统中所有的日志都统一到slf4j;
1、将系统中其他日志框架先排除出去
2、用中间包来替换原有的日志框架
3、我们导入slf4j其他的实现
¶4. 使用日志
SpringBoot底层也是使用slf4j+logback的方式进行日志记录。并且也把其他的日志都替换成了slf4j,并且都已经配有日志配置默认值。开发的时候直接使用即可。
测试:
SpringBoot03LogApplicationTests.java
1 | package com.qcmoke; |
¶5. SpringBoot修改日志的默认配置
application.properties
1 | logging.level.com.atguigu=trace |
logging.file和logging.path
logging.file | logging.path | Example | Description |
---|---|---|---|
(none) | (none) | 只在控制台输出 | |
指定文件名 | (none) | my.log | 输出日志到my.log文件 |
(none) | 指定目录 | /var/log | 输出到指定目录的 spring.log 文件中 |
查看springboot默认日志配置的目录
spring-boot-2.1.4.RELEASE.jar!/org/springframework/boot/logging/logback/
¶6. 自定义日志配置
给类路径下放上日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了。以下表格是各类日志框架的配置文件名规范。
Logging System | Customization |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
对于Logback日志框架的另外说明,两种命名规则的差别。
-
logback.xml:直接就被日志框架识别了。
-
logback-spring.xml(建议使用):日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能。
如
1 | <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> |
如果使用logback.xml作为日志配置文件,还要使用profile功能,可能会报错
logback-spring.xml配置详情解释
1 | "1.0" encoding="UTF-8" xml version= |
¶7. 切换日志框架
¶四、web开发
¶1. 静态资源的映射规则
定义规则的类为:org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
和org.springframework.boot.autoconfigure.web.ResourceProperties
- 所有
/webjars/**
,都去classpath:/META-INF/resources/webjars/
找资源
webjars:以jar包的方式引入静态资源。http://www.webjars.org/
例如引入jquery
1 | <!--jquery-webjar--> |
那么访问jquery的地址是http://localhost:8080/webjars/jquery/3.3.1/jquery.js
- “/**” 访问当前项目的任何资源,都去(静态资源的文件夹)找映射,以下就是springboot默认的静态资源目录。
1 | "classpath:/META-INF/resources/", |
-
index.html页面会被"/**“映射,默认匹配”/"。
-
所有的 **/favicon.ico(页面图标)都是在静态资源文件下找
¶2. 自定义静态资源目录
当启用自定义的静态资源目录后,那么默认的静态资源目录就会失效。
如以下将classpath:/mystatic/
和classpath:/mypublic/
设置为静态资源目录,那么classpath:/META-INF/resources/
, classpath:/resources/
,classpath:/static/
, classpath:/public/
,/
等静态资源目录就会失效。
application.properties
1 | spring.resources.static-locations=classpath:/mystatic/,classpath:/mypublic/ |
¶3. 模板引擎
JSP(由于springboot默认是以jar包的方式打包,所有默认不支持jsp)、Velocity、Freemarker、Thymeleaf
SpringBoot推荐的Thymeleaf;
语法更简单,功能更强大;
¶3.1 Thymeleaf
¶(1)引入thymeleaf
1 | <properties> |
完整pom.xml:
1 | "1.0" encoding="UTF-8" xml version= |
注:以上thymeleaf需要springboot1.5.10.RELEASE版本,高版本可能会出错
¶(2)表达式
1 | ${...} : 变量表达式。OGNL表达式 |
表达式都作为标签的属性值。更多表达式介绍可参阅官方文档或者https://www.e-learn.cn/thymeleaf/standard-dialects
¶(3) 语法
更多语法参阅官方文档或者https://www.kancloud.cn/cxr17618/springboot/428898
¶(4)测试thymeleaf
只要我们把编写有thymeleaf语法的HTML页面放在classpath:/templates/
,thymeleaf
就能自动渲染。
①SuccessController.java(目的是给thymeleaf页面提供动态数据)
1 | package com.qcmoke.controller; |
②success.html
1 |
|
¶3.2 Jsp
springboot内置servlet服务器默认不支持以启动springboot应用即main方法启动的方式解析器jsp。为了解决这种问题。有两种决绝方案。
¶3.2.1 外置servlet服务器方案
(1)创建项目的打包方式位war
(2)添加依赖
1 | <dependency> |
完整pom.xml
1 | "1.0" encoding="UTF-8" xml version= |
(3)完善项目结构和配置tomcat
生成webapp
生成web.xml
修改web.xml路径为项目地址\src\main\webapp\WEB-INF\web.xml
配置tomcat
部署web项目
(4)编写一个SpringBootServletInitializer的子类,并调用configure方法(必须),作用是在tomcat启动同时
1 | package com.qcmoke; |
(3)配置application.properties
1 | # 配置视图解析器,配置jsp的路径和后缀 |
(4)编写测试代码
UserController.java
1 | package com.qcmoke.controller; |
WEB-INF/success.jsp
1 | <%-- |
(5)不以main方法启动,而是点击run按钮运行部署web项目
¶3.2.2 内置servlet服务器加插件方案
(1)打包方式为jar或者war(建议为jar)
(2)添加依赖
1 | <!--内嵌tomcat支持jsp方案1(推荐)--> |
或者
1 | <!--内嵌tomcat支持jsp方案2--> |
完整pom.xml
1 | "1.0" encoding="UTF-8" xml version= |
(3)完善项目结构和配置tomcat(同上)
(4)配置application.properties
1 | # 配置视图解析器,配置jsp的路径和后缀 |
(5)编写测试代码
UserController.java
1 | package com.qcmoke.controller; |
WEB-INF/success.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
(6)运行main方法启动springboot应用
¶3.3 jar和war打包方式启动区别
-
jar包:执行SpringBootApplication的run方法,启动IOC容器,然后创建嵌入式Servlet容器。
-
war包: 先是启动外置Servlet服务器,服务器就会启动Springboot应用(springBootServletInitizer),然后Springboot应用再启动IOC容器。
¶4. SpringMVC自动配置
¶1. Spring MVC auto-configuration
Spring Boot 默认已经自动配置好了SpringMVC,直接使用即可。
-
自动配置了视图解析器
- 自定义视图解析器(如需要)
例如:
1 | package com.qcmoke.demo; |
- 自动注册了
Converter
,GenericConverter
,Formatter
格式化器 等转换器.
¶2. 如何修改SpringBoot的默认web配置
¶2.1 模式
1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(如ViewResolver),那么SpringBoot会将用户配置的和自己默认的配置的组合起来。
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置
¶2.2 默认访问首页
1 | //继承WebMvcConfigurerAdapter类可以来扩展SpringMVC的功能 |
¶五、持久层开发
¶1. 常用数据源配置
¶1.1 默认数据源springboot jdbc
-
springboot默认是使用org.apache.tomcat.jdbc.pool.DataSource作为连接池(数据源)。
-
SpringBoot默认可以支持的连接池包括org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource。
下面将介绍使用默认提供的org.apache.tomcat.jdbc.pool.DataSource作为连接池(数据源)测试数据库访问。
¶(1)数据表
resources/department.sql
1 | SET NAMES utf8mb4; |
¶(2)引入依赖
需要引入springboot jdbc依赖和数据库驱动包
1 | <dependency> |
完整依赖:
pom.xml
1 | "1.0" encoding="UTF-8" xml version= |
¶(3)配置数据库连接信息
application.yml
1 | spring: |
¶(4)测试数据库链接
ApplicationTests.java
1 | package com.qcmoke; |
¶1.2 Druid数据源
¶(1)数据表
resources/department.sql
1 | SET NAMES utf8mb4; |
如果不配置,那么默认连接池为tomcat.jdbc.pool.DataSource。
¶(2)引入依赖
1 | <!--springboot jdbc--> |
完整依赖:
pom.xml
1 | "1.0" encoding="UTF-8" xml version= |
¶(3)配置数据库连接信息
1 | spring: |
druid可选的属性配置(如initialSize、minIdle等),默认比不起作用(但不会报错),如果需要这些可选配置需要new DruidDataSource()到spring容器中覆盖掉原来默认的数据源。并通过@ConfigurationProperties(prefix = "spring.datasource")
的方式将datasource的属性包括可选注入到这个新建的实例对象中。
src/main/java/com/qcmoke/config/DruidConfig.java
1 | package com.qcmoke.config; |
这个类除了创建数据源到spring容器外,还配置了Druid的监控web页面(可选)。
¶(4)测试数据库连接
ApplicationTests.java
1 | package com.qcmoke; |
¶2. 整合MyBatis
¶(1)数据表
resources/sql/mybatis.sql
1 | SET NAMES utf8mb4; |
¶(2)pojo
Employee.java
1 | package com.qcmoke.bean; |
Department.java
1 | package com.qcmoke.bean; |
¶(3)引入依赖
1 | <!--mybatis--> |
完整依赖
pom.xml
1 | "1.0" encoding="UTF-8" xml version= |
¶(4)配置mybatis
方式一:配置文件方式配置MyBatis
resources/mybatis/mybatis-config.xml
1 | "1.0" encoding="UTF-8" xml version= |
方式二:配置类方式配置MyBatis
1 | package com.qcmoke.config; |
¶(5)配置springboot和数据源
1 | spring: |
druid可选的属性配置(如initialSize、minIdle等),默认比不起作用(但不会报错),如果需要这些可选配置需要new DruidDataSource()到spring容器中覆盖掉原来默认的数据源。并通过@ConfigurationProperties(prefix = "spring.datasource")
的方式将datasource的属性包括可选注入到这个新建的实例对象中。
src/main/java/com/qcmoke/config/DruidConfig.java
1 | package com.qcmoke.config; |
这个类除了创建数据源到spring容器外,还配置了Druid的监控web页面(可选)。
¶(6)mapper
com.qcmoke.mapper.EmployeeMapper
1 | package com.qcmoke.mapper; |
配置mapper(配置文件版)
resources/mybatis/mapper/EmployeeMapper.xml
1 | "1.0" encoding="UTF-8" xml version= |
配置mapper(注解版)
com.qcmoke.mapper.DepartmentMapper
1 | package com.qcmoke.mapper; |
¶(7)controller
com.qcmoke.controller.EmpController
1 | package com.qcmoke.controller; |
com.qcmoke.controller.DeptController
1 | package com.qcmoke.controller; |
¶(8)测试
ApplicationTests
1 | package com.qcmoke; |
security依赖包只要引入了,它会默认给项目加入密码。用户名是user 默认密码在控制台找下。
¶六、整合Redis
¶1. 引入Redis依赖
1 | <!-- redis--> |
¶2. 配置文件
¶3. 添加Redis配置类
不添加这个配置类的话,默认Redis是以jdk默认序列化的二进制方式进行存取的,这可能不太友好,所以这里有必要写一个配置类来实现Redis以json格式字符串进行自动存取。
1 | package com.qcmoke.configuration; |
¶4. 使用
思路:查询的时候先查看redis缓存中有没有,有的话则直接从redis中获取数据返回,不经过dao层访问mysql了,如果redis中没有相应的缓存才调用dao层访问mysql。而进行删除的时候要把redis中的相应缓存删除掉,进行修改时也要修改相应的缓存。
¶4.1 dao
1 | package com.qcmoke.dao; |
¶4.2 service
1 | package com.qcmoke.service; |
- spring注解的方式进行缓存管理
1 | package com.qcmoke.service; |
- 使用RedisTemplate进行缓存管理
1 | package com.qcmoke.service; |
复杂的缓存注解
1 | package com.qcmoke.service; |
¶4.3 test
1 | package com.qcmoke; |
¶七、任务调度
¶1.定时任务
开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息。Spring为我们提供了异步执行任务调度的方式。
两个重要的注解:@EnableScheduling、@Scheduled(cron = “cron表达式”)
cron表达式:
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
日期 | 1-31 | , - * ? / L W C |
月份 | 1-12 | , - * / |
星期 | 0-7或SUN-SAT 0,7是SUN | , - * ? / L C # |
特殊字符 | 代表含义 |
---|---|
, | 枚举 |
- | 区间 |
* | 任意 |
/ | 步长 |
? | 日/星期冲突匹配 |
L | 最后 |
W | 工作日 |
C | 和calendar联系后计算过的值 |
# | 星期,4#2,第2个星期四 |
¶1.1 配置类
1 | package com.qcmoke.configuration; |
¶1.2 使用
1 | package com.qcmoke.service; |
在启动springboot应用后,每隔4秒钟就会打印"hello ..."
。
¶2. 异步任务
¶2.1 配置类
1 | package com.qcmoke.configuration; |
¶2.2 定义异步方法
1 | package com.qcmoke.service; |
¶2.3 使用
1 | package com.qcmoke.controller; |
¶八. 邮件开发
邮件任务是其实是一个客户端收发邮件的过程,这里以QQ邮箱为例,首先需要在项目中登录到配置好的QQ邮件服务器后,发送邮件给QQ邮件服务器,QQ邮服务器在中转你发送的邮件给接收邮件账号对应的邮件服务器,最后再通过该服务器发送给邮件接收者的账号。所以说只要你本地的主机可以连网那么就可以完成这个过程。
¶1. 引入依赖
1 | <!-- springboot mail --> |
¶2. 配置
1 | spring: |
注意:这里的password不是邮箱登录的密码,而是邮件服务器对指定邮件账号的登录授权码,对于QQ邮箱来说,授权码的获取可参考下图:
¶3. 测试
1 | package com.qcmoke; |
¶九、热部署
添加依赖
1 | <!--热部署依赖--> |
1 | <build> |
添加以上依赖后,在eclipse中已经可以实现热启动,但是在idea中还需要做两处设置。
(1)setting –> compiler ,将 Build project automatically 勾选上
(2)快捷键ctrl + shift + alt + /
或者Ctrl+ shift + a
搜索 registry后选第一个,弹出框后下拉找到compiler.automake.allow.when.app.running 勾选上即可。
¶十 深入底层
1 | BeanPostProcessor |
待续…