ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

JavaEE期末高频失分点:MyBatis/Spring/Spring MVC运行时行为解析

JavaEE期末高频失分点:MyBatis/Spring/Spring MVC运行时行为解析

简介:本资源是面向高校JavaEE课程学习者与期末备考学生的MyBatis专项复习题库,聚焦ORM框架核心概念与实操要点,精准覆盖考试高频考点。题库以标准Word文档(.docx)形式呈现,共1个文件,大小仅41KB,轻量便携、即下即用,内容涵盖填空、判断、选择、简答四大题型,系统梳理MyBatis配置元素(如 )、SQL映射机制、mybatis-config.xml全局配置、resultMap映射规则、模糊查询安全实践(#{}/${}对比、concat()局限性)及完整工作原理(从SqlSessionFactory构建到MappedStatement执行封装)。所有题目均附标准答案与解析,便于自测巩固与错因溯源。目前已有2646人下载学习,是夯实JavaEE持久层基础、高效冲刺期末考试的精炼型备考资料。

1. JavaEE期末考什么?不是背API,是考你“哪里会翻车”

JavaEE期末考试,尤其是带 MyBatis + Spring + Spring MVC 的综合卷,从来不是考你能不能默写出@Autowired的拼写——而是考你在真实编码场景里,哪一步手抖就直接丢分。比如:填空题问“MyBatis 删除操作用哪个元素”,你以为答<delete>就稳了?错。真题里紧跟着一句“该元素必须配合什么操作才能生效”,答案是“事务提交”;而90%的学生在简答题里写全了8步工作原理,却漏掉第4步“SqlSession 必须手动 commit() 或 close()”,这一处扣2分,整道大题只剩一半分。再比如 Spring AOP 填空:“@After和@AfterReturning区别在哪?”——面试官不听概念复述,就听你能不能当场说出“前者无论异常都执行,后者只在方法正常返回时触发”。这份《JavaEE期末复习题库》不是知识点罗列,它是按阅卷人打分逻辑反向拆解的:每道题都标注了“踩坑点”“高频混淆项”“阅卷关键词”,覆盖 MyBatis(第1/2/3章)、Spring(第6/7/8章)、Spring MVC(第10/11章)三大模块,直击期末卷中占比超75%的核心考点。适合两类人:一类是临考前3天想精准抢分的,另一类是面试被连问3个@Transactional失效原因后开始怀疑人生的。

为什么这题总被扣分?因为考的是“运行时行为”,不是“配置语法”

很多同学把mybatis-config.xml背得滚瓜烂熟,结果判断题第2题“只需引入 lib 目录全部 JAR 包即可运行”就栽了——漏掉了数据库驱动包必须显式声明这个硬性前提。MyBatis 启动时根本不会报“找不到驱动”,而是抛出SQLException: No suitable driver found,这种错误在本地测试时容易被忽略,但期末机试环境一跑就挂。再看 Spring 第7章填空第4题:“prototype 作用域的 Bean 生命周期由谁管理?”标准答案是“客户端代码”,但学生常答“Spring 容器”或“JVM”,本质是混淆了singleton(容器全程托管)和prototype(容器只负责 new 出来,后续 GC、销毁全靠你手动)。这种错误不是记错了,是没理解 Spring 容器的职责边界。题库把这类“概念-行为”断层点全标红加粗,比如在 MyBatis 动态 SQL 章节,所有<set>和<where>的填空题旁都附了一行小字:“注意:<set>自动删逗号,但不会自动补 SET 关键字;<where>自动删 AND/OR,但不会自动补 WHERE”。

真题分值分布告诉你:哪些题必须拿下

根据近3年某高校 JavaEE 期末卷统计(非公开数据,仅作备考参考),题型分值权重如下:

  • 填空题(20分):集中考查基础元素名称、属性名、函数名,如<delete>、namespace、concat()、BEFORE/AFTER、@Pointcut。错1空扣1分,无容错。
  • 判断题(15分):专攻“八成对、两成坑”的模糊表述,如“<mappers>是根元素”(×,应为<mapper>)、“@Component标在方法上”(×,应标在类上)。每题1.5分,全卷唯一可能靠排除法蒙对的题型。
  • 选择题(30分):高频陷阱在“说法错误的是”,选项C/D常玩文字游戏,例如“<foreach>的collection属性值为 Map 的键”(√),但干扰项写成“Map 的 value”(×);又如 Spring AOP 中“@After相当于AfterReturningAdvice”(×),实际对应AfterAdvice。
  • 简答题(35分):MyBatis 工作原理(8分)、Spring 依赖注入方式(6分)、Spring MVC 执行流程(10分)是铁三角,合计占简答分值的近70%。阅卷规则明确:少1个关键步骤扣1分,顺序错扣0.5分,术语写错别字(如“SqlSession”写成“SQLSession”)扣0.5分。

提示:这份题库的答案页不是“标准答案集”,而是“阅卷人批注版”。比如 MyBatis 工作原理简答题,答案中第(5)步明确写“Executor 接口根据 SqlSession 参数动态生成 SQL”,而非笼统说“执行 SQL”——因为“动态生成”才是得分关键词,体现你懂 MyBatis 的 SQL 构建机制,不是只会背流程。

2. MyBatis 核心考点:从 XML 配置到动态 SQL 的 5 个致命细节

MyBatis 是 JavaEE 期末卷的“分水岭”——基础题全对只能拿及格,想冲90+必须吃透配置细节与运行时行为。本章覆盖第1、2、3章全部真题,按“元素功能→易错场景→真题演练”三层递进,重点解决“为什么我写的 XML 没报错但查不出数据”“为什么#{}和${}在模糊查询里一个安全一个危险”等实战问题。

2.1<mapper>元素的 namespace:不是随便起的 ID,而是调用入口的“身份证”

<mapper>的namespace属性绝非可有可无的装饰。它本质是 MyBatis 的方法寻址标识符,SqlSession.getMapper(UserMapper.class)中的UserMapper.class就是通过namespace="com.example.UserMapper"与 XML 文件绑定的。若填空题问“<mapper>元素包含什么属性指定唯一命名空间”,答namespace只拿一半分;完整答案必须强调“该属性值需与 Mapper 接口的全限定类名一致”。

真题还原(第1章填空第2题):

MyBatis 映射文件中<mapper>元素是配置文件的根元素,它包含一个【 】属性,该属性为这个<mapper>指定了唯一的命名空间。
标准答案:namespace
阅卷关键词:必须写英文原词,写“命名空间属性”不得分;若答“id”或“name”直接0分。

为什么重要?因为namespace错了,整个映射文件失效。某次期末机试中,有学生把namespace="userMapper"写成namespace="UserMapper"(大小写错误),导致所有selectById方法返回 null,而控制台无任何报错——MyBatis 默认静默失败,只在日志级别为 DEBUG 时打印 “Could not find statement in namespace”。

2.2<resultMap>:当数据库列名和 POJO 属性名不一致时,你的“翻译官”

当表字段为user_name而 Java 类属性为userName时,MyBatis 不会自动驼峰转换(除非开启mapUnderscoreToCamelCase)。此时必须用<resultMap>显式映射。填空题第2章第1题直击此点:

当数据表中的列和需要返回的对象的属性不完全一致,MyBatis 是不会自动赋值的。此时,就可以使用【 】元素进行处理。
答案:<resultMap>

但仅答出元素名不够。简答题要求你说明<resultMap>子元素作用:

  • <id>:标记主键列,用于一级缓存识别(如column="id"对应property="id")
  • <result>:映射普通列(如column="user_name"对应property="userName")
  • <association>/<collection>:处理一对一、一对多关联(第2章判断题第1题考此)

易错点在于<id>和<result>的property属性必须是 POJO 的getter/setter 方法名,不是字段名。例如 POJO 有private String userName;,则property必须写"userName"(对应getUserName()),写"userName"字段名本身是错的。

2.3 动态 SQL 的<set>和<where>:自动剔除冗余字符,但绝不帮你补全语法

动态 SQL 是 MyBatis 最易翻车的模块。填空题第3章第3题:“如果<set>元素内包含的内容都为空,则会出现【 】”,答案是“SQL 语法错误”。为什么?看这段典型错误代码:

<update id="updateUser"> UPDATE user <set> <if test="userName != null">user_name = #{userName},</if> <if test="email != null">email = #{email},</if> </set> WHERE id = #{id} </update>

当userName和email全为 null 时,<set>标签内无内容,最终 SQL 变成UPDATE user WHERE id = ?—— 缺少 SET 子句,数据库直接报错。正确写法必须保证<set>内至少有一个有效字段,或改用<trim>:

<trim prefix="SET" suffixOverrides=","> <if test="userName != null">user_name = #{userName},</if> <if test="email != null">email = #{email},</if> </trim>

同理,<where>会自动剔除开头的AND/OR,但不会自动补WHERE。若所有<if>条件都不成立,<where>标签内为空,整个 SQL 就变成SELECT * FROM user(无 WHERE),这虽不报错但逻辑错误。

2.4<foreach>的 collection 属性:Map 的键不是值,数组不用封装

<foreach>用于IN查询等场景,其collection属性极易填错。填空题第3章第2题:“如果传入参数是多个,需封装成 Map,collection属性值为 Map 的【 】”,答案是“键”。

为什么?因为 MyBatis 通过collection="userIds"去 Map 中找 key 为"userIds"的 value(即 List 或数组)。若误填为collection="userIdsList"(value 名),则报BindingException: Parameter 'userIdsList' not found。

真题验证(第3章选择题第2题):

<foreach>的collection属性配置的是传递过来的参数类型,它可以是一个 array、list(或 collection)、Map 集合的键、POJO 包装类中数组或集合类型的属性名等。
正确选项 C:collection配置的是 Map 的键,不是值。

实操代码示例:

// Controller 传参 Map<String, Object> params = new HashMap<>(); params.put("userIds", Arrays.asList(1L, 2L, 3L)); // key 是 "userIds" sqlSession.selectList("UserMapper.selectByIds", params);
<!-- Mapper.xml --> <select id="selectByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach collection="userIds" item="id" open="(" separator="," close=")"> #{id} </foreach> </select>

2.5 模糊查询的生死线:#{}vs${}与concat()的三重陷阱

这是期末卷必考的“玄学题”。填空题第1章第3题:“使用 MySQL 中的【 】函数进行字符串拼接,可以有效防止模糊查询时可能出现的 SQL 注入问题”,答案是concat()——但这是个陷阱!

标准答案写concat()没错,但题干中“可以有效防止”是误导。concat()本身不能防注入,它只是 MySQL 函数。真正防注入的是#{}占位符。concat()的作用是:当必须用${}拼接表名/列名时,用concat('%', #{keyword}, '%')把用户输入包裹在函数内,避免直接拼接。

真题对比(第1章选择题第3题):

关于 MyBatis 模糊查询中进行 SQL 字符串拼接时,说法错误的是( )
C: 使用 MySQL 中的concat()函数进行字符串拼接,也无法防止 SQL 注入。
答案:C 是错误说法(即题目选 C)
解析:concat()本身不防注入,但结合#{}使用可防注入;若用${}拼接concat(),依然会注入。

安全写法(推荐):

<!-- ✅ 安全:#{} 预编译,数据库自动转义 --> <select id="searchUser" resultType="User"> SELECT * FROM user WHERE user_name LIKE CONCAT('%', #{keyword}, '%') </select>

危险写法(禁止):

<!-- ❌ 危险:${} 直接拼接,keyword='admin' OR '1'='1' 就完蛋 --> <select id="searchUser" resultType="User"> SELECT * FROM user WHERE user_name LIKE CONCAT('%', '${keyword}', '%') </select>

注意:concat()导致数据库移植性差(Oracle 用||,PostgreSQL 用||或CONCAT()),所以生产环境更推荐#{keyword}+ Java 层拼接%,或 MyBatis 3.4+ 的bind标签。

3. Spring 核心机制:Bean 生命周期、依赖注入与作用域的 4 个认知盲区

Spring 是 JavaEE 的“骨架”,但学生常把@Autowired当万能胶水,却不知它背后是完整的生命周期管理。本章聚焦第6、7章真题,用“容器视角”拆解 Bean 创建、装配、销毁全过程,专治“为什么加了@Service还是空指针”“为什么prototypeBean 修改属性后其他地方没变”等高频困惑。

3.1 依赖注入的本质:不是赋值,是容器接管对象关系

填空题第6章第1题:“依赖注入的作用就是在使用 Spring 框架创建对象时,动态的将其所依赖的对象注入到【 】组件中”,答案是Bean。但必须理解:这里的“Bean”特指由 Spring 容器管理的实例,不是任意 Java 对象。

判断题第6章第4题:“依赖注入的作用就是在使用 Spring 框架创建对象时,动态的将其所依赖的对象注入到 Bean 组件中”,答案为“对”。但学生易错在混淆“注入目标”——注入的是 Bean 的属性或构造参数,不是 Bean 本身。例如:

@Service public class UserService { @Autowired private UserMapper userMapper; // 注入目标是 userMapper 属性,不是 UserService 实例 }

若UserMapper未被 Spring 管理(如没加@Mapper或未扫描包),则userMapper为 null,此时UserService仍是 Bean,只是依赖未注入成功。

3.2@Component及衍生注解:不是标签,是“容器注册指令”

@Controller、@Service、@Repository都是@Component的特化,但它们的语义和默认行为不同。填空题第7章第2题:“@Controller通常作用在控制层,如 Spring MVC 的【 】”,答案是Controller(类)。但关键在“作用”:

  • @Controller:标记为 Web 层 Bean,并启用 Spring MVC 的请求映射(如@RequestMapping)
  • @Service:标记为业务层 Bean,默认开启事务代理(若配置了@EnableTransactionManagement)
  • @Repository:标记为 DAO 层 Bean,自动将数据库异常转为 Spring 的DataAccessException

真题验证(第7章选择题第4题):

@Autowired默认按照 Bean 的名称进行装配,但@Repository的作用不仅是标识 Bean,更是异常转换器。选项 A 说“默认按照 Bean 的名称进行装配”是错的(实际是按类型,名称是 fallback),故选 A。

提示:@Repository的异常转换需配合PersistenceExceptionTranslationPostProcessor,否则无效。这是期末卷“隐藏考点”。

3.3singleton与prototype:不是单例模式,是容器实例化策略

这是最常被误解的概念。填空题第7章第4题:“对于【 】作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 实例后,Bean 的实例就交给客户端代码来管理”,答案是prototype。

但学生常答错,因为混淆了设计模式单例(Singleton Pattern)和 Spring 作用域(Scope)。singleton作用域表示:Spring 容器中只存在一个共享实例,所有getBean()调用返回同一对象;prototype表示:每次getBean()都新建一个实例,容器不跟踪其生命周期。

判断题第7章第3题:“每次客户端请求 singleton 作用域的 Bean 时,Spring 容器都会创建一个新的实例”,答案为“错”。
判断题第7章第4题:“Spring 中使用 prototype 定义的 Bean 在 Spring 容器中将只有一个实例”,答案为“错”。

关键区别:

特性singletonprototype
容器中实例数1 个(全局共享)0 个(容器不保存实例)
getBean()行为返回同一实例每次新建实例
生命周期管理容器负责创建、初始化、销毁容器只负责创建,销毁由客户端负责

3.4 自动装配(Autowire):不是智能匹配,是严格规则下的“机械匹配”

autowire属性在 XML 配置中常见,但学生常以为byType会“智能选最合适的 Bean”。实际上,byType规则是:容器中必须有且仅有一个匹配类型的 Bean,否则报NoUniqueBeanDefinitionException。

填空题第7章第1题:“所谓自动装配,就是将一个 Bean 自动的注入到到其他 Bean 的【 】中”,答案是Property(属性)。但autowire="byType"只能注入属性,不能注入构造参数(构造注入需显式配置<constructor-arg>)。

选择题第7章第1题:“autowire属性取值不包括以下”,选项 DbyId是干扰项(Spring 无此值),正确答案 D。

真题陷阱(第7章判断题第1题):

@Component注解只需标注在相应方法上即可。
答案:错
原因:@Component必须标注在类上,标注在方法上无效(那是@Bean的用法)。

3.5 Bean 的装配方式:XML 与注解不是并列,而是演进关系

第7章简答题要求列举<bean>常用属性,答案包括id、name、class、scope。但学生易漏init-method和destroy-method—— 这是 Bean 生命周期钩子的关键。

init-method:在 Bean 属性设置完成后、被使用前调用(如数据库连接池初始化)
destroy-method:在容器关闭时调用(如连接池关闭)

填空题第6章第4题:“BeanFactory 主要负责初始化各种 Bean,并调用它们的【 】方法”,答案是生命周期(或init/destroy)。

注意:@PostConstruct和@PreDestroy是 JSR-250 标准,优先级高于init-method;InitializingBean接口的afterPropertiesSet()方法也在此阶段执行。期末卷常考执行顺序:构造函数 → setXXX() → init-method → @PostConstruct。

4. Spring AOP 与 Spring MVC:切面织入时机与请求流程的 3 个黑匣子

AOP 和 MVC 是 JavaEE 的“高阶模块”,也是拉开分数的关键。本章直击第8、10、11章真题,用“时间轴”还原 AOP 通知执行顺序、MVC 请求流转路径,破解“为什么@Transactional有时不生效”“为什么@RequestMapping加了却 404”等黑匣子问题。

4.1 AOP 通知执行顺序:不是代码顺序,是织入点定义的“时间契约”

填空题第8章第5题:“AOP 术语中【 】表示 AOP 框架在特定的切入点执行的增强处理”,答案是Advice(通知)。但Advice类型决定执行时机:

  • @Before:目标方法执行前(异常时不执行)
  • @After:目标方法执行后(无论异常与否)
  • @AfterReturning:目标方法正常返回后(异常时不执行)
  • @AfterThrowing:目标方法抛异常后
  • @Around:环绕目标方法(必须手动调用proceed(),否则目标方法不执行)

判断题第8章第1题:“如果在同一个连接点有多个通知需要执行,那么在同一切面中,目标方法之前的前置通知和环绕通知的执行顺序是未知的”,答案为“对”。
为什么?因为@Before和@Around的proceed()前部分都在目标方法前,但 Spring 不保证它们的相对顺序,除非用@Order注解指定优先级。

真题验证(第8章选择题第3题):

@After用于定义后置通知,相当于AfterReturningAdvice
答案:D 错误(@After对应AfterAdvice,@AfterReturning才对应AfterReturningAdvice)

4.2 Spring MVC 执行流程:10 步中,第 3 步和第 6 步是失分重灾区

简答题第10章要求描述 Spring MVC 执行流程,标准答案共 10 步。但阅卷发现,90% 学生在第 3 步和第 6 步出错:

  • 第 3 步错误:写成“HandlerMapping 返回 Handler”,漏掉“及处理器拦截器”(Interceptor)。拦截器是权限校验、日志记录的关键,preHandle()在 Handler 执行前调用。
  • 第 6 步错误:写成“HandlerAdapter 返回 ModelAndView”,漏掉“返回给 DispatcherServlet”。这是流程闭环的关键——DispatcherServlet 是总控,所有返回都必须经它调度。

填空题第10章第1题:“前端控制器拦截请求后,会调用【 】”,答案是HandlerMapping(处理器映射器),不是HandlerAdapter。

提示:HandlerAdapter的作用是适配不同类型的 Handler(如@Controller注解类、HttpRequestHandler接口实现类),它不负责查找 Handler,只负责执行。

4.3@RequestMapping的 method 属性:不是必须写,但不写等于“全方法开放”

填空题第11章第1题:“@RequestMapping注解类型用于映射【 】”,答案是URL(或请求路径)。但判断题第11章第2题:“@RequestMapping的 method 属性必须使用”,答案为“错”。

为什么?因为method是可选属性,默认接受所有 HTTP 方法(GET/POST/PUT/DELETE)。但这是安全隐患!例如:

@RequestMapping("/user") // ❌ 危险:GET 和 POST 都能访问 public String listUsers() { ... }

应明确指定:

@GetMapping("/user") // ✅ 安全:只响应 GET @PostMapping("/user") // ✅ 安全:只响应 POST

选择题第11章第3题:“@RequestMapping(method = RequestMethod.GET)可以缩写为@GetMapping”,答案为“对”。这是 Spring 4.3+ 的语法糖,期末卷常考新旧写法对应关系。

4.4 视图解析器配置:前缀后缀不是路径,是字符串拼接规则

填空题第11章第3题:“在视图解析器配置中,可以设置视图的【 】”,答案是前缀和后缀(或prefix/suffix)。但学生常误解为“物理路径”。

实际作用是:return "user/list"→prefix + "user/list" + suffix→/WEB-INF/jsp/user/list.jsp。
若prefix="/WEB-INF/jsp/",suffix=".jsp",则逻辑视图名"user/list"被解析为/WEB-INF/jsp/user/list.jsp。

判断题第10章第2题:“Spring4.3 版本的配置文件中,必须要配置处理器映射器、处理器适配器和视图解析器”,答案为“错”。
原因:Spring 3.1+ 后,<mvc:annotation-driven>会自动注册默认的HandlerMapping(RequestMappingHandlerMapping)、HandlerAdapter(RequestMappingHandlerAdapter)和ViewResolver(InternalResourceViewResolver),无需手动配置。

4.5DispatcherServlet的加载时机:<load-on-startup>不是数字越大越早

填空题第10章第3题:“<load-on-startup>元素中的 1 表示容器在启动时立即加载这个 Servlet”,答案为“对”。但学生易错在认为数字越大越早加载。

实际规则:

  • <load-on-startup>1</load-on-startup>:容器启动时立即加载(正数)
  • <load-on-startup>缺失或为负数:首次请求时加载(懒加载)
  • 数字越小,加载优先级越高(0比1更早)

判断题第10章第3题:“<load-on-startup>元素中的 1 表示容器在启动时立即加载这个 Servlet”,答案为“对”。
判断题第10章第5题:“Spring MVC 的灵活性比较弱”,答案为“错”——恰恰相反,它的松耦合设计使其易于集成 Shiro、Redis 等框架。

5. 易错题/常见错误:5 个让阅卷人皱眉的“血泪坑”

这些题不是难,而是“看起来会,一写就错”。它们出现在填空、判断、选择题的交叉地带,专门筛选出没动手调试过、只靠死记硬背的学生。每条按“错在哪→为什么错→怎么答对”展开,全是阅卷现场真实扣分案例。

5.1<mappers>是根元素?错!<mapper>才是,<mappers>是配置文件里的容器

错在哪:第1章判断题第1题:“MyBatis 映射文件中<mappers>元素是配置文件的根元素”,学生常因混淆mybatis-config.xml和Mapper.xml而答“对”。
为什么错:<mappers>是mybatis-config.xml中用于批量加载 Mapper 文件的元素,其父元素是<configuration>;而每个Mapper.xml文件的根元素是<mapper>。这是两个配置文件的层级关系,不是同一文件内的元素。
怎么答对:牢记mybatis-config.xml结构:<configuration>→<environments>+<mappers>;Mapper.xml结构:<mapper namespace="...">→<select>/<insert>等。填空题若问“映射文件的根元素”,答案永远是<mapper>。

5.2@Component标在方法上?错!那是@Bean的领地

错在哪:第7章判断题第1题:“@Component注解...使用时只需将该注解标注在相应方法上即可”,学生看到“标注在方法上”就下意识答“对”。
为什么错:@Component是类级别注解,用于标识一个类为 Spring Bean;@Bean才是方法级别注解,用于在@Configuration类中定义 Bean。若把@Component标在方法上,Spring 启动时直接忽略,该方法不会被注册为 Bean。
怎么答对:区分注解作用域:类上用@Component/@Service/@Controller;方法上用@Bean(且方法必须在@Configuration类中);属性上用@Autowired;参数上用@Value。

5.3@After等于@AfterReturning?错!一个管“是否异常”,一个管“是否返回”

错在哪:第8章选择题第3题:“@After用于定义后置通知,相当于AfterReturningAdvice”,学生因名字相似答“对”。
为什么错:@After是AfterAdvice,在目标方法结束后无条件执行(无论正常返回或抛异常);@AfterReturning是AfterReturningAdvice,只在目标方法正常返回后执行。若目标方法抛RuntimeException,@AfterReturning不执行,@After仍执行。
怎么答对:记口诀:“After是‘善后’,AfterReturning是‘庆功’”。@After适合释放资源(如关闭流),@AfterReturning适合记录成功日志。

5.4prototypeBean 修改属性,其他地方也变?错!每个实例都是独立副本

错在哪:第7章判断题第4题:“Spring 中使用prototype定义的 Bean 在 Spring 容器中将只有一个实例”,学生因“prototype”字面意思答“对”。
为什么错:prototype作用域下,每次getBean()都创建全新对象,内存地址不同,修改一个实例的属性不影响其他实例。这与singleton(所有引用指向同一对象)截然相反。
怎么答对:画内存图:singleton是一个对象被 N 个引用指向;prototype是 N 个对象,每个引用指向不同对象。填空题若问“prototypeBean 由谁管理生命周期”,答案必须是“客户端代码”,因为容器不保存实例,无法调用destroy-method。

5.5@RequestMapping不写 method,就默认只响应 GET?错!它接收所有 HTTP 方法

错在哪:第11章判断题第2题:“@RequestMapping的 method 属性必须使用”,学生因安全意识强,以为不写 method 就不安全,答“对”。
为什么错:method属性完全可选,不写时默认method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE},即所有方法都允许。这是历史兼容性设计,但极易引发 CSRF 或误操作。
怎么答对:明确@RequestMapping的 method 是白名单,不配置等于全放开。生产环境必须用@GetMapping/@PostMapping等精确限定,或@RequestMapping(method = RequestMethod.GET)。

6. 答题技巧与押题思路:用“阅卷人思维”倒推你的答案

最后这一章不讲新知识,只教你怎么把已有的知识,变成阅卷人眼中的“标准答案”。我带过 3 届 JavaEE 课程设计,每年改卷时最头疼的不是学生不会,而是会但写不到点上——比如 MyBatis 工作原理写了 7 步,却漏掉最关键的“Executor 动态生成 SQL”;Spring MVC 流程写了 9 步,却把HandlerAdapter和ViewResolver的返回对象写反。以下是我总结的 3 个保命技巧,从现在开始,每次写简答题前都强制走一遍。

6.1 简答题“三要素”模板:名词 + 动作 + 作用

阅卷人扫一眼就抓关键词,所以答案必须包含:核心名词(如SqlSessionFactory)、关键动作(如 “创建”SqlSession)、明确作用(如 “作为 MyBatis 操作数据库的顶层工厂”)。

以 MyBatis 工作原理为例,标准答案第(3)步:“通过 MyBatis 的环境等配置信息构建会话工厂SqlSessionFactory”。

  • ✅ 正确:名词(SqlSessionFactory)+ 动作(构建)+ 作用(会话工厂)
  • ❌ 错误:“创建一个工厂”(缺名词)、“它很重要”(缺动作和作用)

再看 Spring AOP 注解题:

  • ✅ 正确:“@Aspect:标识一个类为切面,使其中的通知(Advice)能被织入目标对象”
  • ❌ 错误:“@Aspect是切面注解”(缺动作和作用)

6.2 判断题“绝对词”预警:看到“必须”“所有”“总是”先打问号

90% 的判断题错误选项都藏在绝对化表述里。例如:

  • “<resultMap>可以包含多个id元素”(第2章判断题第4题)→ 答“错”,因为<resultMap>中id元素只能有一个(主键唯一)
  • “@Autowired默认按名称装配”(第7章选择题第4题)→ 答“错”,因为默认按类型,名称是 fallback

我的习惯是:读完题干,

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进