每天一套面试题Day34-八股高频(15)
78.讲一下 Spring 中用到的设计模式?
工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例; 单例模式:Bean默认为单例模式。 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术; 责任链模式:在Spring中,例如拦截器链(HandlerInterceptor)就是纯责任链,因为如果某个拦截器的preHandle返回false,则链终止,且只有部分拦截器(在返回false之前的那些)的preHandle被调用,而postHandle和afterCompletion则只有符合条件的拦截器才会执行(且每个拦截器只执行一次)。而过滤器链(Filter)则是不纯责任链,因为每个过滤器都会执行doFilter,并且每个过滤器都会执行。
79.Spring循环依赖是什么?介绍下三级缓存。
循环依赖是指 Bean 对象循环引用,A依赖B, B又依赖A. 那创建对象 时, 创建A对象需要用到B对象, 此时尝试去创建B对象, 发现又要用到 A对象. Spring通过三级缓存解决单例Bean的循环依赖:
一级缓存:singletonObjects - 完全初始化好的单例Bean 二级缓存:earlySingletonObjects - 早期暴露的对象(已实例化但未初始化完成) 三级缓存:singletonFactories - 单例工厂,用于创建早期对象
解决流程:
- 创建A时,实例化后就将ObjectFactory放入三级缓存
- 发现A依赖B,去创建B
- 创建B时,同样将ObjectFactory放入三级缓存
- 发现B依赖A,从三级缓存获取A的ObjectFactory
- 调用ObjectFactory.getObject()得到早期A对象
- 将早期A对象放入二级缓存,从三级缓存移除工厂
- 将早期A注入B,B完成初始化放入一级缓存
- 回到A,从一级缓存获取B并注入,A完成初始化放入一级缓存
记住这个简单的流程:
创建 A → 实例化 A → 放入三级缓存 → 发现需要 B
创建 B → 实例化 B → 放入三级缓存 → 发现需要 A
从三级缓存获取 A(早期对象)→ 放入二级缓存 → 注入给 B
B 完成 → 放入一级缓存 → A 获取 B → A 完成 → 放入一级缓存
80.说说Spring Boot常用的注解。
#面试真题#每日一套面试真题 文章被收录于专栏
记录刷过的面试真题
查看13道真题和解析