SpringFramework
文章导读
IOC/Bean的生命周期
AOP
事务
面试套路
对于面试官问的各个问题,我们首先要知道面试官问我们这个问题的目的是什么,他想从我这里得到什么答案,比如很多面试官喜欢问spring源码,其实并不是想要我们去背源码,是想我们遇到spring相关的问题时候可以快速的解决。套路分下面三点:
我学习源码的过程是什么样的?
通过学习源码,我解决过项目中的哪些问题
源码的代码风格以及设计模式对我在项目开发中的影响
1.IOC
IOC和Bean的生命周期这两个问题的答案其实是大致一样的,可以按照如下的方式回答。
1.1.IOC的流程
准备过程:结合springboot中的run方法,包括根据异常推断当前应用的类型,将class扫描解析成BeanDefination.
创建过程:这段才算是bean的真正初始化,核心是bean循环依赖的解决方案
循环依赖:采用3种容器来解决,核心思想是提前暴露,初始化对象时只完成构造阶段,赋值后续使用populateBean()方法进行赋值
各种Aware接口的处理:可以对bean做相应的操作,详情见脑图
BeanPostProcessor
InitializingBean
销毁过程:DisposableBean,可以使用destroy接口完成一些操作
1.2.对应的注解
其实我们想在bean初始化过程中做一些操作,更多的是使用注解的方式。
@PostConstruct
@ProDestroy
1.3.答题技巧
回答这个问题的时候,首先说明1.1中IOC的流程,这里需要自己去研究一些源码,知道一些核心的方法,这样面试官才会知道你看过源码,之后回答你在项目中是如何处理的,如使用如下两个注解:
@PostConstruct:在容器初始化阶段进行一些初始化加载任务,如加载数据字典等,该注解隶属java,不是spring框架提供的
@ProDestroy:使用该注解在程序关闭时做了一些操作,如清理缓存等。
谨记要结合自己的项目将spring的一些操融入其中
2.AOP
该题目主要考察是否使用AOP做过一些处理,如统一参数校验,接口耗时处理等
2.1.实现机制
两种实现机制:
JDKProxy:必须有接口才能实现,通过生成接口类的实现对象作为代理对象。适合频繁创建对象的场景
Cglib:
通过动态的生成一个要代理的子类,并在方法中完成操作的植入。
底层通过ASM修改字节码的方式。
在创建对象过程中效率极低,但是对象创建完成之后效率很高
适合单例或者池化的对象,效率比较高
2.2.AOP与Filter以及Interceptor
Filter:
依赖于Servlet容器,利用Java的回调机制进行实现
此处涉及到一个设计模式责任链模式,后面会进行讲解
Filter是属于函数回调机制,可以进行鉴权或者设置字符编码等
Interceptor:
AOP思想,基于java反射机制实现,不依赖servlet容器
页面提交的请求响应并进行处理
只能获取参数的名称,不能获取到参数的值
AOP:
只能拦截Spring管理Bean的访问,主要用于业务层
应用场景:日志,事务,请求参数安全验证
3.事务
事务其实就是使用AOP的实现,参考脑图
3.1.事务的隔离级别
3.2.事务的传播机制
回复springframework获取脑图