Spring Aop(面向切面编程)
- 代理模式
- 静态代理
- 动态代理 (所谓动态 。就是动态的生成代理类)
- JDK动态代理(目标类必须实现接口)
- CGLIB动态代理(通过生成子类来生成代理,不能对 final 修饰的类进行代理。)
- AOP常用来做:日志记录,性能统计,安全控制,事务处理等
- 底层实现:动态代理
- 相关概念
- Pointcut(切入点):拦截点
- Advice(通知):AOP做事情的地方
- Aspect(切面):
- Target(目标对象)
- Weave(织入):将切面应用到目标对象并生成代理对象的这个过程即为织入
- Introduction(引入)
回答:Spring AOP是通过动态代理来实现的,通过动态生成代理类然后对目标方法进行数据处理抽取以及解耦,当实现接口时,用的时JDK的动态代理,当没有实现接口时,用的CGLIB的动态代理,因为JDK动态代理基于接口,CGLIB则是生成子类,然后对其方法进行扩充
Spring IOC(控制反转,依赖注入)
- 控制反转:把对象的创建从用户控制编程Spring容器控制,然后实例可以通过容器去找对象
- 依赖注入:把对象的Bean实例注入到容器之后,容器就可以在使用的地方完成自动注入

回答:控制反转,就将对象的创建从用户交给Spring容器,然后在使用的地方再依赖容器来注入。
Spring Bean的生命周期


回答:Spring Bean的生命周期大致可以分为:对象实例化、对象初始化、完整对象、销毁,
在实例化的前后又会执行一些前置和后置的BeanPostProcessor方法,在初始化前又会执行一些Aware的方法,在真正初始化前后又会执行一些BeanPostProcessor的前置和后置的处理器
Spring MVC
- 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
- DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
- 解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。
- HandlerAdapter 会根据 Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。
- 处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
- ViewResolver 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View(视图渲染)。
- 把 View 返回给请求者(浏览器)
Spring 框架中用到了哪些设计模式?
- 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
- 代理设计模式 : Spring AOP 功能的实现。
- 单例设计模式 : Spring 中的 Bean 默认都是单例的。
- 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
Spring 事务中的隔离级别有哪几种?
- TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
- TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
- TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
Spring 事务中哪几种事务传播行为?
- TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)
- TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
自动装配有哪些方式?
- byName
- byType
- 构造函数
- autodetect
