软件体系结构与架构技术 考试

软件体系结构与架构技术 期末闭卷考试:共 104 题,满分 100 分,限时 120 分钟。单选题与双选题每题 0.8 分;双选题每题恰有 2 个正确选项,多选、少选、错选均不得分;填空题每空 2 分。请在规定时间内独立完成。

Q1:姓名

填空1

Q2:班级

填空1

Q3:学号

填空1

Q4:某电商系统把用户管理、商品管理、订单管理、物流管理等所有模块打成同一个 war 包,部署在一台 Tomcat 上。该架构属于

微服务架构
SOA 架构
单体应用架构
垂直应用架构

Q5:由单体应用演进到垂直应用架构,最主要的动因是

解决“服务调用混乱”问题
解决“一损俱损”问题,让不同业务的应用可以各自独立扩容
解决“重复造轮子”问题
实现彻底的去中心化

Q6:在基于 SSM 的分层架构中,负责“执行 SQL、操作数据库”的是

Service(Spring)
Controller(SpringMVC)
Mapper(MyBatis)
View(Thymeleaf)

Q7:对“没有最好的架构,只有最合适的架构”这句话,理解最准确的是

架构选型应优先选择最新、最复杂的架构
架构选型要结合业务规模、团队能力与运维成本,不必盲目追求微服务
单体架构已经被完全淘汰,不应再使用
架构一旦确定就永远不应该调整

Q8:Maven 中唯一确定一个依赖所使用的“三个坐标”是

groupId、artifactId、scope
name、artifactId、scope
groupId、artifactId、version
groupId、package、version

Q9:在 pom.xml 中把某个依赖的 scope 配置为 test,意味着

该依赖由 JDK 自带提供
该依赖只在测试编译和测试运行时可用,不会被打进最终产物
该依赖只在编译主代码时可用
该依赖要到运行时才加载

Q10:Maven 加载 jar 包的正确顺序是

只从本地仓库加载,本地没有就直接报错
直接连中央仓库下载,然后使用
先查本地仓库,本地没有再去远程/中央仓库下载,下载后存入本地仓库再使用
先查远程仓库,再查本地仓库

Q11:执行 mvn package 之后,生成的 jar/war 默认位于

target 目录
src/main/java
~/.m2/repository
src/main/resources

Q12:“约定优于配置”这一核心思想在 Maven 中最直接的体现是

不同 IDE 生成的项目目录结构可以完全不一样
每个项目都必须手写一套构建脚本
只要按 src/main/java、src/main/resources 等标准结构放置文件,Maven 就能自动识别,无需额外配置
必须在 pom.xml 中显式声明每一个源码目录

Q13:IoC(控制反转)与 DI(依赖注入)的关系是

两者完全无关
DI 是指导思想,IoC 是实现方式
IoC 是指导思想,DI 是它的具体实现方式
两者都指的是用 new 创建对象

Q14:课程“五步进化”中的第 3 步“反射 + 配置文件”被称为 IoC 雏形,原因是

因为它使用了工厂模式
因为它已经用上了 Spring 容器
把要创建的类名写进配置文件,用反射动态创建对象,改配置即可换实现,Java 代码一行不改
因为它在代码里使用了注解

Q15:XML 装配 Bean 时, 中的 ref 表示

注入容器中 id 为 userDao 的 Bean 引用
声明该 Bean 的作用域
注入一个字符串常量
注入一个基本类型数值

Q16:容器中存在两个 IUserDao 类型的 Bean 时,下列做法不能解决注入歧义的是

在其中一个实现类上加 @Primary
在注入处加 @Qualifier("oracleUserDao") 点名
给两个实现类都加上 @Primary
删除多余的实现类,或在注入处改用 @Qualifier 精确指定

Q17:@ComponentScan(com.demo.step5) 的作用是

扫描数据库中的数据表
扫描项目中的静态资源
扫描 resources 下的 XML 文件
扫描指定包及其子包下带组件注解的类,把它们注册为 Bean

Q18:关于 @Repository、@Service、@Controller 三个注解,下列说法正确的是

