常见模块
- 客户端发起请求,进入
DispatcherServlet DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler(即Controller控制器)- 由
HandlerAdapter适配器处理请求,执行业务逻辑 - 返回
ModelAndView对象,Model是返回的数据对象,View是逻辑View ViewResolver根据逻辑View查找实际的View- 再由
DispatcherServlet把Model传给View - 把
View返回给请求者AOP
- 面向切面编程,减少重复代码、降低模块耦合、可维护性和可拓展性更强
- 基于动态代理
- 默认使用JDK Proxy,为实现了接口的对象创建代理对象
- 当没有实现接口时,使用
Cglib生成被代理对象的子类来作为代理(基于ASM修改字节码) - Spring AOP是运行时增强,AspectJ是编译时增强
- SpringAOP基于代理,AspectJ基于字节码操作
常见注解:
@Aspect@Pointcut@Around@Before@AfterIOC
控制反转,是一种设计思想
- 将手动创建对象这一过程,交给Spring管理
- IOC容器实际上就是个Map,里面存放各种对象
常见注解:
@Controller@Service@Repository@Component@Bean等DI
Dependency Injection,依赖注入
- 相当于IOC的具体实现
-
用到了哪些设计模式
工厂设计模式:
BeanFactory、ApplicationContext创建bean对象- 代理模式:AOP是代理模式
- 单例模式:Spring中的Bean模式都是单例
- 模版方法模式:
JdbcTemplate、HibernateTemplate等 - 观察者模式:Spring事件驱动模型
适配器模式:
DispatcherServlet通过适配器适配Controller事务
常见注解:
@Transactional传播行为:REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED
事务失效的原因
数据库不支持事务
- 没有被Spring管理,也即没有被加载成Bean
- 方法不是
public,如果一定要用在非public方法上,可以开启AspectJ代理 - 被异常捕获了
- 异常类型错误,默认异常是
RuntimeException
