目录
项目与工程化
Maven
配置文件:
- maven试用groupId:artifactId:version三者来标识一个唯一的二进制版本。
- packaging代表打包的方式,有pom、jar、war、ear、custom。
- properties是全局属性的配置
- dependencies是对依赖的管理
- plugins是对插件的管理。
依赖管理:
- 一些jar依赖可以由groupId:artifactId:version标识
- 完整的标识为:groupId:artifactId:classifer:version
- 依赖再编译部署中参与的情况可以由scope来指定,分别为compiler、test、peovider、system、import,默认是compiler。
- 依赖是一个树状结构,采用最左依赖原则,可以通过exclusions排除一些包。(在依赖树种,离当前节点最近的依赖优先级最高,一样远的时候第一个优先)
构建流程:
- validate:验证项目以及信息是否正确
- compiler:编译源代码和相关资源文件
- test:测试代码进行测试
- package:根据不同的项目类型进行打包
- verify:验证打包的正确性
- install:安装到本地maven
- deploy:打好包发布到远程仓库
git
分支:
- master:生产环境的分支
- develop:最新开发成果的分支,实现了软件需求的功能,完成了测试,可以合并到master
- feature:从develop拉取的分支,用于开发
- releas:辅助版本的分支,从develop分支派生,必须合并回develop和master
- hotfix:修改生产代码中有缺陷的分支
日志规范:
<type>(<scope>):<subject>
<body>
<footer>
type:用于说明commit类别:
- feat:新功能(feature)
- fix:修复bug
- docs:文档
- style:格式
- refactor:重构
- test:测试
- chore:构建或辅助工具的变动
scope:说明commit影响的范围
subject:是commit的简短描述
body:详细描述
例子:
fix(xxxservice):修复了xxxx的bug。
feat(basket):优化结构
开发框架
注解
spring注解主键兼容JSR-330
@Autowired根据类型匹配,通过名称需要配合@Qualifier;@Resource根据bean的名称匹配获取不到再根据类型去匹配。
@PostContruct在构造bean结束后会执行一些初始化动作
@PreDestory在构造bean销毁前会执行一些初始化动作
循环依赖
替换provider,在构造器或方法用get方法打破
对于方法或字段注入的情况,将依赖的一边通过单例作用域。
ORM
mybatis和hibernate对比:
mybatis灵活性好,是半orm,修改字段需要修改mapper,需要手写sql,对数据量大性能要求高的场景能高度定制sql。
Spring
- bean的初始化到销毁的生命周期
- 容器事件侦听器:
ContextStartedEvent上下文启动事件
ContextRefreshedEvent上下文刷新事件完毕
ContentStoppedEvent上下文停止事件
ContentClosedEvent上下文关闭事件 - Bean的初始化和销毁。
AOP
重要知识点:
- Aspect:切面
- JoinPoint:连接点
- Advice:通知befrore、after、after-returning、after-throwing、around
- PointCut:切面位置
- execution:用于匹配方法执行的连接点
- within:匹配指定类型内的方法执行,@within
- this:匹配当前AOP代理对象类型的执行方法
- target:匹配当前目标类型的执行方法 @target
- args:匹配当前执行的方法传入的参数为指定类型的执行方法 @args
- @annotation:匹配当前执行方法持有指定注解的方法
spring的AOP实现原理涉及两种方式,分别是JDK和CGLIB
- 如果目标对象实现了接口,默认情况会使用JDK
- 如果目标对象没实现接口必须使用CGLIB,使用CGLIB会获取不到方法上的注解,需要用其他方法处理
@EnableAspectJAutoProxy(proxtTargetClass = true) 强制使用CGLIB
数据存储
使用uft8mb4作为字符集,这样可以区分emoji,而校对规则使用utf8mb4bin,使用utf8mb4_gengeral_ci会有emoji无法区分的问题。
大表优化
- 限定范围,如最近一个月的数据
- 读写分离
- 垂直分区(一个表拆成两个表)
- 水平分区(分表)
DDL优化
- 禁用存储过程、函数、触发器、外键约束
- 允许为null的列在!='a'时为null的无法匹配
- 枚举或整数代替字符串
- Id为bigint即可
- 避免使用decimal和浮点数数据,可以用bigint代替(*100)
- cre和updatetime带上CURRENT_TIMESTAMP(0)和 ON UPDATE CURRENT_TIMESTAMP(0)
- 整数存ip而不是字符串
DML优化
- 不适用*查询
- 避免使用!和<> 或or查询而用in,in的效率俄日logn
- 连续条件查询用between而不是in
- 模糊查询尽量不加前缀模糊
- 使用union尽量使用union all
- 插入数据如果是自增可以用select last_insert_id()获取自增值
数据通信
restful
表现层架构转移
- Resource:资源,主要是数据
- Representational:数据表现形式,如json。xml。html
- state Transfer:状态变化
返回码
- 2xx请求正常
- 3xx重定向
- 4xx请求有误
- 5xx服务端错误
RPC
remote procedure call 远程调佣,如feign
其他参考资料:后端知识积累,https://g.yuque.com/fidel-yiu/yeyasn/ditrff