该文章为视频笔记整理。
视频来源:阿里大佬的Spring面试题100道
1.什么是Spring?
Spring是一个生态。
Spring是一个轻量级的开源容器框架。
Spring是为了解决企业级应用的业务逻辑层和其他各层对象之间,对象和对象之间的耦合问题。
Spring是一个IOC和AOP容器框架。
IOC:控制反转
AOP:面向切面编程
容器:包含并管理应用对象生命周期
2.Spring的有缺点是什么?
优点:
方便解构,简化开发。
集中管理对象,对象和对象之间的耦合度降低,方便维护。AOP编程的支持
在不改代码的情况下可以对代码进行增强,减少重复,提高效率,减少重复。声明式事务支持
提高效率方便测试
可以结合JUnit方便的进行程序测试。方便集成各种优秀框架
集成能力强,简单配置即可使用第三方框架。集合了很多功能性代码
JAVA源码是经典学习范例
学习Spring底层实现,反射、设计模式等,。提供了非常多的扩展接口,供外部扩展。
缺点:
- 从应用层面来说没有缺点
- 简化开发,如果想深入到底层去了解非常困难。(上层使用简单,底层复杂)
- 经过多年迭代,代码量非常庞大,给更新带来困难。
3. Spring IOC 的作用
控制反转,将对象的管理从程序员新建转变为Spring的IOC去新建,集中管理对象,方便维护,特别适合单例。
4. Spring IOC 的优点
- 集中管理对象,方便维护。
- 解耦,默认创建对象为单例,支持懒汉式和饿汉式。
5. Spring IOC的实现机制是什么?
工厂+反射的机制实现的。
Spring IOC和DI(依赖注入)的区别:
DI是IOC中重要的一环。
6. 紧耦合和松耦合有什么区别
高耦合:类之间高度依赖。
松耦合:通过单一职责,关注点分离,依赖倒置原则来实现。
7. BeanFactory的作用
- BeanFactory是Spring中非常核心的一个接口。
- 它是Bean的工厂,它的主要职责就是生产Bean;
- 它实现了简单工厂的设计模式,通过getBean传入一个标识产生一个bean。
8. BeanDefinition的作用
它主要负责储存Bean的定义信息,
Spring Bean 的加载过程:
- 代码中定义bean(通过XML,注解等),
- BeanDefinition中读取bean信息
- BeanFactory中创建bean。
- 在应用中使用。
9.BeanFactory和ApplicationContext有何区别?
ApplicationContext实现了BeanFactory,它不生产bean,而是通知FactoryBean生产bean。(类似于4s店和工厂的关系)
共同点:它也可以作为容器
ApplicationContext做的事情比beanFactory
更多:
- 会自动把我们配置的bean注册进来。
- 加载环境变量。
- 支持多语言。
- 实现事件监听。
- 注册很多对外扩展点。
10.BeanFactory和FactoryBean有什么区别。
BeanFactory是一个工厂。
FactoryBean是一个特殊的bean,它会表现出工厂的样子,是一个能生产或者修饰对象生成的工厂bean,可以通过getObject()来获取FactoryBean对象。在beanFactory中使用"&"来取得FactoryBean本身。
11. Spring IOC 的加载过程
概念态到定义态
实例化一个Applicationcontext的对象
调用bean土厂后置处理器完成扫描;
循环解析扫描出来的类信息,
实例化一个BeanDefiniti。n对象来存储解析出来的信息;
把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来
以便后面实例化bean;再次调用其他bean工厂后置处理器;
定义态到纯净态当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等
等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用finishBeanFactorylnitialization方法来实例化单例的beam实例化之前spring要做验证,需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototypej是否abstract等等如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实例化对象是通过构造方法反射,故而需要知道用哪个构造方法,
推断完构造方法之后spring调用构造方氵去反射实例化一个对象,注意我这里说的是对象、对象、对象,这个时候对象已经实例化出来了,但是并不是一个完整的bean,最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean。
从纯净态到成熟态spring处理合并后的beanDefinition
判断是否需要完成属性注入
如果需要完成属性注入,则开始注入属性
初始化判断bean的类型回调Aware接口
调用生命周期回调方法
如果需要代理则完成代理
创建完成put到单例池 -> bean完成 -> 存在spring容器中