WEB考试复习资料

单选题(10题,共10分)

  1. 下列关于从 ORM → MVC → RPC → SOA 的演变,哪项说法是正确的?
    A. ORM 完全不支持面向对象编程
    B. MVC 模式只适用于前端,不适用于后端或接口层
    C. RPC(远程过程调用)适合微服务之间的调用和扩展
    D. SOA 与微服务完全相同,没有区别
    答案:C

  2. 以下哪一项是 SOA 框架的主要优势之一?
    A. 强化单体架构的集中式管理
    B. 降低对服务抽象与复用的要求
    C. 系统间实现松耦合,易扩展与维护
    D. 完全屏蔽了业务层的复杂性
    答案:C

  3. 在 SOA 架构中,为了实现松耦合,通常会采用的方式是:
    A. 所有服务都共享同一个数据库表
    B. 通过服务注册与发现,让服务调用可动态绑定
    C. 不使用任何接口或协议,直接内存调用
    D. 在不同服务间尽量少定义契约
    答案:B

  4. 关于 Restful API 的特点,下列哪项说法最准确?
    A. Restful API 依赖于 SOAP 协议实现
    B. Restful API 强调使用 HTTP 动词来描述操作意图
    C. Restful API 中不允许使用 POST 以外的请求方法
    D. Restful API 只能在微服务架构中使用
    答案:B

  5. Restful API 中通常使用的五个 HTTP 动词(GET、POST、PUT、PATCH、DELETE)分别对应的操作是:
    A. 注册、登录、删除、更新、查看
    B. 可读、可写、可执行、可修改、可删除
    C. 查询、创建、整体更新、局部更新、删除
    D. 查询、删除、整体更新、局部更新、新增
    答案:C

  6. 关于 PUT 与 PATCH 的共同点,下列哪一项正确?
    A. PUT 与 PATCH 都是“新增”操作
    B. PUT 与 PATCH 都可以用于局部更新
    C. PUT 与 PATCH 都是用来更新资源
    D. PUT 与 PATCH 都要求幂等
    答案:C

  7. 关于 POST 与 PUT 的区别,下列说法正确的是:
    A. PUT 一般用于部分更新,POST 一般用于全部更新
    B. PUT 一般用于创建或整体更新,POST 一般用于新增资源
    C. 两者都不可以用来新增
    D. POST 必须幂等,PUT 不需要幂等
    答案:B

  8. HTTP 状态返回码中,2xx、4xx、5xx 分别表示:
    A. 2xx 服务器错误;4xx 客户端成功;5xx 网络重定向
    B. 2xx 成功;4xx 客户端错误;5xx 服务器错误
    C. 2xx 重定向;4xx 成功;5xx 客户端错误
    D. 2xx 正在处理;4xx 重定向;5xx 不明错误
    答案:B

  9. @SpringBootApplication 最常见的作用是:
    A. 声明一个数据库实体类
    B. 让 Spring Boot 启动类能自动扫描并加载所有配置
    C. 将控制器暴露为 REST 接口
    D. 指定应用程序的配置文件位置
    答案:B

  10. @Configuration 注解表示该类是:
    A. Java 配置类,可以替代 XML 配置
    B. 数据库表对应的实体类
    C. Spring Boot 的主启动类
    D. 标记为 AOP 切面
    答案:A

  11. @EnableAutoConfiguration 注解的作用是:
    A. 开启自动切面配置
    B. 开启自动装配 Bean,对项目进行自动化配置
    C. 开启 Spring Security
    D. 开启服务注册功能
    答案:B

  12. @ComponentScan 主要用于:
    A. 开启扫描数据库实体
    B. 定义 Beans 的生命周期
    C. 指定要扫描的包,以发现 @Component、@Service 等
    D. 替代 @SpringBootApplication
    答案:C

  13. @Bean 的最主要作用是:
    A. 声明一个切点表达式
    B. 声明一个只读的属性文件
    C. 向 Spring 容器注册一个 Bean
    D. 声明一个数据库事务
    答案:C

  14. @RestController 注解可以:
    A. 将该类识别为数据库访问层
    B. 将返回值直接作为 JSON 或 XML 等格式输出
    C. 将该类限制只能处理 POST 请求
    D. 将该类视为 WebSocket 端点
    答案:B

  15. @RequestMapping 及其变体主要用于:
    A. 给控制层指定访问路径和 HTTP 方法
    B. 给实体类指定表名映射
    C. 给数据库字段指定映射关系
    D. 给服务之间的调用指定负载均衡策略
    答案:A

  16. @PathVariable 注解用来:
    A. 获取 URL 查询参数
    B. 获取请求体中的 JSON 数据
    C. 获取 URL 中路径变量,例如 /user/{id}
    D. 设置默认值给参数
    答案:C

  17. @RequestBody 注解用来:
    A. 直接映射请求体内容到方法参数
    B. 映射 HTTP 头部信息到参数
    C. 声明该方法只使用 POST 请求
    D. 将返回结果以 JSON 格式输出
    答案:A

  18. @RequestParam 注解的作用是:
    A. 提供数据库事务支持
    B. 获取请求路径中的一段信息
    C. 获取 URL 中的查询参数或表单参数
    D. 实现跨域请求
    答案:C

  19. 在 Spring MVC 中,@Valid + BindingResult 通常用于:
    A. 声明日志级别
    B. 校验请求参数的合法性并接收验证结果
    C. 切换数据源
    D. 加载外部配置文件
    答案:B

  20. @Component 注解会将类注册到:
    A. JDBC 连接池
    B. Tomcat 容器
    C. Spring 容器
    D. 代码自动生成器
    答案:C

  21. 关于控制反转(IoC)与依赖注入(DI)的作用,下列哪项最准确?
    A. IoC 与 DI 完全不相关,无法一起使用
    B. IoC 是让容器控制对象的创建,DI 则是将依赖注入给对象
    C. IoC 只适合小型项目,DI 只适合大型项目
    D. 两者都只用于数据库层
    答案:B

  22. @Autowired 与 @Resource 的区别,以下说法正确的是:
    A. @Autowired 依赖 JSR-250,@Resource 依赖 Spring 自身
    B. @Resource 可以精确指定 beanName,@Autowired 更倾向于按类型注入
    C. 二者不能共存,必须二选一
    D. @Autowired 只适用于 Java 8 以上,@Resource 无此限制
    答案:B

  23. 当存在多个同类型 Bean 时,为避免注入冲突,下列哪个注解可用来指定首选 Bean?
    A. @Primary
    B. @Override
    C. @Bean
    D. @Order
    答案:A

  24. 以下哪个注解不是 Spring AOP 中的通知类型?
    A. @Before
    B. @AfterReturning
    C. @AfterThrowing
    D. @AroundSuccess
    答案:D

  25. 关于切点表达式,下列哪一项说法正确?
    A. 切点表达式可以随意定义,不需要符合任何语法
    B. 切点表达式通常使用 execution(* com.example.service..(..)) 这类形式来指定连接点
    C. @Pointcut 中不允许使用通配符
    D. 切点表达式只能匹配接口,不能匹配实现类
    答案:B

  26. 使用 AOP 的一个主要好处是:
    A. 可以彻底替代 MVC 模式
    B. 直接由容器管理数据库连接池
    C. 实现横切关注点的分离,如日志、事务等,减少重复代码
    D. 完全取消了依赖注入
    答案:C

  27. 数据库连接池的主要作用是:
    A. 减少频繁创建和销毁数据库连接带来的开销
    B. 提供自动的 SQL 语句优化
    C. 在内存中缓存所有查询结果
    D. 强制每次请求都重建连接
    答案:A

  28. 下列哪一项不是常见的数据库访问方式?
    A. JDBC
    B. JPA/Hibernate
    C. MyBatis
    D. UML
    答案:D

  29. 数据库的四大特性(ACID)中,“I” 代表:
    A. Inactive
    B. Isolation
    C. Indexing
    D. Integration
    答案:B

  30. Spring 中使用 @Transactional(声明式事务)的主要目的是:
    A. 配置定时任务
    B. 自动生成数据库索引
    C. 自动对某些方法或类启用事务回滚、提交等逻辑
    D. 声明一个静态资源文件
    答案:C

  31. Spring Boot 默认推荐的配置文件类型是:
    A. YAML 或 properties
    B. XML 或 JSON
    C. TXT 或 PDF
    D. INI 或 CSV
    答案:A

  32. 要修改 Spring Boot 项目默认的启动端口,下列哪一项是正确做法?
    A. 在 pom.xml 中增加 8089
    B. 在 application.properties 中配置 server.port=8089
    C. 修改 Tomcat 源码
    D. 在 @SpringBootApplication 注解里配置 port=8089
    答案:B

  33. 要在 Spring Boot 中提取配置文件的值并绑定到对象,下列哪种方式可行?
    A. @PropertySource(“classpath:xxx”)
    B. @ConfigurationProperties(prefix=”xxx”)
    C. @Value(“${xxx}”)
    D. 以上三种都可以
    答案:D

  34. 在 Spring Security 中,如果没有自定义用户名和密码配置,默认的用户名是:
    A. user
    B. admin
    C. test
    D. root
    答案:A

  35. 引入 Spring Security 后,访问 API 时的正确说法是:
    A. 无论访问哪个接口,都无需登录
    B. Spring Security 会自动创建登录表单或弹框,并拦截未授权请求
    C. 只能通过命令行方式访问
    D. 所有请求必须使用 HTTPS 并且只能是 GET
    答案:B

  36. 关于微服务架构的定义,下列哪项是正确的?
    A. 微服务只适合单体项目
    B. 微服务强调将整个系统打包成一个可执行文件
    C. 微服务将应用拆分成小而独立的服务,服务之间通过 API 通信
    D. 微服务要求每个服务都必须使用相同的技术栈
    答案:C

  37. 下列哪一项不是微服务架构的特点?
    A. 每个服务可以独立部署和扩展
    B. 大部分场景下,服务之间只通过消息或 HTTP/RPC 调用
    C. 服务与服务间高度耦合,必须共同部署
    D. 服务之间采用去中心化的治理方式
    答案:C

  38. 在 Eureka 中,下列关于角色分工的描述正确的是:
    A. Eureka-Server 既是注册中心,也是服务提供方
    B. Eureka-Client 只能用来消费服务,不能注册自身
    C. Eureka-Server 仅用作注册中心,Eureka-Client 可以注册自身并相互消费
    D. Eureka 只适用于非微服务架构
    答案:C

  39. Eureka-Server 的主要作用是什么?
    A. 提供数据库连接池支持
    B. 提供配置文件管理
    C. 作为注册中心,管理各个微服务的注册与发现
    D. 实现横切关注点的统一处理
    答案:C

  40. 当同时存在服务提供者与服务消费者时,下列关于 Eureka-Client 的描述正确的是:
    A. 只有服务消费者会注册到 Eureka-Server,服务提供者不会
    B. 只有服务提供者会注册到 Eureka-Server,服务消费者不会
    C. 两者都可以以 Eureka-Client 身份注册到 Eureka-Server,区分靠配置和服务名
    D. 二者都无法进行自我保护机制
    答案:C

  41. 搭建 Eureka-Server 时,通常需要在 application.properties 或 yml 中指定:
    A. server.port
    B. eureka.client.register-with-eureka=false
    C. eureka.client.fetch-registry=false
    D. 以上三项都需要
    答案:D

  42. 下面哪项不是常见的负载均衡实现方式?
    A. 随机(Random)
    B. 轮询(RoundRobin)
    C. 最少连接(LeastConnection)
    D. 固定节点(FixedNode)
    答案:D

  43. Spring Cloud LoadBalancer(或 Ribbon)中,如果要自定义负载均衡策略,需要:
    A. 实现 ReactiveLoadBalancer 接口或自定义 Rule
    B. 修改 Nginx 配置文件
    C. 使用 @Service 来标注需要负载均衡的类
    D. 必须使用内置的轮询策略,不能自定义
    答案:A

  44. 若要开启 RestTemplate 的负载均衡支持,需要:
    A. 在 RestTemplate 上使用 @LoadBalanced 注解
    B. 修改 Eureka 配置
    C. 使用 @ControllerAdvice
    D. 在服务之间使用 TCP 直连
    答案:A

  45. 在 Spring 中,RestTemplate 最常用于:
    A. 生成随机字符串
    B. 实现不同微服务之间的 HTTP 调用
    C. 数据库底层的查询
    D. 安全框架的加密操作
    答案:B

  46. 使用 RestTemplate 调用微服务时,通常通过什么方式来指定目标服务?
    A. 直接通过 IP 和端口号访问
    B. 通过服务名(结合负载均衡)或注册中心发现
    C. 修改 Windows hosts 文件
    D. 必须使用 @SpringBootApplication
    答案:B

