1. 请说说Spring的核心是什么/有哪些模块(面试真题)
      1. Spring包含众多模块,Core、Testing、Data Access、Web Servlet…
      2. 最核心的是Core
        1. 提供了IOC容器、AOP功能、数据绑定、类型转换等
      3. IOC
        1. 控制反转,把new对象的权利交给程序并让其帮助维护对象之间的关系
      4. AOP
        1. OOP的补充,统一解决一批组件的共性需求:权限检查、日志、事务等
    2. 说一说对Spring容器的了解
      1. BeanFactory
        1. 基础容器。启动初期速度快,所需资源有限,适合对功能要求不严格的场景
      2. ApplicationContext
        1. 高级容器,提供事件发布、国际化信息。要求更多资源
    3. 说一说对BeanFactory的了解
      1. 是类的通用工厂,创建并管理各种类的对象
      2. Spring容器的顶层接口
    4. 说一说对IOC的理解
      1. 定义见问题1
      2. 实现
        1. DI(Dependency Injection)依赖注入是IOC的实现方式
        2. 三种注入方式
          1. 构造方法注入
            1. 在被注入对象构造方法中声明依赖对象的参数列表
          2. setter方法注入
            1. 通过setter方法更改响应的对象属性
          3. 接口注入
            1. 通过IOC Servie Provider注入,要求必须实现某个接口。IOC Servie Provider通过该接口了解应该注入什么对象
      3. Spring是如何管理Bean的
        1. IOC容器,可以通过XML或注解管理
        2. 管理Bean时常用的注解
          1. @ComponentScan
          2. @Conponent
          3. @Autawired、@Qualifier
          4. @Scope
          5. @PostConstruct、@PreDestroy

      1. 介绍Bean的作用域
        1. 默认是singleton单例 | 类型 | 说明 | | —- | —- | | singleton | 在Spring容器中仅存在一个实例,即Bean以单例的形式存在。 | | prototype | 每次调用getBean()时,都会执行new操作,返回一个新的实例。 | | request | 每次HTTP请求都会创建一个新的Bean。 | | session | 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。 | | globalSession | 同一个全局的Session共享一个Bean,一般用于Portlet环境。 |
    5. 说一说Bean的生命周期

      1. Spring启动,进行Bean的实例化
      2. Bean属性注入
      3. 根据是否实现对应接口调用相关方法
      4. Bean准备就绪
      5. 销毁
    6. Spting是怎么解决循环依赖的?
      1. 三种情况
        1. 构造器的循环依赖
          1. Spring处理不了,抛出异常
        2. 单例模式的setter循环依赖
          1. 通过三级缓存处理
        3. 非单例循环依赖
          1. 无法处理
    7. @Autowired和@Resource有什么区别
      1. @Autowired是Spring提供的注解,@Resource是JDK提供的
      2. @Autowired按类型注入,@Resource默认按名称,但也支持类型
      3. @Autowired默认情况要求依赖对象必须存在,可与@Qualifier一起使用;@Resource两个属性name和type,一旦指定name,只能按名称装配
    8. Spring默认提供的单例模式是安全的吗?
      1. 不是
    9. 对AOP的理解
      1. OOP将程序抽象成不同的层次,AOP将程序抽象成各个切面
      2. AOP术语
        1. 连接点
          1. 对应具体被拦截的对象
        2. 切点
          1. 适配连接点
        3. 通知
          1. 约定流程下的方法,会织入流程
        4. 目标对象
          1. 被代理对象
        5. 引入
          1. 引入新的类和方法
        6. 织入
          1. 将切点与匹配的连接点拦截,按约定把通知纳入流程
        7. 切面
          1. 可以定义切点和各类通知和引入
      3. 实现方式
        1. JDK动态代理
          1. Java提供,在运行时创建接口的代理实例
        2. CGLib动态代理
          1. 底层字节码技术,在运行时创建子类代理的实例,目标对象不存在接口时采用
    10. AOP的应用场景
      1. 日志、事务处理、权限管理
    11. Spring AOP不能对哪些类进行增强
      1. AOP只能对IOC容器中的Bean进行增强
      2. CGLib不能对final的类代理
    12. 既然有没有接口都可以用CGLib,那为什么还要有JDK代理
      1. CGLib创建代理花费的时间较多,JDK适用于需要频繁创建代理对象的场景
    13. Spring如何管理事务
      1. 编程式事务
        1. 麻烦但灵活且事务控制精确
      2. 声明式事务
        1. @Transaction
    14. Spring的事务传播方式有哪些? | 事务传播类型 | 说明 | | —- | —- | | PROPAGATION_REQUIRED | 如果当前没有事务,则新建一个事务;如果已存在一个事务,则加入到这个事务中。这是最常见的选择。 | | PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,则以非事务方式执行。 | | PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,则抛出异常。 | | PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,则把当前事务挂起。 | | PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,则把当前事务挂起。 | | PROPAGATION_NEVER | 以非事务方式执行操作,如果当前存在事务,则抛出异常。 | | PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |

    15. 注解@Transactional

      1. 标注在类上
        1. 这个类的所以public非静态方法都将开启事务
      2. 标注在方法
        1. 该方法开启事务