Spring Aop(面向切面编程)

  • 代理模式
    • 静态代理
    • 动态代理 (所谓动态 。就是动态的生成代理类)
      • JDK动态代理(目标类必须实现接口)
      • CGLIB动态代理(通过生成子类来生成代理,不能对 final 修饰的类进行代理。)
  • AOP常用来做:日志记录,性能统计,安全控制,事务处理等
  • 底层实现:动态代理
  • 相关概念
    • Pointcut(切入点):拦截点
    • Advice(通知):AOP做事情的地方
    • Aspect(切面):
    • Target(目标对象)
    • Weave(织入):将切面应用到目标对象并生成代理对象的这个过程即为织入
    • Introduction(引入)

回答:Spring AOP是通过动态代理来实现的,通过动态生成代理类然后对目标方法进行数据处理抽取以及解耦,当实现接口时,用的时JDK的动态代理,当没有实现接口时,用的CGLIB的动态代理,因为JDK动态代理基于接口,CGLIB则是生成子类,然后对其方法进行扩充

Spring IOC(控制反转,依赖注入)

  • 控制反转:把对象的创建从用户控制编程Spring容器控制,然后实例可以通过容器去找对象
  • 依赖注入:把对象的Bean实例注入到容器之后,容器就可以在使用的地方完成自动注入

image.png

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

Spring Bean的生命周期

image.png

image.png

回答: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