填空题(每空1分,共10分)

  1. 框架演变历史依次为:从 __ → __ → __ → __。

    (答案:ORM、MVC、RPC、SOA)

  2. SOA 框架的三种典型操作是 __ + __ + __。

    (答案:服务注册、服务发现、服务调用)

  3. Restful API 的五个 HTTP 动词分别对应以下操作:

    • GET:__ 数据。
    • POST:__ 数据。
    • PUT:__ 数据。
    • DELETE:__ 数据。
    • PATCH:__ 数据。

    (答案:读取、创建、更新(整体替换)、删除、部分更新)

  4. HTTP 状态返回码中:

    • 2xx 表示 __;
    • 4xx 表示 __;
    • 5xx 表示 __。

    (答案:成功、客户端错误、服务器错误)

  5. Spring Boot 中注解 @SpringBootApplication 的作用是 __。

    (答案:标记主程序类,启动 Spring Boot 应用,包含 @Configuration、@EnableAutoConfiguration、@ComponentScan)

  6. 在依赖注入中,@Autowired 和 @Resource 的区别是 __。

    (答案:@Autowired 是 Spring 注解,默认按类型注入;@Resource 是 Java 注解,默认按名称注入)

  7. AOP 中的五种通知类型分别是:______、______、______、______和 ______。

    (答案:@Before、@AfterReturning、@AfterThrowing、@After、@Around)

  8. 数据库的四大特性(ACID)分别是:______、______、______和 ______。

    (答案:原子性、一致性、隔离性、持久性)

  9. Spring Security 框架中,默认用户名是 ______,默认密码存储在 ______ 日志中。

    (答案:user、启动日志)

  10. 在 Eureka 架构中,Eureka-Server 的作用是 ______,Eureka-Client 的作用是 ______。

