SpringFramework是Spring全家桶的基础,并且已经是公认的java开发基准框架,现在的java开发,没有spring framework会寸步难行。
正是因为Spring已经变成了当前JAVA开发的事实上的霸主,绝大部分的JAVA项目都不太可能没有Spring,而且,最重要的,绝大部分的初学者如果不掌握Spring,你可能就很难入门:你拿不到offer,即使是小公司的offer你都拿不到。
所以初学者,包括大学校园里学完JAVA基础课程的学生,或者刚入职场的JAVA菜鸟,都有必要对Spring经历一遍“从入门到NB”的过程。
我们先从一个面试问题说起。
面试题:你对Spring Framework的理解
最常见的回答,包括:Java开源、可配置、一站式开发框架,核心是IOC与AOP,让开发者能够采用最简单的方式构建出企业级java应用。
很多小伙伴说完上面一段之后就停下来了,面试官很为难,只能继续问:然后呢?
小伙伴(心里嘀咕:还有什么然后...没了):嗯...然后就是可以使用注解的方式简化开发,帮助程序员完成了许多特别麻烦的配置,可以通过AOP实现分离关注,让程序员能够专注于实现业务逻辑本身......
这次就真的没有然后了。
其实个人觉得,对这个问题回答IOC和AOP,尤其是回答了Ioc和AOP之后就认为已经回答了有关Spring Framework的全部问题的,根本就没有说到点子上,或者说你根本就不了解Spring Framework。
对Srping Freamwork的概念的解释,上来首先说Srping Freamwork是一个容器,比直接说IOC和AOP给人的感觉要好得多。这些IOC、AOP、轻量级、松耦合之类的概念,对于你真正理解Srping Freamwork,或者说对于面试官很好的理解你对Srping Freamwork框架的认识和掌握,远没有以下知识点来的重要、且直接:
- Srping Freamwork其实是一个容器,这个容器以bean的方式管理我们创建的类
- 有了Srping Freamwork,程序员编写代码创建“类”之后,Srping Freamwork通过Ioc的方式帮助我们创建对象,也就是我们所说的bean
- Srping Freamwork创建bean之后,保存在容器中
- 我们在需要使用对象的时候,可以从Srping Freamwork容器中非常方便的获取(DL或DI)
- Srping Freamwork可以采用动态代理的机制创建bean,并在此基础上帮助程序员实现AOP功能
对于“如何理解Srping Freamwork”这个问题,以上几点大纲式的回答,感觉已经足够了。这个回答能起到提纲挈领的作用,面试官对其中任何一个问题感兴趣,都可以继续深入下去。
这样的回答,比干巴巴的Ioc、Aop、松耦合、可配置等等,更能切中要害。
当然,要想很好的深入回答面试官可能提出的进一步的问题,还需要继续深入学习。
什么是IoC
Ioc是Inversion of Control的首字母简写,即反转控制,其实Spring官网的文档介绍Ioc的时候,是说Ioc Container,反转控制容器:
Introduction to the Spring IoC Container and Beans
This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) principle. IoC is also known as dependency injection (DI).
意思是说说Spring提供了一个容器、具有反转控制的能力,Spring容器的反转控制的能力和他的一个特性:dependency injection(DI)-依赖注入有关,Spring容器正是通过依赖注入来提供IoC能力。
所以说反转控制IoC其实和依赖注入(DI)是分不开的,Spring是通过DI提供IoC的。
为什么叫IoC-反转控制呢?所谓的反转,肯定是和传统的处理方式(类之间的依赖关系的处理方式)比较而言的。为说明问题,与Spring的“反转控制”相对应,我们假设传统的处理方式叫“正常的控制”。
假设我们创创建了一个类A,里面包含各种属性,其中一个属性(属性b)是另外一个类B。
“正常的控制”过程是这样的:在使用的时候我们会通过new创建类A的一个对象A1,给对象A1的各属性赋值,赋值过程中我们需要创建类B的对象B1,把对象B1赋值给A1的属性b。
每次应用需要使用类A的时候,我们可能都需要重复上述过程创建、准备好类A的对象,提交给应用去使用。
Spring IoC的控制方式从某种意义上理解正好和这个“正常的控制”相反(这应该也是反转控制这个名字的由来):Spring的IoC容器创建类A的对象A1,并创建对象B的对象B1,并且,Spring IoC容器还负责将对象B1“注入”到对象A1中,让A1不创建而直接持有对象B1。这样一来,Spring就反转了以往的对象创建的控制权:以往是对象A1掌握着创建自己的属性(对象B1)的控制权,现在这个控制权被反转了,A1没有控制权了,等着Spring IoC容器投喂(依赖注入)就好了。
IoC容器创建好的对象,我们统一管他叫bean,创建好的bean都装在容器中,应用随时可以从容器中获取。
所以,依赖注入DI是IoC容器在创建bean的过程中的一项技术或者概念,正是通过DI,Spring创建的对象才是一个“丰满的”、应用可以使用的对象,换句话说,DI是负责bean的属性赋值的,没有DI,Spring创建的对象就是一个无法使用的空对象。所以,DI可以说是IoC的灵魂,我们放在下一篇文章分析。