每天一套面试题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 - 单例工厂,用于创建早期对象

解决流程:

  1. 创建A时,实例化后就将ObjectFactory放入三级缓存
  2. 发现A依赖B,去创建B
  3. 创建B时,同样将ObjectFactory放入三级缓存
  4. 发现B依赖A,从三级缓存获取A的ObjectFactory
  5. 调用ObjectFactory.getObject()得到早期A对象
  6. 将早期A对象放入二级缓存,从三级缓存移除工厂
  7. 将早期A注入B,B完成初始化放入一级缓存
  8. 回到A,从一级缓存获取B并注入,A完成初始化放入一级缓存

记住这个简单的流程:

创建 A → 实例化 A → 放入三级缓存 → 发现需要 B
创建 B → 实例化 B → 放入三级缓存 → 发现需要 A
从三级缓存获取 A(早期对象)→ 放入二级缓存 → 注入给 B
B 完成 → 放入一级缓存 → A 获取 B → A 完成 → 放入一级缓存

80.说说Spring Boot常用的注解。

alt alt alt 参阅(牛客的答案)[https://www.nowcoder.com/questionTerminal/34cede9192b4440a9ee997d2de7a8d66?examPageSource=25mianshitop]

#面试真题#
每日一套面试真题 文章被收录于专栏

记录刷过的面试真题

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务