WEB后端
Maven
- Maven坐标
- 配置依赖
- 排除依赖
生命周期
执行方式:
测试
- 测试方法
单元测试
- Junit
- 常见注解
断言
依赖范围
SpringBoot
项目搭建
勾选的选项:
Lombok,Spring Web,MyBatis Framework,MySQL Driver
HTTP
请求数据
- 请求行
- 请求头
- 请求体
响应数据
分层解耦 IOC DI
三层架构
分层解耦
步骤
MYSQL
连接:
mysql -u用户名 -密码 [-h数据库服务器IP地址 -P端口号]
mine:mysql -uroot -pshenentao520
退出: exit
- 关系型数据库
SQL语句
DDL
数据库
其中database可以换成schema
表结构
- 创建
约束:
- 数值类型
- 字符串类型
- 日期时间类型
- 查询,修改,删除
DML
insert
data
delete
DQL
基本查询
不推荐用第二个
条件查询
分组查询
- 聚合函数
注:聚合函数不参与null的统计
排序查询
分页查询
起始索引:(页码 - 1) * 每页展示记录数
JDBC
格式:
查询:
Mybatis
- 查询数据
- 删除用户
- 新增用户
- 修改用户
- 查询用户
XML映射配置
yml配置文件
事务
如添加员工的操作包括保存员工信息和经历信息,两者有一个有误的话会对添加员工有影响,所以要通过事务来让两者同时成功或失败
操作:
- 动态遍历
事务管理-控制事务
阿里云OSS
参数化配置
- ConfigurationProperties
登录认证
登录校验
- Cookie
先通过响应头Set-Cookie把Cookie保存在浏览器上,在通过请求头获取到Cookie
- Session
与Cookie相似,唯一区别就是在浏览器中保存的是Session的唯一标识(id),前端看不到具体信息,相对安全
- 令牌
如同身份证一样,真的身份证就通过,伪造的就不行
JWT令牌
生成/解析
过滤器Filter
- 令牌校验
1 | package com.example.tliaswebmanagment.Filter; |
拦截器Intercepter
- 先过安检门(Interceptor)
- preHandle() —— 进门检查:鉴权、限流、日志、包装请求……
返回 true → 放行;返回 false → 直接打回(后面全不执行)
- preHandle() —— 进门检查:鉴权、限流、日志、包装请求……
- 到达 Controller 执行业务
- 业务办完,回来再过安检门
- postHandle() —— 出门检查:可以改 ModelAndView(数据+页面),但异常时不会进来
- 渲染视图(JSON/HTML 等)
- 最后再过一次安检门
- afterCompletion() —— 无论成功失败都会进:清理资源、记录耗时、统计异常……
- 拦截路径
AOP
步骤:
核心概念
- 连接点 JoinPoint
= 整部电影里每一句台词(每一个方法)。
特效师可以随时在任意一句台词上做手脚,但还没决定到底改哪句。 - 通知 Advice
= 具体加的特效本身:“火焰怎么烧、烧多久”。
在代码里就是一个普通方法,里面写“记录时间、开事务、打日志”这些重复动作。
一句话:“改什么内容”。 - 切入点 PointCut
= 特效师真正挑选的那些台词:“只要男主角说英文,就加火焰特效”。
一句话:“要改哪里”。 - 切面 Aspect
= 把“要改哪里”和“改什么内容”订在一起的合同:
“男主角英文台词 + 火焰特效”合成一张特效表,这就是切面。
一句话:“切入点 + 通知”的配对。 - 目标对象 Target
= 被加特效的男主角本人(原始业务类,如DeptServiceImpl)。
他完全不知道自己被烧了火焰,照常背台词。
- 执行流程
当 Spring 容器启动时,如果发现某个 Bean(例如 DeptServiceImpl)的方法匹配了 @Aspect 切面里定义的切入点表达式,就会提前为它生成一个动态代理对象(JDK 动态代理或 CGLIB 代理)。
这个代理对象实现了与目标对象相同的接口(或是目标对象的子类),因此方法签名完全一致,从外表上看两者没有任何区别。
在代理对象的同名方法内部,Spring 会把我们定义的通知代码(如 @Around、@Before、@After 等)织入进去:
先执行切面里写的附加逻辑(如记录时间、开启事务、权限校验),再通过 joinPoint.proceed() 回调原始目标对象的真实方法,最后再执行后置逻辑。
因此,当 Controller 中通过 @Autowired 注入 DeptService 并调用 deptService.list() 时,实际拿到的是容器里的代理对象,而不是原始的目标对象。
这次调用首先进入的是代理方法,从而自动触发了 AOP 的逻辑;也正因为如此,AOP 只对**“从外部穿过代理对象”的方法调用生效,而类内部自调用**(如 this.list())则不会触发代理,也就不会进入切面。
通知类型
内部
外部
jar包的话用maven里的package
通知顺序
切入点表达式execution&annotation
连接点
原理篇
配置
jar包的话用maven里的package
然后再target里找
Maven
分模块设计
对开发和维护更有利,增加复用性
继承
打包方式用<package>...</package>修改
只支持单继承,不能多继承,但可以多重继承
- 版本锁定
- 自定义属性





































































































