前言
最近同事因为工作忙没时间面试候选人,偶尔会让我临时替补,就这样我作为替补面试官面了一个初级妹子,两个(自称)高级的开发。我面试候选人的习惯就是看他简历写啥我就问啥。他们的简历上都有写熟悉 SpringMVC
,于是我随便问了两个问题就回答的很不理想
- SpringMVC 的执行流程
- 前端传递
?username=xx&password=xx
,controller
中就能自动用User
对象来接收,这是如何实现的?
第一个问题应该比较简单,随便背背就好了,然而两个高级开发也是回答的很模糊......
第二个问题对于初级开发来说可能是相对有难度,但是对于 5-10
年的高级开发连边都答不上,我觉得这是很不应该的,我的要求很简单,并不是要候选人把完整的源码流程说出来,只要候选人能够答道 参数解析器/类型转换器
,我就觉得这个问题可以过了。
PS 最让我伤心的是候选人税前年薪 40w +
,期望年薪 50w +
都快到我三倍了......然后居然这些基础都答不上,消息队列和缓存中间件的应用场景也回答的模模糊糊,随便提个问题就答不上了。于是我只能安慰自己,他们肯定是来面管理岗的!薪资高正常......对,就是这样!!!
灵魂拷问
让我们先来看一段很常见的代码
@GetMapping("/example/{id}")
public void example(@PathVariable Long id,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime dateTime,
@RequestParam List<Long> ids,
@RequestParam Boolean enable,
@RequestParam ExampleEnum exampleEnum,
User user) {
log.info(id.toString());
log.info(dateTime.toString());
log.info(ids.toString());
log.info(enable.toString());
log.info(exampleEnum.toString());
log.info(user.toString());
}
复制代码
然后我们写个测试模拟 HTTP
请求
@Test
void example() throws Exception {
mvc.perform(
get("/example/1")
.param("dateTime", "2020-09-02T16:00:01")
.param("ids", "1,2,3")
.param("enable", "no")
.param("exampleEnum", "ONE")
.param("username", "暮色妖娆丶")
)
.andExpect(status().isOk());
}
复制代码
再来看打印的日志
: 1
: 2020-09-02T16:00:01
: [1, 2, 3]
: false
: ONE
: User(username=暮色妖娆丶)
复制代码
这样的代码我们几乎每天都在写,但是你有没有想过
- 为什么传的
1,2,3
能自动转为List<Long>
? - 为什么传的
no
能够被转为布尔类型的false
? - 为什么传的
username
就能被自动封装到user
中? - 为什么传的
ONE
就能被自动封装到ExampleEnum
中?
如果你提出疑问,我会用不就行了?为什么要理解它是怎么实现的?
SpringMVC 执行流程
在搞清楚上述