(答案:注册中心、服务提供者和消费者)

简述题(4题,共20分)

1.SOA 中的三角色及其对应的功能

  1. 服务提供者 :提供具体的服务并将其注册到服务注册中心。
  2. 服务请求者 :调用服务注册中心获取服务并消费它。
  3. 服务注册中心 :管理服务的注册和发现。

2.Restful Web API 的特点(★)

  1. 基于 HTTP 协议,使用标准的 HTTP 方法(GET、POST、PUT、DELETE)。
  2. 资源使用 URL 定位,并采用 JSON 或 XML 格式作为数据交换格式。
  3. 无状态性,每次请求都需包含完成该请求所需的所有信息。

3.POST 请求和 PUT 请求的共同点及区别(★)

  1. 共同点:都可以用于传递数据,通常发送请求体。
  2. 区别:POST 用于创建资源,PUT 用于更新资源,且 PUT 是幂等的,POST 不是。

4.PUT 请求和 PATCH 请求的共同点及区别(★)

  1. 共同点:都用于更新资源。
  2. 区别:PUT 用于完整更新,PATCH 只更新资源的部分字段。

5.Spring Boot 框架的优点(★)

  1. 提供快速开发环境,减少配置。
  2. 内置 Tomcat,无需额外部署。
  3. 支持自动配置和生产级监控。
  4. 提供大量开箱即用的 starter 依赖。

