面试中的 Spring, 我们该怎么去回答
面试中的 Spring,我们该怎么去回答
在企业的实际的应用里面,大部分的企业架构都是基于 Spring 框架的,它的成功来自于他的理念而不是技术,最为核心的理念是 IOC 和 AOP。接下来我们就来讲讲这个 Spring 吧!
Spring 的历史
Spirng 从 2004 年第一个版本至今已经有十多年了,Spring 的出现是因为当时 Sun 公司 EJB 的失败,因为当时的 EJB2 的时代,那配置文件可是非常的多呀,亏了我没在那个时代去做开发,去写代码,不然我估计自己可能怎么凉的都不知道。
而在之后的 EJB3 客服了配置方面的冗余,但是对于 JAVAEE 开发来说,更为致命的是对 EJB 容器的依赖,也就是 EJB 智能运行在 EJB 容器中,EJB 容器的笨重,让很多企业感到熟手无策。
正是因为 EJB 的没落,导致了 Spring 的崛起,在 Spring 中,它会认为一切 Java 的类都是资源,而自愿都是 BEan,容纳这些 Bean 的 Spring 所提供的 IOC 容器,所以 Spring 是一种基于 Bean 的编程。
面试问法一:什么是 Spring
回答:Spring 是一个 J2EE 的框架,这个框架提供了对轻量级 IOC 的良好支持,同时也提供了对 AOP 技术非常好的封装,相比于其他的框架,Spring 框架的设计更加模块化,框架内的每个模块都能完成特定的工作,而且各个模块可以独立的运行,不会相互的前置,因此,在使用 Spring 框架的时候,我们可以使用整个框架,也可以使用框架中的一部分,例如只使用 AOP 模块的日志管理。
回答这个问题的时候,不需要去特别的背诵到底什么是 Spring,我们要说出自己对 Spring 框架的理解就可以了,很多时候面试官可能是问你的是你自己对框架的理解,而不是全篇背诵。
面试问法二:Spring 有哪些模块
图解如下,
上面就是 Spring 的一些模块,在面试中,我们把这七个模块说完,要做出相应的一些讲解。
比如说,SpringAOP,采用了面向切面的思想,使 Spring 框架管理对象支持 AOP,同事这个模块也提供了事务管理,可以不依赖具体的 EJB 组件,就可以将事务管理集成到应用程序中。
SpringORM,提供了对现有的 ORM 框架的支持,例如 Hibernate,JDO,Mybatis 等。
SpringDAO,提供了对数据访问对象(Data Access Object,DAO)模式和 JDBC 的支持,把实现业务逻辑和数据库访问的代码实现分离等。
SpringWeb:提供了 Servlet 监听器的 Context 和 Web 应用的上下文,同时还集成了一些现有的 Web 框架,如 Struts。
SpringContext:扩展核心容器,提供了 Spring 上下文环境,给开发人员提供了有用的服务。
SpringWebMVC:提供了一个构件 Web 应用程序的 MVC 实现。
SpringCore:Spring 框架的核心容器,他提供了 Spring 框架的基本的功能,这个模块最主要的是 BeanFactory,它使用工厂模式来创建所需要的对象,同时 Beanfactory 使用 IOC 的思想,通过读取 XML 文件的方式来实例化对象。
上面介绍只是在面试的时候一些简单的介绍,可以自行理解,问到这个问题的时候,面试官可能并不是让你把每个模块都分析的特别透彻,很多情况下都是想看你到之对 Spring 的理解有多深。
面试问法三:Spring 的核心是哪两个?
Spring 核心内容:IOC 和 AOP。
在面试过程中,说完核心内容之后,一定要把什么是 IOC,什么是 AOP 解释清楚,并且举个你们项目中的例子来加以验证。这个时候,面试官可能就会觉得,你对 Spring 的应用已经很透彻了。
什么是 IOC?
控制反转(Inverse of Control,IOC)有时候也被称之为依赖注入,是一种降低对象之间耦合关系的设计思想。一般来说,在分层体系结构中,都是上层调用下层的接口,依赖注入最直接的提现,@AutoWired,@Resource 这个注解,
上层调用下层的接口,上层依赖于下层的执行,也就是调用者依赖被调用者,而通过 IOC 方式,是的上层不再依赖下层的接口,通过注入实例化对象来选择不同的下层实现,来是先控制反转。
采用 IOC 机制能过提高系统的可扩展性,如果对象之间通过显式调用进行交互会导致调用者和被调用者存在非常紧密的联系,其中一方如果出现变动,那么系统也会进行相应的修改。
就举个例子,一家商店,出售茶叶,刚开始,店主就只有绿茶出售,那么相当于是 AbstractTea1 = new GreenTea()
;但是如果说店家发现绿茶销售不如隔壁的红茶销售好,就想着进红茶卖,那么在这个售货系统过中,凡事出现过AbstractTea1 = new GreenTea()
,都得修改成AbstractTea1 = new BlackTea()
。
而这种创建对象实例的方法往往会对导致程序做大幅度的修改。
而我们可以通过设计模式来解决这个事情,那就是工厂模式,我现在介绍个大概,我们在我们的知识星球中,将会有贯穿全年的介绍所有的设计模式的文章,欢迎大家踊跃加入,一起讨论。
文末会附上知识星球二维码和链接,欢迎加入。不多说了,继续往下介绍。
画个图来看一下
通过图中的方法,可以把创建对象的过程委托给 TeaFactory 来完成,在我们需要使用对象的时候,我们就直接调用 Factroy 类中的 getTea 方法即可,具体创建对象逻辑放在了 TeaFactory 中来实现,我们只需要把 Greentea 换成 BlackTea,那么系统中所有的 AbstractTea1 = new GreenTea()这个方法就会替换成 BlackTea 了,只需要在一个地方做改动就能完成很复杂的事情了。
虽然说采用工厂模式之后,增强了系统的可扩展性,但是从本质上讲,工厂模式只不过是把程序中变动的逻辑全部都放到了工厂类中了,当系统的类比较多的时候,就会经常的去改动工厂类中的代码,我们采用 IOC 实现方法之后,就会有另外一种。
图解
Spring 容器将会根据配置文件来创建调用者对象,同时把被调用的实例化对象通过构造函数或者 set()方法的形式注入到调用者对象中。
而我们回答面试官的问题的时候,同时需要把 IOC 的优点也要说出来。
IOC 优点:
1.通过 IOC 容器,开发人员不需要关注对象是怎么去创建的,同时增加新的类也比较方便了。
2.IOC 容器可以通过配置文件来确定需要注入的实例化对象,因此很方便进行单元测试。
要点二:什么是 AOP?
面向切面编程(Aspect Oriented Programming)是面向对象开发的一种补充,他允许开发人员在不改变原来模型的基础上动态的去修改模型用来满足新的需求,例如,开发人员可以在不更改原来业务逻辑模型的基础上动态的增加日志,安全或者异常处理的功能。
AOP 的基本概念
(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
(3)Advice(通知):AOP 在特定的切入点上执行的增强处理,有 before,after,afterReturning,afterThrowing,around
(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(5)AOP 代理:AOP 框架创建的对象,代理就是目标对象的加强。Spring 中的 AOP 代理可以使 JDK 动态代理,也可以是 CGLIB 代理,前者基于接口,后者基于子类
上面这些内容其实很多时候在面试的时候不用说的这么清楚,因为我们在面试的过程中,并不一定能够记得这么清楚,到时候需要我们表述一个大概的内容即可。
实现代理的两种代理方式:
静态代理(个人理解)
针对具体的类编写代理类。针对一个接口编写一个代理类。
动态代理
而动态代理也可以分为 2 种,一种是 JDK Proxy,另外一种是 cglib 代理。Spring 对于有接口的类使用 JDK Proxy,对于无接口和抽象类用 Cglib 代理,虽然 Cglib 可以进行代理,但是 Cglib 代理是有例外,就是代理类中不能出现 final 修饰的类或者类中有 final 修饰的方法。
如果以上的内容你在面试的过程中,大致上都说出来了,那么对于面试 Spring 这一块,可能几率从百分之 50 上升到百分之八十了。
也祝大家在未来的面试过程中,一直稳如泰山!
评论