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

软件体系结构与架构技术 期末闭卷考试:共 104 题,满分 100 分,限时 120 分钟。单选题与双选题每题 0.8 分;双选题每题恰有 2 个正确选项,多选、少选、错选均不得分;填空题每空 2 分。请在规定时间内独立完成。
姓名
    ____________
班级
    ____________
学号
    ____________
某电商系统把用户管理、商品管理、订单管理、物流管理等所有模块打成同一个 war 包,部署在一台 Tomcat 上。该架构属于
微服务架构
SOA 架构
单体应用架构
垂直应用架构
由单体应用演进到垂直应用架构,最主要的动因是
解决“服务调用混乱”问题
解决“一损俱损”问题,让不同业务的应用可以各自独立扩容
解决“重复造轮子”问题
实现彻底的去中心化
在基于 SSM 的分层架构中,负责“执行 SQL、操作数据库”的是
Service(Spring)
Controller(SpringMVC)
Mapper(MyBatis)
View(Thymeleaf)
对“没有最好的架构,只有最合适的架构”这句话,理解最准确的是
架构选型应优先选择最新、最复杂的架构
架构选型要结合业务规模、团队能力与运维成本,不必盲目追求微服务
单体架构已经被完全淘汰,不应再使用
架构一旦确定就永远不应该调整
Maven 中唯一确定一个依赖所使用的“三个坐标”是
groupId、artifactId、scope
name、artifactId、scope
groupId、artifactId、version
groupId、package、version
在 pom.xml 中把某个依赖的 scope 配置为 test,意味着
该依赖由 JDK 自带提供
该依赖只在测试编译和测试运行时可用,不会被打进最终产物
该依赖只在编译主代码时可用
该依赖要到运行时才加载
Maven 加载 jar 包的正确顺序是
只从本地仓库加载,本地没有就直接报错
直接连中央仓库下载,然后使用
先查本地仓库,本地没有再去远程/中央仓库下载,下载后存入本地仓库再使用
先查远程仓库,再查本地仓库
执行 mvn package 之后,生成的 jar/war 默认位于
target 目录
src/main/java
~/.m2/repository
src/main/resources
“约定优于配置”这一核心思想在 Maven 中最直接的体现是
不同 IDE 生成的项目目录结构可以完全不一样
每个项目都必须手写一套构建脚本
只要按 src/main/java、src/main/resources 等标准结构放置文件,Maven 就能自动识别,无需额外配置
必须在 pom.xml 中显式声明每一个源码目录
IoC(控制反转)与 DI(依赖注入)的关系是
两者完全无关
DI 是指导思想,IoC 是实现方式
IoC 是指导思想,DI 是它的具体实现方式
两者都指的是用 new 创建对象
课程“五步进化”中的第 3 步“反射 + 配置文件”被称为 IoC 雏形,原因是
因为它使用了工厂模式
因为它已经用上了 Spring 容器
把要创建的类名写进配置文件,用反射动态创建对象,改配置即可换实现,Java 代码一行不改
因为它在代码里使用了注解
XML 装配 Bean 时, 中的 ref 表示
注入容器中 id 为 userDao 的 Bean 引用
声明该 Bean 的作用域
注入一个字符串常量
注入一个基本类型数值
容器中存在两个 IUserDao 类型的 Bean 时,下列做法不能解决注入歧义的是
在其中一个实现类上加 @Primary
在注入处加 @Qualifier(oracleUserDao) 点名
给两个实现类都加上 @Primary
删除多余的实现类,或在注入处改用 @Qualifier 精确指定
@ComponentScan("com.demo.step5") 的作用是
扫描数据库中的数据表
扫描项目中的静态资源
扫描 resources 下的 XML 文件
扫描指定包及其子包下带组件注解的类,把它们注册为 Bean
关于 @Repository、@Service、@Controller 三个注解,下列说法正确的是
三者彼此独立、互不相关
它们本质上都是 @Component 的派生注解,只是语义上分别标注数据访问层、业务层、控制层
@Repository 只能标注在接口上
只有 @Service 标注的类才会被扫描
MyBatis 属于
项目构建工具
缓存中间件
Web 表现层框架
ORM(对象关系映射)持久层框架
注解方式整合 MyBatis 时,用于标识 Mapper 接口的注解是
@Component
@MapperScan
@Repository
@Mapper
在 Mapper 接口中执行 insert 语句应使用的注解是
@Delete
@Insert
@Update
@Select
XML 映射文件中 的 namespace 属性的作用是
指定要连接的数据库名
指定 SQL 语句的返回类型
仅用于注释说明,不影响运行
区分不同的 mapper(全局唯一),并绑定 DAO 接口,使接口无需编写实现类
配置 时,column 与 property 分别对应
数据库字段、实体类属性
查询别名、主键名
实体类属性、数据库字段
数据库表名、实体类名
Spring Boot 中用于指定 Mapper XML 文件位置的配置项是
spring.datasource.url
mybatis.configuration.log-impl
mybatis.mapper-locations
mybatis.type-aliases-package
标签的核心作用是
无条件地加上 where 关键字
只有内部条件成立时才添加 where,并自动去掉第一个多余的 and 或 or
去掉更新语句末尾多余的逗号
循环拼接 in 条件
动态更新时使用 标签,主要解决的是
SQL 注入问题
结果集字段与属性不一致问题
更新字段末尾多余的逗号
结果集分页问题
采用前后端分离后,后端接口通常返回
XML 配置文件
拼装好的 HTML 页面
JSP 模板文件
结构化的 JSON 数据
@RestController 注解等价于
@Component + @RequestBody
@Controller + @ResponseBody
@Controller + @RequestMapping
@Service + @ResponseBody
要从请求路径 /api/students/1 中取出数字 1,应使用的注解是
@PathVariable
@RequestParam
@RequestBody
@ResponseBody
把请求体中的 JSON 自动转换成 Java 对象,应使用的注解是
@PathVariable
@RequestParam
@RequestBody
@ResponseBody
类上标注 @RequestMapping("/api")、方法上标注 @GetMapping("/students"),实际访问路径是
/api/students
/api
/students
/api/students/students
方法返回一个 Java 对象、浏览器却看到 JSON,这一转换主要由谁完成
Maven
MyBatis
Jackson
Tomcat
要开启基于注解的缓存支持,需要在启动类上添加的注解是
@Cacheable
@EnableCaching
@EnableRedis
@MapperScan
自定义注解 @OpLog 必须同时具备的两个元注解是
@Documented 与 @Inherited
@Component 与 @Aspect
@Target(ElementType.TYPE) 与 @Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD) 与 @Retention(RetentionPolicy.RUNTIME)
切点表达式里的包名写错一个字母,运行时的表现是
不报错,但切面不生效,日志就是不出现
编译无法通过
启动时直接报错
业务方法不会执行
切点表达式 execution(* com.demo.service..*(..)) 中的“..”表示
任意方法名
该包及其所有子包(任意层级)
任意返回值类型
任意一个参数
在 @Around 方法中漏写 pjp.proceed(),结果是
编译阶段直接报错
业务方法不会执行
切面不会生效
业务方法照常执行
环绕通知中真正让目标业务方法得以执行的是
pjp.proceed()
pjp.getSignature()
log.info()
pjp.getArgs()
声明一个类是切面,应使用的注解是
@Aspect
@Pointcut
@Around
@Component
日志、权限、事务这类逻辑被称为“横切关注点”,主要因为它们
只在一个方法内部使用
与核心业务无关,却横着切过多个模块、每个方法都要重复处理
只能由架构师来编写
都属于数据库访问操作
配置 spring.cache.type=simple 时,缓存的底层实现是
JVM 内存中的 Map,应用重启即丢失
Redis 服务器
MySQL 中的一张缓存表
磁盘上的临时文件
更新数据库后还需要同步更新缓存,应使用的注解是
@CacheConfig
@CachePut
@CacheEvict
@Cacheable
@Cacheable 的执行逻辑是
先查缓存,命中则直接返回,未命中才执行方法并把结果放入缓存
只执行方法,不操作缓存
先执行方法,再把结果放入缓存
先删除缓存,再执行方法
要让切面只处理“贴了 @OpLog 标签”的方法、不打扰其他方法,切点应写成
@Pointcut(myPointCut())
@annotation(opLog)
execution(* com.demo.service..*(..))
within(com.demo.service.*)
转账案例中“A 账户扣款成功、B 账户未到账、1000 元凭空消失”,直接原因是
Mapper 接口的方法名写错
该方法没有事务,第一条 SQL 执行完就已提交,第二条尚未执行就抛出了异常
数据库服务器宕机
Redis 缓存未命中
校验某个字段“不能为空”,应使用的注解是
@NotNull
@Pattern
@Size
@Min
Thymeleaf 中用于整体替换当前节点、引用公共片段的属性是
th:each
th:text
th:if
th:replace
对多个 Controller 统一做全局异常处理,应使用的注解是
@RestController
@RequestMapping
@ControllerAdvice
@InitBinder
关于单体应用架构,下列说法正确的有
开发、部署、测试相对简单快速
天然支持按模块独立扩容
一个 Bug 可能导致全线崩溃
完全无法进行任何功能拆分
关于微服务架构,下列说法正确的有
不需要 DevOps 与容器化技术支撑
服务拆得更小、更独立,可独立开发、部署、扩容、选型
通过中心化的 ESB 总线对所有服务统一调度
每个服务可以有自己的数据库,但运维复杂度显著提高
关于 Maven 仓库,下列说法正确的有
中央仓库在国内访问很快,因此无需更换为国内镜像
每次构建都必须联网重新下载全部依赖
本地仓库默认位于 ~/.m2/repository
本地仓库的位置可在 settings.xml 的 localRepository 中修改
关于 MyBatis 的注解方式与 XML 方式,下列说法正确的有
注解方式适合简单的单表 CRUD,代码简洁直观
XML 方式更适合复杂多表关联查询与动态 SQL
XML 方式不需要写 namespace
两者不能在同一项目中混用
关于 @RequestBody 与 @ResponseBody,下列说法正确的有
@RequestBody 用于把 Java 对象转成 JSON 返回给前端
@RequestBody 把请求体中的 JSON 转成 Java 对象
@ResponseBody 把返回的 Java 对象转成 JSON 写入响应体
@ResponseBody 用于从 URL 路径中取出变量
关于 JSON,下列说法正确的有
JSON 只能被 Java 语言解析
是一段纯文本,用 {} 表示对象、用 [] 表示数组
JSON 的键必须与 Java 属性名毫无关系
键和字符串值都必须使用双引号
下列属于 AOP 典型应用场景的有
统一记录日志与统计方法耗时
库存扣减的业务规则本身
订单金额的计算规则本身
统一做权限校验、事务管理
下列做法属于分层设计反模式的有
用 MapStruct 自动完成 DTO 与 Entity 的转换
Controller 直接返回 Entity,导致密码、身份证号等敏感字段暴露
在 DAO 层编写业务逻辑
Controller 只负责接收请求和返回响应
下列属于 Bean Validation 校验注解的有
@Transactional
@NotNull
@Autowired
@Size

57题 | 被引用0次

模板修改
使用此模板创建