SSM 框架
Spring + SpringMVC + MyBatis — 从手写 Servlet 到框架化开发。
Spring
IoC(控制反转)
将对象的创建和依赖关系的管理交给 Spring 容器 原来:手动 new 对象,手动注入依赖 现在:Spring 容器管理 Bean 的生命周期 配置方式:XML、注解(@Component, @Service, @Repository, @Controller)、Java Config
DI(依赖注入)
构造方法注入:<constructor-arg> setter 注入:<property> 注解注入:@Autowired(按类型)、@Qualifier(按名称)、@Resource(按名称) @Autowired 默认按类型匹配,@Resource 默认按名称匹配
Bean 作用域
singleton:单例(默认),整个容器一个实例 prototype:原型,每次获取都创建新实例 request:每次 HTTP 请求一个实例(Web 环境) session:每个 HTTP Session 一个实例(Web 环境)
Bean 生命周期
实例化 → 属性注入 → BeanNameAware → BeanFactoryAware → ApplicationContextAware → BeanPostProcessor#before → @PostConstruct → InitializingBean → init-method → BeanPostProcessor#after → 使用 → @PreDestroy → DisposableBean → destroy-method
AOP(面向切面编程)
核心概念
切面 (Aspect):横切关注点的模块化 连接点 (JoinPoint):程序执行的某个点(方法执行) 切入点 (Pointcut):匹配连接点的表达式 通知 (Advice):在切入点执行的动作 目标对象 (Target):被代理的对象 代理 (Proxy):AOP 创建的代理对象
通知类型
@Before:前置通知,在目标方法执行前 @AfterReturning:后置通知,在目标方法正常返回后 @AfterThrowing:异常通知,在目标方法抛出异常后 @After:最终通知,无论是否异常都执行 @Around:环绕通知,最强大,可以控制目标方法是否执行
AOP 实现原理
JDK 动态代理:目标类实现了接口时使用 CGLIB 代理:目标类没有实现接口时使用(继承方式) Spring 默认优先使用 JDK 动态代理
SpringMVC
请求处理流程
- DispatcherServlet 接收请求
- HandlerMapping 根据 URL 查找 Handler
- HandlerAdapter 执行 Handler
- Controller 处理业务逻辑,返回 ModelAndView
- ViewResolver 解析视图
- DispatcherServlet 渲染视图并响应
常用注解
@RequestMapping:映射请求 URL @GetMapping / @PostMapping:简化版 @RequestParam:获取请求参数 @PathVariable:获取 URL 路径变量 @RequestBody:接收 JSON 请求体 @ResponseBody:返回 JSON 响应体 @ModelAttribute:表单数据绑定
文件上传
表单:enctype="multipart/form-data" 配置:CommonsMultipartResolver(最大文件大小、编码) Controller:@RequestParam("file") MultipartFile file file.transferTo(new File(path)) 保存文件
拦截器 (Interceptor)
实现 HandlerInterceptor 接口 preHandle:Controller 执行前(返回 false 中断) postHandle:Controller 执行后、视图渲染前 afterCompletion:视图渲染后(资源清理) 配置:<mvc:interceptors>