[ 成为架构师系列 ] 6. BeanFactory refresh 思想启示

2019-12-03 17:30:11 浏览数 (1)

自上而下的表达,结论先行。

自下而上的总结概括的过程就是抽象的过程,构建金字塔的过程就是寻找逻辑关系,抽象概括的过程。经常锻炼用结构化的方式去处理问题,搭建自己的金字塔,可以帮助我们理清问题的脉络,提升我们的抽象能力。

金字塔结构让我们把混乱无序的信息,通过抽象概括形成不同的抽象层次,从而方便我们理解和记忆,这个方法论值得我们每个人好好掌握。

举个例子,你出门买报纸,你老婆让你带点东西,你老婆给你列了一个清单,里面有葡萄,橘子,咸鸭蛋,土豆,鸡蛋、牛奶和胡萝卜,当你准备出门的时候,你妻子说,顺便还带点苹果和酸奶吧。

如果不用纸记下来,你还能记住妻子让你买的9样东西吗?大部分人应该都不可以,因为我们的大脑短期记忆无法一次容纳7个以上的记忆项目,超过5个时,我们就会开始讲起归类到不同的逻辑范畴,以便于记忆。

对于葡萄,橘子,牛奶,咸鸭蛋,土豆,鸡蛋、胡萝、苹果,酸奶。我们可以按照逻辑关系进行分类,然后搭建一个如下的金字塔结构:

分类的作用不只是将一组9个概念,分成每组各有4个、3个和2个概念的3组概念,因为这样还是9个概念,你所要做的是提高一个抽象层次,将大脑需要处理的9个项目变成3个项目。

这样做以后,你无须再记忆9个概念中的每一个概念,仅需记忆9个概念所属的3个组。这样,你的思维的抽象程度就提高了一层。

由于处于较高层次的思想总是能够提示其下面一个层次的思想,因而更容易理解和记忆。

在程序设计中,也是一样,如果在一个类或者一个函数中涉及过多的内容和概念,我们大脑也会显得不知所措,会觉得很复杂,不能理解。其实有时候,只要按照上面给日用品分类的方法,将一个大方法,按照逻辑关系,整理成一组更高层次的小而内聚的子程序的集合,那么整个代码逻辑就会呈现出完全不一样的风貌,显得干净、容易理解的多。

在这方面,Spring里面核心类AbstractApplicationContext做上下文初始化的refresh方法,给我们做了一个很好的示范:

代码语言:javascript复制
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.
                initMessageSource();

                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // Check for listener beans and register them.
                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);

                // Last step: publish corresponding event.
                finishRefresh();
            }

            catch (BeansException ex) {
                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();

                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }

            finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                resetCommonCaches();
            }
        }
    }

试想下,上面的逻辑,如果是平铺在refresh方法中的,其结果会怎样。

怎样提升抽象能力?

多阅读

为什么阅读书籍比看电视更好呢?因为图像比文字更加具象,阅读的过程可以锻炼我们的抽象能力、想象能力,而看画面的时候会将你的大脑铺满,较少需要抽象和想象。

这也是为什么我们不提倡让小孩子过多的暴露在电视或手机屏幕前的原因,因为这样不利于他抽象思维的锻炼。

抽象思维的差别让孩子们的学习成绩从初中开始分化,许多不能适应这种抽象层面训练的,就去读技校,这里比大学更加具象:车铣刨磨、零件部件都能看到能摸到。

多总结

小时候不理解,语文老师为什么总是要求我们总结段落大意、中心思想什么的。现在回想起来,这种思维训练在基础教育中是非常必要的,其实质就是帮助学生提升抽象思维能力。

记录也是很好的总结习惯。就拿读书笔记来说,最好不要原文摘录书中的内容,而是要用自己的话总结归纳书中的内容,这样不仅可以加深理解,而且还可以提升自己的抽象思维能力。

我们的现象世界繁杂复杂,只有具备较强的抽象思维能力才能够具备抓住事物本质的能力。

多做领域建模

对于技术同学,我们还有一个非常好的提升抽象能力的手段——领域建模。当我们对问题域进行分析、整理和抽象的时候,当我们对领域进行划分和建模的时候,实际上也是在锻炼我们的抽象能力。

参考资料

https://blog.csdn.net/significantfrank/article/details/93173386

0 人点赞