目录
简介编辑
快速搭建一个SpringBoot的网页
自动配置原理
容器功能
组件添加
原生配置文件引入
配置绑定
自动配置原理
1.引导加载自动配置类
2.按需配置开启自动配置项
开发小技巧
1.Lombok简化开发
2. dev-tools热部署
3.Spring Initailizr
配置文件
1.properties
2.yaml
SpringBoot的Web开发
1.SpringMVC自动配置
2.简单功能分析
(1)静态资源目录
(2)静态资源访问前缀
(3)欢迎页支持
(4)自定义 Favicon(网页小图标)
请求参数处理
请求映射
基本注解
响应处理
响应json
视图解析与模板引擎
文件上传
异常处理
1.错误处理
嵌入式Servlet容器
SpringBoot的定制化
1.常见定制化方式
数据访问
SQL
1.导入数据库驱动
2.使用自定义数据源
使用Druid数据源
整合mybatis
1.配置模式
2.注解模式
整合mybatis-plus
整合redis
单元测试
常用注解
断言
前置条件
嵌套测试
参数化测试
指标监控
简介
优点
SpringBoot是整合Spring技术栈的一站式框架
SpringBoot是简化Spring技术栈的快速开发脚手架
缺点
人称版本帝,迭代快,需要时刻关注变化
封装太深,内部原理复杂,不容易精通
时代背景
1.微服务
2.分布式
3.云原生
快速搭建一个SpringBoot的网页
1.pom.xml文件中导入springboot父依赖和web场景依赖
org.springframework.boot spring-boot-starter-parent2.7.0 org.springframework.boot spring-boot-starter-web
2.主程序入口
//标注该类为一个springboot应用
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
3.controller层控制器
@RestController//==>@Controller+@ResponseBody
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello SpringBoot!!!";
}
}
搭建完毕!
PS:启动主程序后若报错:Web server failed to start. Port 8080 was already in use.修改被占用的端口号或在application.yml(application.properties)中配置端口(任意不冲突端口即可)
application.yml(application.properties)配置文件:配置所有springboot项目所需要的配置,我们可以根据官方文档查看可以修改或自定义的配置(例如自定义端口等等)
自动配置原理
SpringBoot特点
1.依赖管理
引入父项目做依赖管理
2.开发导入starter场景启动器
比如需要用到web场景,导入web场景的启动依赖后,所有与web开发有关的依赖就全部包含其中;也可以自定义场景启动,-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
3.无需关注版本号,自动版本仲裁
引入依赖默认都可以不写版本;引入非版本仲裁的jar,要写版本号。
当我们不用springboot为我们提供的依赖的版本号时,可以查看spring-boot-dependencies里面规定当前依赖的版本用的 key,根据相同规则规定自己用的版本号
自动配置
1.自动配好tomcat
引入tomcat依赖-->web场景
配置tomcat
2.自动配好springMVC
引入springMVC全套组件-->web场景
自动配好SpringMVC常用组件(功能)
3.自动配好web常见功能-dispatcherServlet,字符编码过滤器等
4.默认包结构
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来,无需手动配置包的扫描
当我们需要用到的类不在主程序及其子包下时,我们可以在主程序的@SpringBootApplication注解配置来改变扫描路径,@SpringBootApplication(scanBasePackages="com.xx")或使用注解@ComponentScan(包名)
5.SpringBoot的各种配置都有默认值
例如tomcat端口号默认为8080,修改这些默认配置的值可以在application.yml或application.xml中进行。并且这些值最终会绑定在每个类上,该类会在容器中创建对象。
6.按需加载配置
springboot只会开启我们引入的场景的配置。
容器功能
组件添加
1.@Configuration注解:标识该类为一个配置类
Full模式:@Configuration(proxyBeanMethods = true)——每个@Bean方法被调用多少次返回的组件都是单实例的,是在容器中返回的
Lite模式:@Configuration(proxyBeanMethods = false)——每个@Bean方法被调用多少次返回的组件都是容器所新创建的
@Bean:给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例。
2.@Import注解:配置在标识为组件的类或配置类上
例:@Import({User.class, DBHelper.class})
给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
3.@Conditional注解:条件装配,满足Conditional指定的条件后进行组件注入
原生配置文件引入
4.@ImportResource注解:
使用原生的配置文件配置容器:@ImportResource("classpath:beans.xml")
配置绑定
目的:读取到properties(或yml)文件中的内容,并且把它封装到JavaBean中,以供随时使用.
方式1:组件在容器中时
@ConfigurationProperties注解:使用该注解的prefix属性得到properties(或yml)文件中的键
方式2:在配置类上添加注解
@EnableConfigurationProperties:注解中写入的内容是要绑定的类
例:@EnableConfigurationProperties(Car.class)
功能:开启Car配置绑定功能
把这个Car这个组件自动注册到容器中
1.引导加载自动配置类
@SpringBootConfiguration
===》@Configuration,代表当前是一个配置类
@ComponentScan
包扫描注解
@EnableAutoConfiguration=@AutoConfigurationPackage+@Import(AutoConfigurationImportSelector.class) 自动配置包(指定默认的包规则)+导入一个组件
2.按需配置开启自动配置项
虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。
@Conditional有一系列子派生注解。
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了,以用户的优先。
开发小技巧
1.Lombok简化开发
1.下载Lombok插件
2.引入 Lombok依赖
org.projectlombok lombok
PS:这里不需要版本号是因为SpringBoot的父依赖已经默认管理了版本。
3.使用Lombok提供的注解简化实体类编写
@Date:生成实体类的get和set方法
@NoArgsConstructor:生成无参构造器
@AllArgsConstructor:生成有参构造器
@ToString:生成toString方法
@EqualsAndHashCode:重写hashCode方法
@Slf4j:注入日志类,在类中使用log,info(),输出日志信息
2. dev-tools热部署
1.引入依赖
org.springframework.boot spring-boot-devtoolstrue
2.修改代码后需要重新编译一遍
3.Spring Initailizr
创建项目时,选择 Spring Initailizr会自动创建该项目为SpringBoot项目
好处:
1.可以手动选择开发场景(web场景等),选择后会自动导入该场景需要的依赖。
2.自动创建项目结构
3.自动编写好主类
配置文件
1.properties
2.yaml
2.yaml
1.简介
2.语法
- key: value;kv之间有空格
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
- 字符串无需加引号,如果要加,''与""表示字符串内容 会被 转义/不转义
3.yml文件中的数据类型写法
(1)字面量类型,如string,date,number,boolean,null
k: v
(2)对象类型(键值对集合,如map,hash,set,object)
行内写法: k: {k1:v1,k2:v2,k3:v3}
#或
k:
k1: v1
k2: v2
k3: v3
(3)数组(如array,list,queue)
行内写法: k: [v1,v2,v3] #或者 k: - v1 - v2 - v3
SpringBoot的Web开发
1.SpringMVC自动配置
springboot为springMVC提供了自动配置,适用于大多数web开发场景,我们也可以按需需改或添加自己的配置
内容协商视图解析器和BeanName视图解
静态资源(包括webjars)
静态index.html 页支持
支持 HttpMessageConverters
等等。。。
2.简单功能分析
(1)静态资源目录
只要静态资源放在类路径下的叫做 /static (or /public or /resources or /META-INF/resources
这些文件夹来放置静态资源
访问方法:当前项目根路径/ + 静态资源名
原理:静态资源的映射为:/**(拦截所有请求),当有请求发生时,先去controller中寻找对应的请求路径,controller中有匹配的则会执行controller中的映射请求;controller中没有匹配的请求映射时回去找静态资源处理器处理,静态资源中有对应的资源就会按此资源输出,没有则会404.
改变默认的静态资源路径
默认的静态资源路径是在resources文件夹下的以上类路径,但我们可以通过在配置文件中配置改变静态资源的存放位置
spring:
resources:
static-locations: [classpath:/zc/]
此时所有静态资源只有放在zc目录下才能被访问了(该目录也可以写多个)。
(2)静态资源访问前缀
静态资源默认访问是没有前缀的,我们可以通过配置文件改变静态资源的访问前缀 (方便后续开发拦截器拦截一些资源做其他操作)
spring:
mvc:
static-path-pattern: /res/**
此时再访问静态资源的路径就必须加上前缀/res
(3)欢迎页支持
1.静态资源路径下的index.html,我们可以直接通过访问根路径访问到index.html页
可以配置静态资源路径
但是不可以配置静态资源的访问前缀,否则导致 index.html不能被默认访问
2.controller能处理/index请求也能直接通过根路径访问到。
(4)自定义 Favicon(网页小图标)
文件名必须是favicon.ico,将其放在静态资源目录下即可
但是不可以配置静态资源的访问前缀,否则导致favicon.ico不能被默认访问
请求参数处理
请求映射
1.xxxMapping
2.Rest风格支持
用Rest风格的请求方式来对资源进行操作
GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
在springboot项目中使用Rest风格需要在配置文件中手动开启Rest功能
spring:
mvc:
hiddenmethod:
filter:
enabled: true #开启页面表单的Rest功能
并且Rest风格的GET和POST请求可以直接开启使用,而PUT和DELETE请求需要将请求方式写成POST,在隐藏域中用_method的方式将请求方式的值设为PUT或DELETE。
Rest风格对应的注解
@GetMapping==@RequestMapping(value="/xxx,method="RequestMethod.Get")
@PostMapping
@PutMapping
@DeleteMapping
基本注解
@MatrixVariable
背景:
矩阵变量写法
PS:SpringBoot默认禁用矩阵变量的功能,使用时需要手动开启(重写方法)
响应处理
响应json
引入web场景后会自动引入json的场景及依赖,此时要返回json数据格式只需要在要返回的数据上加上@ResponseBody注解即可
视图解析与模板引擎
1.视图解析
SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染。
Thymeleaf模板技术进行视图解析,需要手动引入thymeleaf的启动依赖
org.springframework.boot spring-boot-starter-thymeleaf
Model和Map设置的值都会放在请求域
2.拦截器
写一个专门处理拦截操作的类,该类要实现HandlerInterceptor接口;此接口有三个方法
preHandle:目标方法执行之前要进行的操作
postHandleafter:目标方法执行之后要进行的操作
Completion :页面渲染后要进行的操作
拦截器想要工作,还需要在springboot项目中写配置类,在配置类中添加拦截器的配置类,并指明要拦截的请求和要放行的请求等等。
//配置类(管理所有配置)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginIntercepter())
.addPathPatterns("/**")//所有资源都会被拦截,包括静态资源
.excludePathPatterns("/","/login","/css/**","/js/**","/font/**","/images/**");
}
}
文件上传
@PostMapping("/upload")
public String upload(@RequestParam("email") String email,
@RequestParam("username") String username,
@RequestPart("headerImg") MultipartFile headerImg,
@RequestPart("photos") MultipartFile[] photos) throws IOException {
if(!headerImg.isEmpty()){
//保存到文件服务器,OSS服务器,此处保存为本地
String originalFilename = headerImg.getOriginalFilename();
headerImg.transferTo(new File("H:\cache\"+originalFilename));
}
if(photos.length > 0){
for (MultipartFile photo : photos) {
if(!photo.isEmpty()){
String originalFilename = photo.getOriginalFilename();
photo.transferTo(new File("H:\cache\"+originalFilename));
}
}
}
return "main";
}
异常处理
1.错误处理
1.错误处理
SpringBoot默认提供了/error处理所有错误的映射,默认的错误页面是带有错误信息的空白页whilelable.
自定义错误页面
放在template下的error文件夹下的页面会自动识别为错误页面被springboot解析,如果没有该错误页面就触发白页
原理:如果发生错误,会以HTTP的状态码 作为视图页地址(viewName),找到真正的页面,
error/404、5xx.html。先是根据状态码精确匹配(例如404),匹配不到再模糊匹配(4xx),最后匹配不到才使用springboot的默认错误页(含错误信息的百页)
嵌入式Servlet容器
默认支持的webServlet:Tomcat, Jetty, or Undertow
引入web场景自带的服务器为tomcat,若要切换服务器需要在引入web场景是排除tomcat,再加上需要的web服务器
SpringBoot的定制化
1.常见定制化方式
(1)修改配置文件
(2)自定义配置类xxxConfiguration+@Bean替换、增加容器中默认组件;视图解析器
(3)Web应用 编写一个配置类实现 WebMvcConfigurer 即可定制化web功能;+ @Bean给容器中再扩展一些组件
(4)@EnableWebMvc + WebMvcConfigurer —— @Bean 可以全面接管SpringMVC,所有规则全部自己重新配置
PS:@EnableWebMvc注解使用代表全面接管SpringMVC的配置,即默认的自动化的web场景下的各种配置——拦截器,处理器等失效。
原理:添加注解 @EnableWebMvc
会自动引入@Import(DelegatingWebMvcConfiguration.class)
DelegatingWebMvcConfiguration又继承了 WebMvcConfigurationSupport
springboot的web场景中SpringMVC自动配置生效是因为有条件:@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)(这个配置是指没有没有WebMvcConfigurationSupport.class就使用springboot默认配置的)
但是自动引入的@Import(DelegatingWebMvcConfiguration.class)已经有了WebMvcConfigurationSupport,导致@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)的条件不成立,故添加@EnableWebMvc注解使SpringBoot的springMVC配置失效。
数据访问
SQL
1.导入数据库驱动
1.导入数据库驱动
对于数据库相关的配置,SpringBoot自动完成了数据源、jdbc和事务的配置
数据库的驱动配置是需要我们手动导入的(我们使用的数据库不同,官方不能做统一)
mysql mysql-connector-java5.1.40
2.使用自定义数据源
在application.yml中配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/fruitdb
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
使用Druid数据源
SpringBoot默认的数据源为:HikariDataSource
若要使用Druid数据源:
方法一:
1.引入依赖
com.alibaba druid1.1.10
2.自定义配置类
@Configuration
public class MyDataSourceConfig {
//与配置文件(application.yml)中的配置绑定
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource=new DruidDataSource();
return druidDataSource;
}
}
方法二
com.alibaba druid-spring-boot-starter1.1.17
选择durid的原因:德鲁伊为我们提供了各种各样的配置,防止SQL注入的安全配置,监控页等配置
德鲁伊官方地址:https://github.com/alibaba/druid
整合mybatis
1.配置模式
(1).引入SpringBoot第三方的mybatis依赖
org.mybatis.spring.boot mybatis-spring-boot-starter2.1.4
(2).mybatis-config.xml配置文件,mapper接口(添上@Mapper注解,表明这时一个mapper接口,使用其操作数据库),service实现类,mapper.xml文件
(3).在application.yml配置文件中配置mybatis规则
# 配置mybatis规则 mybatis: config-location: classpath:mybatis/mybatis-config.xml #全局配置文件位置 mapper-locations: classpath:mybatis/mapper/*.xml #sql映射文件位置
可以不写全局配置文件(mybatis-config.xml),所有全局配置文件的配置都放在configuration配置项中即可
mybatis:
# config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
configuration:
map-underscore-to-camel-case: true
2.注解模式
不用写mapper.xml映射文件,直接在接口中用注解写sql
@Mapper
public interface CityMapper {
@Select("select * from city where id=#{id}")
public City getById(Long id);
}
简单sql用注解,复杂sql写映射
PS:@ResponseBody+@RequestMapping:带数据的跳转
整合mybatis-plus
引入场景start
com.baomidou mybatis-plus-boot-starter3.4.1
整合redis
1.引入redis场景依赖
org.springframework.boot spring-boot-starter-data-redis
2.redis环境搭建
1、阿里云按量付费redis。经典网络
2、申请redis的公网连接地址
3、修改白名单 允许0.0.0.0/0 访问
3.application.yml配置redis相关加jedis
spring:
redis:
host: r-bp1nc7reqesxisgxpipd.redis.rds.aliyuncs.com #访问地址
port: 6379
password: 123 #密码
client-type: jedis
jedis:
pool:
max-active: 10
单元测试
Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
SpringBoot整合Junit以后。
- 编写测试方法:@Test标注(注意需要使用junit5版本的注解)
- Junit类具有Spring的功能,@Autowired、比如 @Transactional 标注测试方法,测试完成后自动回滚
如果需要继续兼容junit4需要自行引入vintage
org.junit.vintage junit-vintage-enginetest org.hamcrest hamcrest-core
常用注解
断言
断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别:
检查业务逻辑返回的数据是否合理。
所有的测试运行结束以后,会有一个详细的测试报告;
前置条件
JUnit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。
嵌套测试
Unit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制。
参数化测试
断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别:
检查业务逻辑返回的数据是否合理。
所有的测试运行结束以后,会有一个详细的测试报告;
JUnit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。
嵌套测试
Unit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制。
参数化测试
Unit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制。
指标监控
未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。
未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。
1.引入Actuator监控功能
org.springframework.boot spring-boot-starter-actuator
2.暴露所有监控信息为HTTP
management:
endpoints:
enabled-by-default: true #暴露所有端点信息
web:
exposure:
include: '*' #以web方式暴露
3.访问方法
项目路径加actuator 例:访问 http://localhost:8090/actuator/**
**代表要监控的信息,值有:beans,caches,env,heathey,info等
尚硅谷springboot2官方笔记:SpringBoot2核心技术与响应式编程 · 语雀
springboot官方学习地址:Spring Boot