6.@Autowired 和 @Resource 的共同点及区别(★)

  1. 共同点:都用于注入依赖。
  2. 区别:@Autowired 是 Spring 提供的,按类型注入;@Resource 是 JSR 标准,按名称注入。

7.简述使用 AOP 的好处

  1. 实现横切关注点(如日志、权限、事务)的分离。
  2. 提高代码可维护性和复用性。
  3. 减少重复代码。

8.简述引入 Spring Security 框架后,访问 API 接口的过程

  1. 用户发起请求。
  2. 通过 Spring Security 过滤器链处理请求,完成身份验证和授权。
  3. 如果验证成功,访问目标 API;否则返回 401 或 403 错误。

9.以下 Eureka 架构图有什么缺点?应如何修改架构图?新架构图的优点

  1. 缺点:Eureka Server 间互相注册,单点故障可能导致整个注册服务不可用。
  2. 改进方案:采用多节点 Eureka Server 构建集群,Client 负载均衡访问多个 Server。
  3. 新架构图优点:提高了系统的容错性和高可用性。

10.简述 Eureka Server 的作用

  1. 提供服务注册和发现功能,管理各服务实例的信息。

11.简述 Eureka Client 的作用

  1. 注册自身服务到 Eureka Server,或者从 Server 获取其他服务的实例信息。

