SpringBoot

开发流程

开发流程介绍

1.创建项目

maven项目

2.导入场景

web场景依赖

3.主程序

 

4.业务

 

5.测试

默认访问localhost:8080

 

6.打包

SpringBoot打包插件加载:

 

打包命令:mvn clean package把项目打包为一个可执行jar包

启动命令:java -jar xxx.jar启动项目

 

在实际的Spring项目中,通常会采用分层架构来组织代码,这种架构将代码分为MapperServiceController三层,每一层都有明确的职责。

2.1 Mapper(数据访问层)

2.2 Service(业务逻辑层)

2.3 Controller(控制层)

特性小结

1.简化整合

导入相关的场景,拥有相关的功能。即拥有场景启动器:

官方提供的场景:命名为:spring-boot-starter-*

第三方提供的场景:命名为:thirdpartyproject*-spring-boot-starter

 

2.简化开发

无需编写任何配置,可以直接开发业务

 

3.简化配置

properties优先级大于yml

application.properties:集中式管理配置文件

yaml:树形集中式管理配置文件(缩进隔离)

yml获取配置信息

例如邮箱发送的yml配置信息如下:

java中获取配置信息:

@Value("${键名}")实现方式:

@ConfigurationProperties(prefix="前缀")

实体类的成员变量名需与配置文件中的键名保持一致

实现方式:

 

4.简化部署

linux服务器上只需要有java环境即可

 

5.简化运维

修改配置(外部配置application.properties)、监控、健康检查。

spring initializr(Spring Boot)

一键创建整个项目结构

入门分析

1.依赖管理机制

思考: 1、为什么导入 starter-web 所有相关依赖都导入进来? 开发什么场景,导入什么场景启动器。 maven依赖传递原则。A-B-C:A就拥有B和C 导入 场景启动器。 场景启动器 自动把这个场景的所有核心依赖全部导入进来 2、为什么版本号都不用写? 每个boot项目都有一个父项目 spring-boot-starter-parent parent的父项目是spring-boot-dependencies 父项目 版本仲裁中心,把所有常见的jar的依赖版本都声明好了。 比如:mysql-connector-j 3、自定义版本号

利用maven的就近原则 直接在当前项目 properties 标签中声明父项目用的版本属性的 key

直接在dependcy中设置version标签版本号

2.自动配解机制

自动配置好了

注解

Bean

Bean扫描

Boot工程默认扫描启动类的包及其子包下的内容

额外扫描:@ComponentScan(base-package="come.siyueqi")

spring中用:

标签:<context:component-scan base-package="com.siyeuqi">

注解:@ComponentScan(base-package="come.siyueqi")

Bean注册

注解说明位置
@Component声明bean的基础注解不属于以下三类时,用此注解
@Controller@Component的衍生注解标注在控制器类上
@Service@Component的衍生注解标注在业务类上
@Repository@Component的衍生注解标注在数据访问类上(用于与mybatis整合,用的少)

若注册的bean对象来自于第三方,则无法使用以上的注解声明bean:

@Bean@Import

 

 

组件注册

@ConfigurationSpring配置类:

@SpringBootConfigurationSpringBoot配置类

@Bean替代Bean标签,组件在Ioc中的名字即为方法名或@Bean("name")

@Scope替代Scope标签,设置实例为单实例或多实例

@Conditional

-->@ConditionalOnProperty@配置文件中有指定信息则注入,否则不注入

-->@ConditionalOnMissingBean@Ioc容器中有xxx.class则不注入,否则注入

-->@ConditionnalOnClass@当前启动器环境中有某个类则注入,否则不注入

 

自定义starter

 

 

大事件

开发模式-接口文档

明确需求-->阅读接口文档-->思路分析-->开发-->测试

参数校验框架-SpringValidation

起步依赖:

在需要进行校验的参数前添加@Pattern,在Controller类添加@Validated

 

参数校验失败异常处理-全局异常处理

其中SpringBoot拥有一个StringUtils.hasLength方法判断e.getMessage()是否有返回值,若无则会返回设定的操作失败.

StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失败" <--操作符

注册与登录

 

登录认证-拦截器

登录令牌-Jwt/Session/JId

承载业务数据,减少后续请求查询数据库的次数

防止篡改,保证信息的合法性和有效性

---Json Web Token

组成:

第一部分:Header 记录令牌类型,签名算法

第二部分:Payload 携带自定义信息,默认信息

第三部分:Signature 防止Token被篡改,确保安全性

生成

生成测试:

验证

验证测试:

拦截器

web访问

拦截器

主页

详情

登录

实现:

拦截器会对token进行认证,随后再放行给各个servlet

ThreadLocal

提供线程局部变量,有set(),get()方法.ThreadLocal存储数据线程安全(非手动锁)

Lambda表达式可以实现一个匿名接口函数式类方法,简化new过程

remove可以放在拦截器中的aftercompletion方法中,避免内存泄漏

更新用户数据

