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 来加载和初始化的,那么就通过反射把这些类进行实例化即可。接下来,实例化之后的类肯定得有一个容器要存储这些对象,因为后面要被获取的到,所以最好的方式就通过 Map 以 className(beanId) 为 key,以实例化后的对象为 value 来存储,所以当调用 getBean(beanId) 方法就能获取具体的实例了,这就是 IOC 的原理。
然后 DI 的的原理其实就是循环 Map 中已经实例化好了的对象,一个一个地判断,然后通过反射获取这些对象的属性,判断这些属性上面有没有比如 @Resource 的注解,如果有的话,通过这些属性的 name 调用 getBean 方法寻找当前容器里面有没有对应的对象;如果找到了,就把该对象赋给这个属性就可以了。大致是这么一个过程。
Spring MVC 的请求过程
Spring MVC 很久都没有问过了,但是这次阿里就问到了,所以还是要掌握的,咱们还是以流程图来说明:
掌握了这张图应付面试足矣,下面来分析每一个步骤:
- 客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
- DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
- 解析到对应的 Handler 后,开始由 HandlerAdapter 适配器处理。
- HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑。
- 处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
- ViewResolver 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View。
- 通过 View 返回给请求者(浏览器)