Spring 常见问题

262 阅读3分钟

概述

本章中主要解答 Spring 中常见问题和以自己对于这些问题的解读。

常见问题

Spring Ioc

  1. Spring Ioc 如何理解? Ioc 是 Spring Framework 中众多特征之一,表示控制反转,其实反转的过程就是将本来我们需要通过 new 创建对象的过程,交由 Spring Ioc 去完成创建。这些动作 Spring Ioc 都帮我们完成了, 除了对象的创建之外,Ioc 还有一个功能就是实现对象的初始化赋值。

  2. BeanDefinition 的核心参数? BeanDefinition 主要是 Bean 的定义信息在 Spring 中通过 ASM 字节码技术去读取 .class 文件然后获取到Bean 的 BeanDefinition然后通过 BeanDefinition 作为对象的元数据进行定义 Bean。 包含 Bean 的属性值,构造函数参数值以及具体方法实现。允许通过 BeanFactoryPostProcessors 对其进行修改和赋值。

  3. BeanPostProcessor 是什么? BeanPostProcessor 是 Spring Framework 拓展的核心接口,通过 BeanPostProcessor 可以实现 DI 和 AOP,常用的两个类有 AutowiredAnnotationBeanPostProcessor 实现自动注入以及 DefaultAdvisorAutoProxyCreator 实现 AOP 自动代理

  4. Spring Ioc 容器的启动过程? 1).初始化一个Reader和Scanner,Reader可以用来注册单个BeanDefinition,Scanner用来扫描得到BeanDefinition
    2).通过Reader把配置类注册为一个BeanDefinition
    3).调用refresh方法,开始启动Spring容器
    4). 先获取一个Bean工厂
    5).预先往Bean工厂中添加一些Bean后置处理器,和一些单例bean,和一些其他的配置
    6).执行Bean工厂的后置处理器,这里会进行扫描,扫描bean和bean的后置处理器
    7).实例化bean的后置处理器并且排序,然后添加到Bean工厂中去
    8).初始化用来进行国际化的MessageSource
    9).初始化事件广播器
    10).注册事件监听器
    11).开始实例化非懒加载的单例bean
    12).发布ContextRefreshedEvent事件

循环依赖

  1. 为什么 @Autowired 可以实现循环依赖 而 构造函数不可以? 首先Spring Ioc 创建对象分为两个核心的步骤,对象的创建和属性初始化。Bean 在初始化的过程首先需要创建对象,如果通过构造函数的方式进行循环依赖,那么会导致两个对象相互在同一时期望创建导致死循环。

  2. 两个 FactoryBean 是否支持循环依赖? 支持

Spring Aop

  1. Spring AOP 如何理解? Aop 核型是实现对象行为功能的拓展, 比如在对象方法执行之前,之后,或者发生异常。这个过程中进行增加额外的逻辑,通常我们会利用 Aop 机制来实现权限控制,日志记录,缓存,包括事务处理也是 Aop 通过来实现的

  2. AOP 最重要的几个要素? 通知(执行时机和执行内容),连接点(执行过程中可插入切面的点),切入点(在何处插入),切面(通知 + 切点)织入

  3. @Aspect 最重要的步骤的那些? AnnotationAwareAspectJAutoProxyCreator 来处理 @Aspect . 在 wrapIfNecessary 方法中判断是否需要代理,以及有那些代理的 advice 已完成代理对象的创建

  4. @Before @AfterReturing 这些为什么不需要显示的调用 xxx.preceed() @Before @AfterReturing 拦截器分别是 AspectJAfterAdvice AspectJAfterThrowingAdvice 都重写了 MethodInterceptor#invoke 方法, 并且在方法中主动调用了 xxx.preceed()

Spring 源码解析