常见模块
- 客户端发起请求,进入
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
@After
IOC
控制反转,是一种设计思想
- 将手动创建对象这一过程,交给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