常见问题
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事件
循环依赖
- 为什么 @Autowired 可以实现循环依赖 而 构造函数不可以?
首先Spring Ioc 创建对象分为两个核心的步骤,对象的创建和属性初始化。Bean 在初始化的过程首先需要创建对象,如果通过构造函数的方式进行循环依赖,那么会导致两个对象相互在同一时期望创建导致死循环。
- 两个 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()