12.请列举五种负载均衡实现方式(★)

  1. 轮询:请求依次分配到各实例。
  2. 随机:随机选择实例处理请求。
  3. 最小连接数:优先选择当前连接数最少的实例。
  4. IP 哈希:根据客户端 IP 进行哈希分配。
  5. 权重:根据实例的权重比例分配请求。

代码题(共36分)

1、Restful Web API 开发 ——restful-demo-000项目

@RestController
@RequestMapping(“/api/v1”)

public class StudentServiceController {

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Resource
private StudentService studentService;
// 查询
@GetMapping("/students")
public List<Student> query(@RequestParam int pageNo, @RequestParam int pageSize) {
return studentService.queryAllStudents(pageNo, pageSize);
}
// 新增
@PostMapping("/students")
public void add(@RequestBody Student student) {
studentService.addStudent(student);
}
// 修改
@PutMapping("/students/{sid}")
public void update(@PathVariable String sid, @RequestBody Student student) {
studentService.updateStudent(sid, student);
}
// 删除
@DeleteMapping("/students/{sid}")
public void deleteStudent(@PathVariable String sid) {
studentService.deleteStudent(sid);
}

}

2、配置文件的数据读取 ——springboot-demo-000项目

@Component

public class User {

1
2
3
4
5
6
7
8
9
10
@Value("${user.userId}")
private String userId;

@Value("${user.userName}")
private String userName;

@Value("${user.password}")
private String password;

//getset可以省略

}

3、切面类编程 ——springboot-demo-000项目

@Aspect
@Component

public class LoggingAspect {

1
2
3
4
5
6
7
8
9
10
11
12
@Pointcut("execution(* cn.edu.sju.ws.aopdemo.service.RentHouse.*(..))")
public void pointCut() {}

@Before("pointCut()")
public void beforeLog() {
System.out.println("---调用前日志---");
}

@After("pointCut()")
public void afterLog() {
System.out.println("---调用后日志---");
}

}

4、接口调用编程 ——helloconsumer项目

问题1:在接口调用中,需要定义ResponseBean即HTTP响应需要转换成的对象类型,此处使用Course类接收返回数据,请完成Course类代码的编写。