三者彼此独立、互不相关
它们本质上都是 @Component 的派生注解,只是语义上分别标注数据访问层、业务层、控制层
@Repository 只能标注在接口上
只有 @Service 标注的类才会被扫描

Q19:MyBatis 属于

项目构建工具
缓存中间件
Web 表现层框架
ORM(对象关系映射)持久层框架

Q20:注解方式整合 MyBatis 时,用于标识 Mapper 接口的注解是

@Component
@MapperScan
@Repository
@Mapper

Q21:在 Mapper 接口中执行 insert 语句应使用的注解是

@Delete
@Insert
@Update
@Select

Q22:XML 映射文件中 的 namespace 属性的作用是

指定要连接的数据库名
指定 SQL 语句的返回类型
仅用于注释说明,不影响运行
区分不同的 mapper(全局唯一),并绑定 DAO 接口,使接口无需编写实现类

Q23:配置 时,column 与 property 分别对应

数据库字段、实体类属性
查询别名、主键名
实体类属性、数据库字段
数据库表名、实体类名

Q24:Spring Boot 中用于指定 Mapper XML 文件位置的配置项是

spring.datasource.url
mybatis.configuration.log-impl
mybatis.mapper-locations
mybatis.type-aliases-package

Q25:标签的核心作用是

无条件地加上 where 关键字
只有内部条件成立时才添加 where,并自动去掉第一个多余的 and 或 or
去掉更新语句末尾多余的逗号
循环拼接 in 条件

Q26:动态更新时使用 标签,主要解决的是

SQL 注入问题
结果集字段与属性不一致问题
更新字段末尾多余的逗号
结果集分页问题

Q27:采用前后端分离后,后端接口通常返回

XML 配置文件
拼装好的 HTML 页面
JSP 模板文件
结构化的 JSON 数据

Q28:@RestController 注解等价于

@Component + @RequestBody
@Controller + @ResponseBody
@Controller + @RequestMapping
@Service + @ResponseBody

Q29:要从请求路径 /api/students/1 中取出数字 1,应使用的注解是

@PathVariable
@RequestParam
@RequestBody
@ResponseBody

Q30:把请求体中的 JSON 自动转换成 Java 对象,应使用的注解是

@PathVariable
@RequestParam
@RequestBody
@ResponseBody

Q31:类上标注 @RequestMapping(/api)、方法上标注 @GetMapping(/students),实际访问路径是

/api/students
/api
/students
/api/students/students

Q32:方法返回一个 Java 对象、浏览器却看到 JSON,这一转换主要由谁完成

Maven
MyBatis
Jackson
Tomcat

Q33:要开启基于注解的缓存支持,需要在启动类上添加的注解是

@Cacheable
@EnableCaching
@EnableRedis
@MapperScan

Q34:自定义注解 @OpLog 必须同时具备的两个元注解是

@Documented 与 @Inherited
@Component 与 @Aspect
@Target(ElementType.TYPE) 与 @Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD) 与 @Retention(RetentionPolicy.RUNTIME)

Q35:切点表达式里的包名写错一个字母,运行时的表现是

不报错,但切面不生效,日志就是不出现
编译无法通过
启动时直接报错
业务方法不会执行

Q36:切点表达式 execution(* com.demo.service..*(..)) 中的“..”表示

任意方法名
该包及其所有子包(任意层级)
任意返回值类型
任意一个参数

Q37:在 @Around 方法中漏写 pjp.proceed(),结果是

编译阶段直接报错
业务方法不会执行
切面不会生效
业务方法照常执行

Q38:环绕通知中真正让目标业务方法得以执行的是

pjp.proceed()
pjp.getSignature()
log.info()
pjp.getArgs()

Q39:声明一个类是切面,应使用的注解是

@Aspect
@Pointcut
@Around
@Component

Q40:日志、权限、事务这类逻辑被称为“横切关注点”,主要因为它们

只在一个方法内部使用
与核心业务无关,却横着切过多个模块、每个方法都要重复处理
只能由架构师来编写
都属于数据库访问操作

