Spring 面试必知道的问题

209 阅读3分钟

Spring 中的 IOC 与 AOP

IOC

IOC 思想(控制反转)

就是依赖倒置原则的一种代码设计思路。把原先在代码里面需要实现的对象创建、对象之间的依赖,反转给容器来帮忙实现,也就是从具体到抽象的一种转变,使用 IOC 的好处是集中管理,实现类的可配置和易管理,降低了类与类之间的耦合度。

什么是依赖注入(DI):

比如造一辆车需要使用轮胎,如果按照之前的思想,我们总是要在车上把轮胎给造好了,有了 Spring 我们就只需要告诉 Spring,这辆车上面需要四个轮胎;至于轮胎怎么构造,何时构造,车不需要知道。

在系统运行时,Spring 会在适当的时候制造四个轮胎,然后直接安在车上就行了,这样就完成了对车与轮胎关系的控制。车需要依赖轮胎才能正常运转,而轮胎是由 Spring 注入到车上的,这就是 DI 的思想,可能这个例子可能不是太恰当啊,但是大家明白意思就可以了。

原理

Spring 加载 bean 对象的时候肯定是要进行判断要加载哪些类,所以在 Spring 容器初始化的时候,要通过读取配置文件中的 <context:component-scan base-package="com……"> 信息,然后扫描这个包下面的所有 class。然后这个包下面的类不全都是交给 Spring 管理的,所以要进行第二步,识别和筛选哪些类是需要被 Spring 加载的。那么就需要一个标识,这个标识就是注解,比如 @Service@Component 等等,只要是扫描到了 class 中包含了这些注解,那么就可以判定是需要 Spring 来加载和初始化的,那么就通过反射把这些类进行实例化即可。接下来,实例化之后的类肯定得有一个容器要存储这些对象,因为后面要被获取的到,所以最好的方式就通过 MapclassName(beanId) 为 key,以实例化后的对象为 value 来存储,所以当调用 getBean(beanId) 方法就能获取具体的实例了,这就是 IOC 的原理。

然后 DI 的的原理其实就是循环 Map 中已经实例化好了的对象,一个一个地判断,然后通过反射获取这些对象的属性,判断这些属性上面有没有比如 @Resource 的注解,如果有的话,通过这些属性的 name 调用 getBean 方法寻找当前容器里面有没有对应的对象;如果找到了,就把该对象赋给这个属性就可以了。大致是这么一个过程。

Spring MVC 的请求过程

Spring MVC 很久都没有问过了,但是这次阿里就问到了,所以还是要掌握的,咱们还是以流程图来说明:

掌握了这张图应付面试足矣,下面来分析每一个步骤:

  1. 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
  2. DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
  3. 解析到对应的 Handler 后,开始由 HandlerAdapter 适配器处理。
  4. HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑。
  5. 处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
  6. ViewResolver 会根据逻辑 View 查找实际的 View。
  7. DispaterServlet 把返回的 Model 传给 View。
  8. 通过 View 返回给请求者(浏览器)