//不考虑有参无参

public class Course{

1
2
3
4
   private String couId;
private String couName;
private Integer num;
//getset可以省略

}

问题2:调用接口1,查询C001号课程的信息,请完成GET请求调用的代码。

void testGetAPI () {

1
2
3
4
RestTemplate restTemplate = new RestTemplate();
String url = "http://10.190.120.100:8080/api/v1/courses/{cid}";
Course result = restTemplate.getForObject(url, Course.class, "C001");
System.out.println("查询结果: " + result);

}

问题3:调用接口2,新增一个课程(课程号:C002、课程名:Web服务、选修学生数:50),完成POST请求的调用代码。

void testPostAPI () {

1
2
3
4
5
6
7
8
9
10
11
12
RestTemplate restTemplate = new RestTemplate();
String url = "http://10.190.120.100:8080/api/v1/courses";

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

Course param = new Course("C002", "Web服务", 50);

HttpEntity<Course> entity = new HttpEntity<>(param, headers);

String response = restTemplate.postForObject(url, entity, String.class);
System.out.println("新增课程结果: " + response);

}

问题4:调用接口3修改C002号课程的信息(课程名改为:微服务、选修学生数改为100),完成PUT请求的调用代码。

void testPutAPI () {

1
2
3
4
5
6
7
8
9
10
11
12
13
14
RestTemplate restTemplate = new RestTemplate();
String url = "http://10.190.120.100:8080/api/v1/courses/{cid}";

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

Course param = new Course();
param.setCouName("微服务");
param.setNum(100);

HttpEntity<Course> entity = new HttpEntity<>(param, headers);

restTemplate.put(url, entity, "C002");
System.out.println("课程修改成功,课程ID: C002");

}

问题5:调用接口4,删除C001号课程,完成 DELETE请求的调用代码。(此题要求路径参数通过Map格式传递)

void testDeleteAPI () {

1
2
3
4
5
6
7
8
RestTemplate restTemplate = new RestTemplate();
String url = "http://10.190.120.100:8080/api/v1/courses/{cid}";

Map<String, String> uriVariables = new HashMap<>();
uriVariables.put("cid", "C001");

restTemplate.delete(url, uriVariables);
System.out.println("课程删除成功,课程ID: C001");

}

采用负载均衡版答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@Configuration
public class RestTemplateConfig {

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

public class CourseServiceConsumer {
// 问题1:GET请求调用
public static class Course {
private String couId; // 课程号
private String couName; // 课程名
private Integer num; // 选修学生数
//getset可以省略
}

// 问题2:GET请求调用
public void testGetAPI(RestTemplate restTemplate) {
String url = "http://course-service/api/v1/courses/{cid}";
Course result = restTemplate.getForObject(url, Course.class, "C001");
System.out.println("查询结果: " + result);
}

// 问题3:POST请求调用
public void testPostAPI(RestTemplate restTemplate) {
String url = "http://course-service/api/v1/courses";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Course param = new Course("C002", "Web服务", 50);
HttpEntity<Course> entity = new HttpEntity<>(param, headers);
String response = restTemplate.postForObject(url, entity, String.class);
System.out.println("新增课程结果: " + response);
}

// 问题4:PUT请求调用
public void testPutAPI(RestTemplate restTemplate) {
String url = "http://course-service/api/v1/courses/{cid}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Course param = new Course();
param.setCouName("微服务");
param.setNum(100);
HttpEntity<Course> entity = new HttpEntity<>(param, headers);
restTemplate.put(url, entity, "C002");
System.out.println("课程修改成功,课程ID: C002");
}

// 问题5:DELETE请求调用
public void testDeleteAPI(RestTemplate restTemplate) {
String url = "http://course-service/api/v1/courses/{cid}";
Map<String, String> uriVariables = new HashMap<>();
uriVariables.put("cid", "C001");
restTemplate.delete(url, uriVariables);
System.out.println("课程删除成功,课程ID: C001");
}
}