对于属性的赋值以及如何自动装配是我们在实际编程中经常要实现的功能,spring为我们提供了应有尽有的方式来实现,特别地方便,用好spring还是先用好spring给我们提供的注解开始。理解它们的不同之处也是面试中常问的点。
对于属性的赋值以及如何自动装配是我们在实际编程中经常要实现的功能,spring为我们提供了应有尽有的方式来实现,特别地方便,用好spring还是先用好spring给我们提供的注解开始。理解它们的不同之处也是面试中常问的点。
我们在之前说到过bean的生命周期,其中提到了很多初始化方法,搞得我们晕头晕脑,本文就是来解决这个问题,对bean生命周期中重要的几个初始化和销毁接口或注解进行消息阐述,使得对bean的生命周期理解更加轻松。
所有的组件都应该放进IOC容器中,组件之间的关系通过容器实现自动装配,也就是依赖注入。对于如何将组件注册到容器中,本文从使用的角度出发详细阐述配置文件和注解的实现方式。涉及的注解还是挺多的,不过还是需要记忆一下,尤其是设置bean作用域的注解,面试中被问到过如何设置为多例。
一提到Spring的IOC,那么里面的Bean基本就会被问到,我们也知道,Spring的任务就是对这些bean进行管理和装配,所以bean就是spring IOC处理的对象,如此关键的对象,我们需要了解它核心的两点:作用域和生命周期。
除了IOC之外,spring核心的东西就是AOP。主要的目标是实现关注业务逻辑,解耦非业务逻辑,比如比较典型的日志处理。将日志的处理划分出来,在运行时动态地添加到要拦截的接口方法上,对这个方法的执行前后以及发生异常时实现日志的监控。这种动态的功能是非常重要的功能,本文来介绍一下AOP最基本的使用。
我们已经知道了IOC的基本思想,它用一种倒置的思想帮助我们实现高层建筑需要什么直接引入底层就行,而不需要关心底层的具体实现,因为具体实现已经交给了我们的IOC去实现了。了解了这些之后,光说不练肯定是不行的,下面我们来看看这种依赖倒置到底是如何去用的。首先介绍一下传统的方式,就是spring中经常用的方式。然后再介绍一下springBoot中是什么样子的。其实它们两是差不多的。
学习spring的原理,第一步就是要理解IOC的基本原理,而IOC的重要实现方式是DI,本文了解为什么要有IOC这种思想,它到底帮助我们解决了什么问题,它的优势又是什么。
至此,经典的排序算法的原理全部过了一遍,其中没有说明希尔排序,不过这个并不是重点,我们重点掌握的应该是快排,其次是归并和堆排,最后是插入排序和冒泡排序,在后面就是非比较的排序。本文对它们的特性做一个简单的总结。算法复杂度已经说明,所以不再赘述。
在之前我们介绍的都是比较排序算法,在结果中各元素的次序都基于输入元素间的比较。而任何比较排序算法在最坏情况下都要用 O(NlgN) 此比较来排序。而非基于比较的排序,如计数排序,桶排序,和在此基础上的基数排序,则可以突破O(NlogN)时间下限。但要注意的是,非基于比较的排序算法的使用都是有条件限制的,例如元素的大小限制,相反,基于比较的排序则没有这种限制(在一定范围内)。但并非因为有条件限制就会使非基于比较的排序算法变得无用,对于特定场合有着特殊的性质数据,非基于比较的排序算法则能够非常巧妙地解决。
堆排序的重要性在于它涉及到二叉堆这个数据结构,面试中曾经被问过堆这个数据结构,那么堆其实是一个完全二叉树,它里面含有好几种类型的堆,其中我们比较关注的是二叉堆,它分为大顶堆和小顶堆,是非常常用的一种数据结构。所以我觉得面试中问到堆这个数据结构的时候可以往二叉堆上进行靠拢,然后回答问题。