面试官:"说说你对Spring的理解"
Spring是一个十分庞大的体系,具体可以访问它的官网https://spring.io/projects进行详细了解。
首先,回答这个问题,可以先介绍一下Spring体系中的几个项目:
- SpringFramework
- SpringData
- SpringSecurity
- SpringBoot
- SpringCloud
当然,除了这些之外,Spring还包括很多其他的项目。
接着,着重介绍SpringFramework这个项目,它是一个开源的Java/JavaEE全功能栈的应用程序,SpringFramework提供了一个简易的开发方式,这种开发方式可以避免使用写可能使底层代码变得繁杂混乱的大量的属性文件和不帮助类。
Spring的这种低侵入式设计使代码的污染极低。
SpringFramework包括以下部分:
SpringFramework体系.png
Data Access/Integration模块:数据访问/集成
Web模块:提供了基本的Web开发的集成特性
AOP模块:提供了面向方面的编程实现,允许您定义多方拦截器和切入点,以干净解耦,实现的功能,应该分开的代码。
Aspects模块:提供与AspectJ的集成这又是一个功能强大且成熟的面向方面编程(AOP)框架
instrumentation模块:提供了一定的应用服务器中使用类工具的支持和类加载器实现
messaging模块:消息通知
Core Container模块:核心容器
Test模块:测试模块支持Spring组件使用JUnit或TestNG框架的测试
然后,我们在接受一下Spirng的核心概念:
- Bean管理
- 依赖注入(dependency injection),又称为控制反转(inversion of control)
- 面向切面编程(AOP)
①Bean管理
与传统的应用程序不同,在Spring中将对象的创建交给Spring容器来管理,也就是说只有放入Spring容器中的类,Spring才能对其产生作用。那么Spring究竟是怎样获取类的对象的呢?
要想知道这个,我们首先要弄清楚这几点:
BeanFactory
是Spring容器的根接口,ApplicationContext
是它的子接口,通常用它的子接口ApplicationContext来访问Spring容器。ApplicationContext子接口常用的有四个实现类:
- ClassPathXmlApplicationContext 从 classpath 加载 spring 的配置文件
- FileSystemApplicationContext 从系统文件加载 spring 的配置文件
- AnnotationConfigApplicationContext 获取基于注解的 spring 容器对象
- XmlWebApplicationContext 在 web 环境中获取 spring 容器对象
Spring通过BeanFactory
来获取这些类的对象,在配置文件中通过<bean/>节点将类交给Spring行管理,ApplicationContext的实现类通过getBean()方法从Spring容器中获取对象,认为单例的。
②依赖注入
它可以降低类之间的耦合性,有两种注入方式:
-
set注入,在配置文件中使用<property>节点
set注入.jpg -
构造方法注入,在配置文件中使用<constructor-arg>节点
构造方法注入.png
下面举个例子来说明一下什么是依赖注入:
假设类A因功能F需要调用类B,传统的程序中,我们就会去new一个类B的对象,因而类A就会依赖类于类B,这就是说如果类B不存在,则类A也就无法使用。而使用依赖注入以后,类A只需要去调用实现功能F接口的一个实现类,这个实现类可能是类B,C等等,具体调用谁是由Spring的配置文件决定的,这样类A就不再依赖于类B。
我们可以这样理解控制反转:
资源不是由使用资源的双方进行管理,而是由不使用资源的第三方(即Spring容器)进行管理,这样做的好处是: -
资源集中管理,实现资源的可配置与易管理
-
降低使用资源双方的依赖程度
在传统程序中,当某个角色需要另外一个角色协助时,由调用者来创建被调用者的实例。而在Spring中,创建被调用者的的工作不再由调用者来完成,而由第三方Spring容器来完成,所以称为控制反转,Spring容器创建被调用者的实例,然后注入调用者,所以又称为依赖注入。`
③面向切面编程
AOP在Spring中主要表现在两个方面:
- 提供声明式事务管理
- Spring支持用户自定义切面
面向切面编程是对面向对象编程(OOP)的补充。面向对象编程将程序分解成为各个层次的对象,面向切面编程将程序运行过程分解成各个切面。面向切面编程基于动态代理实现,降低了类直接的耦合程度。Spring的事务管理就是基于AOP实现的。