20个Spring
小猿 : 20个Spring面试问答(上篇) 1、什么是Spring框 架?Spring框架有哪些主要模块? Spring框架是一个为Java应 用程序的开发提供了综合、广泛的基础性支持的Java平台。 Spring帮助开发者解决了开发中基础性的问题,使得开发人员 可以专注于应用程序的开发。 Spring框架本身亦是按照设计 模式精心打造,这使得我们可以在开发环境中安心的集成 Spring框架,不必担心Spring是如何在后台进行工作的。 Spring框架至今已集成了20多个模块。这些模块主要被分如下 图所示的核心容器、数据访问/集成,、Web、AOP(面向切面 编程)、工具、消息和测试模块。 2、使用Spring框架能带来 哪些好处? 下面列举了一些使用Spring框架带来的主要好 处: Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。 与EJB容器相比 较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的 内存和CPU资源的情况下进行应用程序的开发和发布就变得 十分有利。 Spring并没有闭门造车,Spring利用了已有的技术 比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以 及其他视图技术。 Spring框架是按照模块的形式来组织的。 由包和类的编号就可以看出其所属的模块,开发者仅仅需要 选用他们需要的模块即可。 要测试一项用Spring开发的应用 程序十分简单,因为测试相关的环境代码都已经囊括在框架 中了。更加简单的是,利用JavaBean形式的POJO类,可以很 方便的利用依赖注入来写入测试数据。 Spring的Web框架亦是 一个精心设计的Web MVC框架,为开发者们在web框架的选 择上提供了一个除了主流框架比如Struts、过度设计的、不流 行web框架的以外的有力选项。 Spring提供了一个便捷的事务 管理接口,适用于小型的本地事物处理(比如在单DB的环境 下)和复杂的共同事物处理(比如利用JTA的复杂DB环 境)。 3、什么是控制反转(IOC)?什么是依赖注入? 控制反
转是应用于软件工程领域中的,在运行时被装配器对象来绑 定耦合对象的一种编程技巧,对象之间耦合关系在编译时通 常是未知的。在传统的编程方式中,业务逻辑的流程是由应 用程序中的早已被设定好关联关系的对象来决定的。 在使用 控制反转的情况下,业务逻辑的流程是由对象关系图来决定 的,该对象关系图由装配器负责实例化,这种实现方式还可 以将对象之间的关联关系的定义抽象化。而绑定的过程是通 过“依赖注入”实现的。 控制反转是一种以给予应用程序中目 标组件更多控制为目的设计范式,并在我们的实际工作中起 到了有效的作用。 依赖注入是在编译阶段尚未知所需的功能 是来自哪个的类的情况下,将其他对象所依赖的功能对象实 例化的模式。这就需要一种机制用来激活相应的组件以提供 特定的功能,所以依赖注入是控制反转的基础。否则如果在 组件不受框架控制的情况下,框架又怎么知道要创建哪个组 件? 在Java中依然注入有以下三种实现方式: 1.构造器注入 2.Setter方法注入 3.接口注入 4、请解释下Spring框架中的 IoC? Spring中的 org.springframework.beans 包
和 org.springframework.context包构成了Spring框架IoC容器的基 础。 BeanFactory 接口提供了一个先进的配置机制,使得任何 类型的对象的配置成为可能。ApplicationContex接口对 BeanFactory(是一个子接口)进行了扩展,在BeanFactory的 基础上添加了其他功能,比如与Spring的AOP更容易集成,也 提供了处理message resource的机制(用于国际化)、事件传 播以及应用层的特别配置,比如针对Web应用的 WebApplicationContext。 org.springframework.beans.factory.BeanFactory 是Spring IoC容器 的具体实现,用来包装和管理前面提到的各种bean。 BeanFactory接口是Spring IoC 容器的核心接口。 5、 BeanFactory和ApplicationContext有什么区别? BeanFactory 可 以理解为含有bean集合的工厂类。BeanFactory 包含了种bean 的定义,以便在接收到客户端请求时将对应的bean实例化。 BeanFactory还能在实例化对象的时生成协作类之间的关系。
此举将bean自身与bean客户端的配置中解放出来。BeanFactory 还包含了bean生命周期的控制,调用客户端的初始化方法
(initialization methods)和销毁方法(destruction methods)。 从表面上看,application context如同bean factory一样具有bean 定义、bean关联关系的设置,根据请求分发bean的功能。但 application context在此基础上还提供了其他的功能。 1.提供了 支持国际化的文本消息 2.统一的资源文件读取方式 3.已在监 听器中注册的bean的事件 以下是三种较常见
的 ApplicationContext 实现方式: 1、 ClassPathXmlApplicationContext:从classpath的XML配置文件 中读取上下文,并生成上下文定义。应用程序上下文从程序 环境变量中取得。 ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”); 2、 FileSystemXmlApplicationContext :由文件系统中的XML配置 文件读取上下文。 ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”); 3、 XmlWebApplicationContext:由Web应用的XML文件读取上下 文。 6、Spring有几种配置方式? 将Spring配置到应用开发中 有以下三种方式: 1.基于XML的配置 2.基于注解的配置 3.基 于Java的配置 7、如何用基于Java配置的方式配置Spring? Spring对Java配置的支持是由@Configuration注解和@Bean注解 来实现的。由@Bean注解的方法将会实例化、配置和初始化 一个新对象,这个对象将由Spring的IoC容器来管理。@Bean 声明所起到的作用与 元素类似。被@Configuration所注解的类 则表示这个类的主要目的是作为bean定义的资源。被
@Configuration声明的类可以通过在同一个类的内部调用
@bean方法来设置嵌入bean的依赖关系。 8、请解释Spring Bean的生命周期? Spring Bean的生命周期简单易懂。在一个 bean实例被初始化时,需要执行一系列的初始化操作以达到 可用的状态。同样的,当一个bean不在被调用时需要进行相 关的析构操作,并从bean容器中移除。 Spring bean factory 负 责管理在spring容器中被创建的bean的生命周期。Bean的生命
周期由两组回调(call back)方法组成。 1.初始化之后调用的 回调方法。 2.销毁之前调用的回调方法。 Spring框架提供了 以下四种方式来管理bean的生命周期事件: InitializingBean和 DisposableBean回调接口 针对特殊行为的其他Aware接口 Bean 配置文件中的Custom init()方法和destroy()方法 @PostConstruct 和@PreDestroy注解方式 9、Spring Bean的作用域之间有什么 区别? Spring容器中的bean可以分为5个范围。所有范围的名 称都是自说明的,但是为了避免混淆,还是让我们来解释一 下: 1.singleton:这种bean范围是默认的,这种范围确保不管 接受到多少个请求,每个容器中只有一个bean的实例,单例 的模式由bean factory自身来维护。 2.prototype:原形范围与单 例范围相反,为每一个bean请求提供一个实例。 3.request:在 请求bean范围内会每一个来自客户端的网络请求创建一个实 例,在请求完成以后,bean会失效并被垃圾回收器回收。 4.Session:与请求范围类似,确保每个session中有一个bean的 实例,在session过期后,bean会随之失效。 5.global-session: global-session和Portlet应用相关。当你的应用部署在Portlet容器 中工作时,它包含很多portlet。如果你想要声明让所有的 portlet共用全局的存储变量的话,那么这全局变量需要存储在 global-session中。 全局作用域与Servlet中的session作用域效果 相同。 10、Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理。关 于单例bean的线程安全和并发问题需要开发者自行去搞定。 但实际上,大部分的Spring bean并没有可变的状态(比如 Serview类和DAO类),所以在某种程度上说Spring的单例bean 是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。 最浅显的解决办 法就是将多态bean的作用域由“singleton”变更为“prototype” 未 完待续 。。。
2018-04-01
评论区:
小猿 : 先起个面试分享带头,大家手头有类似资源,欢迎分享出来,代表星球所有人感激你![抱拳][抱拳][抱拳]