『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就业大礼包 。
线上视频、音频 , 随时学习观看
关注我们并私信“资料”即可获取 。


推荐阅读