第一章 入门学习
一、Spring的功能
- 微服务开发:大的项目都是拆成一个个小的模块,一个模块对应着一个小的微服务,微服务可独立部署和升级
- 响应式编程
- 分布式云编程
- 网页应用
- 无服务开发:函数式服务直接上传云平台,节省人力财力物力
- 事件驱动:根据事件创建一个实时的数据流,数据流通过响应式的方式占用少量的资源完成高吞吐量的业务
- 批处理
二、为什么学习SpringBoot?
能快速创建出生产级别的Spring应用
- 创建独立Spring应用
- 内嵌web服务器
- 自动starter依赖,简化构建配置
- 自动配置Spring以及第三方功能
- 提供生产级别的监控、健康检查及外部化配置
- 无代码生成、无需编写XML
第二章 SpringBoot2入门学习
一、maven设置
导入阿里云仓库的镜像,以便快速的导入依赖。maven的版本需要3.3以上
二、构建一个HelloWorld工程
1.导入父类的maven项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
2.引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.创建主程序
/**
* 主程序类
* @SpringBootApplication:这是一个SpringBoot应用
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
4.编写业务
@RestController//Ⅱ用来处理请求
public class HelloController {//Ⅰ我写了一个控制器
@RequestMapping("/hello")
public String handle01(){//Ⅲ这个方法用来处理hello请求
return "Hello,Spring Boot 2!";//Ⅳ最终返回的数据写给浏览器
}
}
5.测试
说明已经在端口8080启动了服务
6.简化配置
在这个新建的配置文件中,可以修改tomcat的设置,包括SpringMVC的一些设置
比如该端口号:server.port=8888
Springboot也体现了其优点:只需要修改一处配置文件就可以修改整个应用配置,包括Spring也简化了部署
三、了解自动配置
这个父项目几乎包含了所有开发所需的场景启动器
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
四、SpringBoot理解的特点
核心:注入依赖和Ioc控制反转,(约定优先于配置)
1.快速构建项目
使用 IDEA能够快速的创建项目
2.内部提供Web容器
引入spring - boot - starter - web依赖为Tomcat
引入spring - boot - starter - webflux依赖为Netty
开发者根据需求选择合适的Starter获得一个默认的容器即可。启动成功后,应用一个默认端口为8080的HTTP服务
3.易于构建任何应用
提供所有所需的依赖
4.自动化配置
根据提供的依赖提供一些默认的配置供我们使用,如需修改,只需要修改对应的配置文件application.properties即可
5.开发者工具
在开发web应用时,修改代码伴随重启项目,需要不断断开服务器再手动重启。而SpringBoot提供了spring - boot - devtools当我们重新编译类文件的时候,开发者工具会自动替我们重启应用,无需手动重启。
6.强大的应用监控
提供了一个spring - boot - starter - actuator来供我们查看应用的各项指标以监控我们的应用,防止出现异常。
7.默认提供测试框架
引入了spring - boot - starter - test依赖,可以通过它对各种场景进行测试,满足项目对测试的需求
8.可执行jar部署
可以利用maven或者gradle对项目进行打包,生成jar文件,可以直接在本地或者具备服务器的环境下快速运行
9.IDE的多样性
eclipse和IDEA都可以开发SpringBoot的应用
五、容器功能
5.1组件添加
@Configuration
- 配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
- 配置类本身也是组件
- proxyBeanMethods:代理bean的方法
Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
组件依赖必须使用Full模式默认。其他默认是否Lite模式 - 与springboot1最大的不同:proxyBeanMethods(代理Bean的方法)有大作用,比如一个组件要依赖另一个组件,那就调成true,一般都选用false
Full(proxyBeanMethods == true):全量级模式
Lite(proxyBeanMethods == false):轻量级模式 优点:spring boot跳过对容器中返回的东西的检查,使得其运行变快
@Bean、@Component、@Controller、@Service、@Repository、@ComponentScan
- @Bean:给容器中添加属性,以方法名作为组件的id,返回类型就是组件类型,返回的值就是组件在容器中的的实例
- @Component:代表是一个组件
- @Controller:代表是一个控制器
- @Service:代表是一个业务逻辑组件
- @Repository:代表是一个数据库层组件
- @ComponentScan:通过包扫描指定包扫描的规则
@Import:给容器中导入一个组件
给容器中自动创建出指定类型的组件、默认组件的名字就是全类名
如:@Import({User.class, DBHelper.class})
@Conditional
满足conditional指定的条件,则进行组件注入
@ImportResource
用于原生配置文件引入,如果某些开发者还是将Bean写在了配置文件里,就可以用
@ImportResource("classpath:beans.xml")
将bean文件导入
@ConfigurationProperties
分为两种:
①
@EnableConfigurationProperties + @ConfigurationProperties
②
@Component + @ConfigurationProperties
一般用第一种
@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把Car这个组件自动注册到容器中
public class MyConfig {
}
六、自动配置原理
1.引导加载自动配置类
主要是@SpringBootConfiguration
,其下有两大注解@ComponentScan
和@EnableAutoConfiguration
1.1.@ComponentScan
指定扫描哪些,Spring注解
★1.2.@EnableAutoConfiguration
其下又分@AutoConfigurationPackage
和@Import(AutoConfigurationImportSelector.class)
①@AutoConfigurationPackage
:用register机制批量导入组件
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
public @interface AutoConfigurationPackage {}
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。
②@Import(AutoConfigurationImportSelector.class)
:用Selector机制批量导入组件
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
2.按需开启自动配置项
虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。
3.修改默认配置
用户自己配置流程是固定的,先判断有没有,后判断需不需要,最后在判断到底用谁的。
@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件
public MultipartResolver multipartResolver(MultipartResolver resolver) {
//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。
//SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范
// Detect if the user has created a MultipartResolver but named it incorrectly
return resolver;
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先
总结:
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
○ 用户直接自己@Bean替换底层的组件
○ 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 —> application.properties
七、SpringBoot实际应用
步骤:
- 根据开发需要,引入指定的场景依赖
https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using - 查看自动配置了哪些(选做)
○ 自己分析,引入场景对应的自动配置一般都生效了
○ 配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效) - 是否需要修改
○ 参照文档修改配置项
■ https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties
■ 自己分析。xxxxProperties绑定了配置文件的哪些。
○ 自定义加入或者替换组件
■ @Bean、@Component。。。
○ 自定义器 XXXXXCustomizer;
○ …
八、开发技巧
1.使用Lambok插件 – 用于简化JavaBean开发
首先引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
idea中搜索安装lombok插件
===============================简化JavaBean开发===================================
@NoArgsConstructor//无参构造器
//@AllArgsConstructor
@Data//get、set方法
@ToString
@EqualsAndHashCode
public class User {
private String name;
private Integer age;
private Pet pet;
public User(String name,Integer age){
this.name = name;
this.age = age;
}
}
================================简化日志开发===================================
@Slf4j//引入日志
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handle01(@RequestParam("name") String name){
log.info("请求进来了....");
return "Hello, Spring Boot 2!"+"你好:"+name;
}
}
2.dev-tools – 用于热更新(自动重启)
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
3.Spring Initailizr(项目初始化向导)
用于新建一个工程时,自动配置初始化的一些操作,用于自动依赖引入、自动创建项目结构和自动编写好主配置类。
第二章 SpringBoot核心功能
一、配置文件
1.properties文件
2.yaml(yml)文件
适合用来做以数据为中心的配置文件
2.1基础语法
- key: value;kv之间有空格
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
- 字符串无需加引号,如果要加,''与""表示字符串内容 会被 转义/不转义
2.2使用yml文件读取数据
用yml进行单个数据的数据读取:
将又买了文件中的所有属性统一自动装配:
由于使用时,并不是单个数据的获取,但也并不是批量的全部导入,只需要部分数据的对象,所以采用了以下的方式,也是springboot主流的开发方式:
- 如果想封装局部数据,首先得提供部分数据
- 然后提供一个封装的模型类,这个类就是用来分装部分的数据根据模型类上的注解将模型类和数据关联起来
- 这个类必须受spring管控,所以必须弄成spring的一个Bean,所以要挂上注解@Component
- 自动装配不属于封装数据,只是为了看到数据
二、Web开发
1.简单功能分析
1.1静态资源访问
- 只要静态资源放在类路径下: /static (or /public or /resources or /META-INF/resources
- 访问 : 当前项目根路径/ + 静态资源名
- 原理: 静态映射/**。
- 请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面
改变默认的静态资源路径
spring:
mvc:
static-path-pattern: /res/**
resources:
static-locations: [classpath:/haha/]
1.2欢迎页支持
● 静态资源路径下 index.html
● controller能处理/index
静态资源直接放到static文件中,包括自定义 Favicon.ico文件
三、整合第三方技术
1.整合Junit
步骤:
总结:
@SpringBootTest注解的属性classes作用:就是可以精准的指定你配置类或者引导类的位置,配置好后就加载指定的配置类
2.整合MyBatis
步骤:
可能存在的报错问题:
3.整合MyBatis - plus
4.整合Druid
druid整合的专用配置:
总结:
四、整合SSMP案例制作分析
1.创建工程
2.实体类快速开发
3.数据层标准开发
步骤:
总结:
4.开启MP运行日志
通过看日志来确定内部是如何执行sql语句的
5.数据层开发——分页功能
由于数据太多不好进行管理,就要显示的数据太多了,一次显示可能需要很长时间。因此分成多页,每页显示一定的数据。是通过拦截器实现的,拦截器需要一个Ipage的对象
总结:
6.数据层开发——条件查询
推荐使用:
7.业务层开发
都定义为逻辑功能,业务层是用来做判断的
总结:
8.业务层的快速开发
该实现类直接做好了所有配置类的增删改查
总结:
9.表现层开发
- 功能测试
- 定义一个@RestController
- 设定公共的请求路径前缀
- 注入对应的业务层接口
- 做一些操作
- 做完之后用postman做测试
10. 表现层消息一致性的处理
如果查询得到的数据格式都不相同,会给前端工作造成麻烦,所以需要消息的一致性处理
11.前后端协议联调
第三章 开发基础篇
1.列表功能
小结:将查询数据返回到页面,利用前端数据双向绑定进行数据展示
2.添加功能
3.删除功能
添加防误删的提示操作:
4.修改功能
5.CRUD存在的问题——异常消息处理
6.分页功能
current - page:当前页
page - size:页面所容纳的数据
total:总页数
分页功能存在的bug:以下方式采用了后台补救的方式,还存在bug,所以基于业务需求进行删除
7.条件查询
@RequestMapping注解的含义:给访问的类起个名字,便于浏览器访问到他
SpringMVC中:
前端控制器Dispatcherservlet给控制器发送请求,控制器调用业务层处理,处理得到的数据封装到model传回给前端控制器,再由前端控制器发送给视图层,视图层返回给前端控制器一个html文件,返回响应。具体开发中前端控制器自动生成,只需开发控制层和视图层。