Jul 10, 2022
南京大学软件学院-软件工程与计算Ⅱ大作业心得
笔者在南京大学软件学院2022年春-软件工程与计算Ⅱ课程中获得99分,其中大作业118分(满分100,拿了18分的 bonus)。因此记录下自己的作业心得。
SpringBoot
1. 面向接口编程
- 主要用于代码复用、消除循环依赖、实现拓展等
- 方法:抽象公共父类(最低阶)、泛型编程(更灵活,根据具体类注入,可以实现参数和实现的多态)。下面以个人项目实践中的根据泛型实现面向接口编程举出实例:
// 接口类,通过泛型注入具体参数,实现每个方法的参数多态 |
2. 设计模式
- 策略模式:
- 将策略方法抽象成接口,用不同的实现类实现它。
- 在调用 service 里组合接口类(而不是具体的实现类),根据情况向接口中注入具体的类。
// 策略接口 |
3. 定时任务
比较简单,主要通过 SpringBoot 的
org.springframework.scheduling.annotation.Scheduled
包实现需要书写
cron
表达式,跟 Linux 系统的 cron 定时任务语法相似
4. AOP(面向切面编程)
思想:通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
所谓的切面(Aspect),可以简单理解为程序中的共性功能。AOP 通过关注程序中的共性功能(面),将其通过一些技术(预编译、代理等)进行统一处理,从而减少代码重复,提高效率。
一般认为切面 = 通知 + 切入点
切入点是指我们要对哪些 Joinpoint 进行拦截的定义,通俗的说就是
被增强类中的被增强的方法
,即切入的地方。注意,被增强类中并不是所有的方法都被代理了所谓通知是指拦截到 Joinpoint (被增强的方法)之后所要做的事情就是通知,通俗的说就是
对被增强的方法进行增强的代码
,即要做的事情
典型的 AOP 应用场景有:HTTP request 的鉴权授权、日志记录等
使用:
Spring Boot 使用 AOP 需要添加 spring-boot-starter-aop 依赖,如下:
<dependency>` `<groupId>org.springframework.boot</groupId>` `<artifactId>spring-boot-starter-aop</artifactId>` `</dependency>
代码实例:
// 表示当前的类是一个配置类 |
5. Bean 的装配
这里主要记录踩到的坑,具体的知识点较为庞杂,在本周的学习中进行具体的记录
主要是装配时发生了空指针异常,而异常类已经标上了相关注解。百思不得其解,最后发现 SpringBoot 对 bean 的装配是自动管理,即不需要程序员手动 new。而一旦程序员手动 new,SpringBoot 即认为程序员接管了装配,不再进行自动配置。而本人的异常即为手动 new 了对象造成。
MyBatis
- resultType / resultMap
- 用于指定返回类,用途相似,一般用 resultType 更方便。详细的知识点在之后的文档学习中具体记录。
Jenkins
Agent
- 可以简单理解为执行 pipeline 的环境。一般选择代码构建所需的环境。
在配置前端 Jenkins 时,曾遇到 npm: not found 错误。原因是 Jenkins 所在容器未安装 nodejs,也并未挂载宿主机的 nodejs 脚本。解决方法是配置 node 某个版本(我用的是 node: 14)的 agent。在 agent 中执行 npm
Pipeline
- 简单的说就是 Jenkins 执行的一个个任务。可以按照环境清理(Image clear)、环境准备(Prepare)、构建(Build)、测试(Test)、打包(Deploy)等步骤细分
Docker in docker
- 由于我的 Jenkins 部署在 docker 中,而有时需要在 Jenkins 环境下执行 docker 命令,即(Docker in docker),我是通过挂载宿主机的 docker 脚本和 docker.sock 实现的
Gitlab-runner
基本配置
- 基本照着网上的教程一路走下来即可。踩的一个大坑是需要手动在配置文件里指定
clone_url
(仓库的地址)。并且这个地址亲测不能是 ci/cd 页面给的 http 地址,必须与仓库 url 一致(如果是 https 必须是 https)。但是由此在设置artifact
时可能会带来请求拦截问题,目前尚未解决。
- 基本照着网上的教程一路走下来即可。踩的一个大坑是需要手动在配置文件里指定
Volumes
- 与上述 Jenkins 同样,需要挂载宿主机的 docker 脚本和 docker.sock 来实现 Docker in docker
Type
- 我用的是 docker,没试过 shell 等其他类型