Q41:配置 spring.cache.type=simple 时,缓存的底层实现是

JVM 内存中的 Map,应用重启即丢失
Redis 服务器
MySQL 中的一张缓存表
磁盘上的临时文件

Q42:更新数据库后还需要同步更新缓存,应使用的注解是

@CacheConfig
@CachePut
@CacheEvict
@Cacheable

Q43:@Cacheable 的执行逻辑是

先查缓存,命中则直接返回,未命中才执行方法并把结果放入缓存
只执行方法,不操作缓存
先执行方法,再把结果放入缓存
先删除缓存,再执行方法

Q44:要让切面只处理“贴了 @OpLog 标签”的方法、不打扰其他方法,切点应写成

@Pointcut("myPointCut()")
@annotation(opLog)
execution(* com.demo.service..*(..))
within(com.demo.service.*)

Q45:转账案例中“A 账户扣款成功、B 账户未到账、1000 元凭空消失”,直接原因是

Mapper 接口的方法名写错
该方法没有事务,第一条 SQL 执行完就已提交,第二条尚未执行就抛出了异常
数据库服务器宕机
Redis 缓存未命中

Q46:校验某个字段“不能为空”,应使用的注解是

@NotNull
@Pattern
@Size
@Min

Q47:Thymeleaf 中用于整体替换当前节点、引用公共片段的属性是

th:each
th:text
th:if
th:replace

Q48:对多个 Controller 统一做全局异常处理,应使用的注解是

@RestController
@RequestMapping
@ControllerAdvice
@InitBinder

Q49:关于单体应用架构,下列说法正确的有

开发、部署、测试相对简单快速
天然支持按模块独立扩容
一个 Bug 可能导致全线崩溃
完全无法进行任何功能拆分

Q50:关于微服务架构,下列说法正确的有

不需要 DevOps 与容器化技术支撑
服务拆得更小、更独立,可独立开发、部署、扩容、选型
通过中心化的 ESB 总线对所有服务统一调度
每个服务可以有自己的数据库,但运维复杂度显著提高

Q51:关于 Maven 仓库,下列说法正确的有

中央仓库在国内访问很快,因此无需更换为国内镜像
每次构建都必须联网重新下载全部依赖
本地仓库默认位于 ~/.m2/repository
本地仓库的位置可在 settings.xml 的 localRepository 中修改

Q52:关于 MyBatis 的注解方式与 XML 方式,下列说法正确的有

注解方式适合简单的单表 CRUD,代码简洁直观
XML 方式更适合复杂多表关联查询与动态 SQL
XML 方式不需要写 namespace
两者不能在同一项目中混用

Q53:关于 @RequestBody 与 @ResponseBody,下列说法正确的有

@RequestBody 用于把 Java 对象转成 JSON 返回给前端
@RequestBody 把请求体中的 JSON 转成 Java 对象
@ResponseBody 把返回的 Java 对象转成 JSON 写入响应体
@ResponseBody 用于从 URL 路径中取出变量

Q54:关于 JSON,下列说法正确的有

JSON 只能被 Java 语言解析
是一段纯文本,用 {} 表示对象、用 [] 表示数组
JSON 的键必须与 Java 属性名毫无关系
键和字符串值都必须使用双引号

Q55:下列属于 AOP 典型应用场景的有

统一记录日志与统计方法耗时
库存扣减的业务规则本身
订单金额的计算规则本身
统一做权限校验、事务管理

Q56:下列做法属于分层设计反模式的有

用 MapStruct 自动完成 DTO 与 Entity 的转换
Controller 直接返回 Entity,导致密码、身份证号等敏感字段暴露
在 DAO 层编写业务逻辑
Controller 只负责接收请求和返回响应

Q57:下列属于 Bean Validation 校验注解的有

@Transactional
@NotNull
@Autowired
@Size
软件体系结构与架构技术 考试
关于
1周前
更新
0
频次
57
题目数
分享
问问AI
有问题?问问AI帮你修改 改主题:如咖啡问卷改为奶茶问卷