@RequestBody的作用是将前端返回的json类型数据解析为java实体类

 

 

分组校验

Validation的分组校验接口

定义分组:在实体类内部定义接口

校验项分组方式:通过groups属性指定

校验时指定分组:@Validated注解中的value属性赋值

校验项默认属于default分组,支持default默认分组,支持校验项接口继承

 

自定义校验

自定义注解state

自定义校验数据的类StateValidation实现ConstraintValidation接口

State.java(anno)

StateValidation.java

article.java

ArticleController.java

 

动态查询+条件分页(Mybatis + SpringMVC)

Springboot约定大于配置

xml文件项目配置:

重点要求举例
1. namespace必须和接口全限定名 一字不差(大小写、包名、单词顺序)<mapper namespace="com.siyueqi.bigevents.mapper.ArticleMapper">
2. id必须和接口方法名 完全对应<select id="getList" ...>
3. parameterType / resultType要么省略,要么写对;动态 SQL 通常省略resultType="com.siyueqi.bigevents.pojo.Article"

 

ArticleServiceimpl.java

 

ArticleController.java

 

ArticleMapper.xml

 

获取文章详情

ArticleController.java

 

ArticleService.java

 

ArticleServiceimpl.java

ArticleMapper.java

 

更新文章

Article Controller.java

注意:@RequestBody只能绑定一个对象。

@RequestBody 的作用是:将整个请求体(JSON、XML 等)反序列化为一个 Java 对象。

  • ✅ 你可以用一个来接收多个字段(推荐方式)。

  • ✅ 也可以用一个Map<String, Object> 来接收任意字段。

ArticleService.java

 

ArticleServiceimpl.java

差异点第一段第二段
1. 调用对象直接把入参 article 传给 updateByIdnew Article(),再把属性拷贝过去,用新的 arti 去更新
2. 实际效果与第二段等价,因为两变量指向同一个对象与第一段等价,因为 artiarticle 内容相同
3. 额外开销多一次 newBeanUtils.copyProperties 的反射/拷贝
4. 潜在风险若调用方后续继续使用 article 对象,可能误把未设置的字段当成 null 去处理业务拷贝后原对象与持久化对象隔离,后续对 article 的修改不会影响数据库
5. 代码意图简洁、直接,暗示调用方已准备好完整实体显式“防御式拷贝”,防止调用方误改或隐藏字段覆盖

 

1.新建一个只包含可修改字段的 DTO:

2.Controller 直接接收这个 DTO,再调用 Service:

3.Service 里用 MyBatis-Plus 的 updateById(字段策略 not_null 时最安全):

优点:


删除文章

ArticleController.java

ArticleService.java

ArticleServiceimpl.java

ArticleMapper.java

 

文件上传与OSS

文件上传本地保存

FileUploadController.java

通过UUID将图片唯一化,不容易被覆盖/重写

图片上传云服务器

AK:

SK:

 

 

登录优化—Redis

Springboot Including Redis

登录成功获得token->服务器redis储存token->拦截器验证客户端发送的token是否与服务器redis储存的token相同

 

 


前端

Vue3+Element

Vue3

Js导入导出

必须在script标签中且属性为module

导入方式:import {模块name} from './.js文件路径'

批量导出

export {函数名1,函数名2,...,函数名n}

别名

函数名 as 别名 例如 simplename as sn

默认导出

export default {函数1,函数2,...,函数n}

导出后不需要特别指出函数名

vue

v-for

列表渲染,遍历容器的元素或者对象的属性

v-for = "(item,index) in items"

遍历的数组需要定义在data中,v-for在需要的标签中进行属性引用

 

v-bind

动态为Html标签绑定属性值

v-bind:属性名="属性值" --> :属性名="属性值"

绑定的属性值需要定义在data中,v-bind在需要的标签中进行属性引用

 

v-if&show

用来控制元素的显示与隐藏

v-if/show="表达式" true时显示,false时隐藏

特殊点:

v-if基于条件判断来控制创建或移除元素节点(条件渲染)

v-show基于css样式display来控制与隐藏

v-if:要么显示,要么不显示,不需要频繁切换的场景

v-show:频繁切换显示隐藏的场景

 

v-on

为Html标签绑定事件

v-on:事件名="函数名"-->@事件名="函数名"

 

v-model

在表单元素上使用,双向数据绑定,获取或设置表单项数据

v-model="变量名"

绑定的属性值需要定义在data中,v-bind在需要的标签中进行属性引用

 

vue生命周期

生命周期:指一个对象从创建到销毁的整个过程

八个阶段:每个阶段会自动执行一个生命周期方法(钩子),让开发者可以在特定阶段执行代码(面向切面)

状态阶段周期
beforeCreate创建前
created创建后
beforeMount载入前
mounted挂载完成
beforeUpdate数据更新前
updated数据更新后
beforeUnmount组件销毁前
unmounted组件销毁后

重点:mounted

Ajax-axios

axios.请求方式(url[],data[],config[])

完整写法:

 

vue+axios实战