『spring』Java面试题:Spring如何解决的循环依赖( 三 )
// 如果缓存没有 继续创建
field.set(object cacheMap.containsKey(fieldBeanName)
? cacheMap.get(fieldBeanName) : getBean(fieldClass));
// 属性填充完成 , 返回
return (T) object;
这段代码的效果 , 其实就是处理了循环依赖 , 并且处理完成后 , cacheMap中放的就是完整的“Bean”了
这就是“循环依赖”的本质 , 而不是“Spring如何解决循环依赖” 。 之所以要举这个例子 , 是发现一小部分盆友陷入了“阅读源码的泥潭” , 而忘记了问题的本质 。 推荐阅读下:阅读源码的几个小技巧 。 为了看源码而看源码 , 结果一直看不懂 , 却忘了本质是什么 。 如果真看不懂 , 不如先写出基础版本 , 逆推Spring为什么要这么实现 , 可能效果会更好 。
what?问题的本质居然是two sum!
看完笔者刚才的代码有没有似曾相识?没错 , 和two sum的解题是类似的 。 不知道two sum是什么梗的 , 笔者和你介绍一下:two sum是刷题网站leetcode序号为1的题 , 也就是大多人的算法入门的第一题 。 常常被人调侃 , 有算法面的公司 , 被面试官钦定了 , 合的来 。 那就来一道two sum走走过场 。
问题内容是:给定一个数组 , 给定一个数字 。 返回数组中可以相加得到指定数字的两个索引 。
比如:给定nums = [2 7 11 15
target = 9
那么要返回 [0 1
, 因为2 + 7 = 9这道题的优解是 , 一次遍历+HashMap:
class Solution {
public int[
twoSum(int[
nums int target) {
Map<Integer Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i
;
if (map.containsKey(complement)) {
return new int[
{ map.get(complement) i ;
map.put(nums[i
i);
throw new IllegalArgumentException("No two sum solution");
先去Map中找需要的数字 , 没有就将当前的数字保存在Map中 , 如果找到需要的数字 , 则一起返回 。 和笔者上面的代码是不是一样?先去缓存里找Bean , 没有则实例化当前的Bean放到Map , 如果有需要依赖当前Bean的 , 就能从Map取到 。
结尾
如果你是上文笔者提到的“陷入阅读源码的泥潭”的读者 , 上文应该可以帮助到你 。 可能还有盆友有疑问 , 为什么一道“two-sum” , Spring处理的如此复杂?
这个想想Spring支持多少功能就知道了 , 各种实例方式..各种注入方式..各种Bean的加载 , 校验..各种callback , aop处理等等..Spring可不只有依赖注入 , 同样Java也不仅是Spring 。 如果我们陷入了某个“牛角尖” , 不妨跳出来看看 , 可能会更加清晰哦 。
为感谢您对我们的认可 , 特意准备了一些IT入门和进阶的干货
包括:Java、UI设计、H5前端、Python+人工智能、软件测试和新媒体运营六大学科视频资料 。 以及IT就业大礼包 。
线上视频、音频 , 随时学习观看
关注我们并私信“资料”即可获取 。
推荐阅读
- 『Java』java数据结构系列——什么是数据结构
- 『Java』马云:成功人跟普通人差不多,但这三点我一定要分享给所有年轻人
- #Java#java线程到底有多少种状态?
- #智能手表#1、初识java-1
- [华为]有朋友问我“JAVA全栈”、“互联网架构师”和“JAVAEE”到底是什么?
- 「javascript」这边走Javascript了解一下
- 「华为」一篇有趣的Java class
- struts@Java面试之项目面试问题——不看面试会后悔的
- 「Java」六面蚂蚁金服,唬住了面试官要了30K;其实Java面试也没那么难
- Java@23种java设计模式之:建造者模式、工厂方法模式、抽象工厂模式!