Java面试题-Spring(一)
Java面试题-Spring(一)
-
Spring Framework不同版本的功能
Spring2.5支持注解;Spring4.0完全支持Java8;Spring5.0的最大特点是支持响应式编程。
-
什么是Spring Framework?
Spring是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为J2EE应用程序开发提供了一个有凝聚力的框架,它可以集成其它框架,所以又称之为框架的框架。
-
列举Spring Framework的优点
由于Spring Framework的分层架构,用户可以自由选择自己需要的组件。Spring Framework支持POJO(Plain Old Java Object)编程,从而具备持续集成和可测试性。由于依赖注入和控制反转,JDBC得以简化。它是开源免费的。
-
Spring Framework的功能
- 轻量级:Spring在代码量和透明度方面都很轻便。
- IOC:控制反转
- AOP:面向切面编程,可以将应用业务逻辑和系统服务分离,以实现高内聚
- MVC:对web应用提供了高度可配置性,其他框架的集成也十分方便。
- 事务管理:提供了用于事务管理的通用抽象层,Spring事务支持也可用于容器较少的环境。
- JDBC异常:Spring的JDBC抽象层提供了一个异常层次结构,简化了错误处理策略。
-
Spring Framework有多少个模块?分别是什么?
-
Spring核心容器(Spring Framework的核心)
- Spring Core
- Spring Bean
- SpEL(Spring Expression Language)
- Spring Context
-
数据访问/集成(该层提供与数据库交互的支持)
- JDBC(Java Database Connectivity)
- ORM(Object Relational Mapping)
- OXM(Object XML Mappers)
- JMS(Java Messaging Service)
- Transaction
-
Web(该层提供创建Web应用程序的支持)
- Web
- Web-Servlet
- Web-Socket
- Web-Portlet
-
AOP(该层支持面向切面编程)
-
Instrumentation(该层为使用Junit和TestNG进行测试提供支持)
-
Test(该层为使用Junit和TestNG进行测试提供支持)
-
几个杂项模块:
Messaging:该模块为STOMP提供支持。
它还支持注解编程模型,该模型用于从WebSocket客户端路由和处理信息STOMP消息。
Aspects:该模块与AspectJ的集成提供支持。
-
-
什么是Spring配置文件?
Spring配置文件是XML文件。该文件主要包含类信息,它描述了这些类是如何配置以及相互引入的。但是,XML配置文件冗长且更加干净。如果没有正确规划编写,那么在大项目中管理变得非常困难。
-
Spring应用程序有哪些不同组件?
Spring应用一般有以下组件:
- 接口:定义功能
- Bean类:它包含属性,Setter和Getter方法,函数等。
- Spring面向切片编程(AOP):提供面向切片编程的功能。
- Bean配置文件:包含类的信息以及如何配置它们。
- 用户程序:它使用接口。
-
使用Spring有哪些方式?
- 作为成熟的Spring Web应用程序
- 作为第三方Web框架,使用Spring Framework中间层。用于远程使用,作为企业级Java Bean,可以包装现有的POJO(Plain Old Java Objects)
-
什么是Spring IOC容器?
Spring框架的核心是Spring容器。容器创建对象,将他们装配到一起,配置它们并管理它们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接受对象进行实例化,配置和组装的指令。该元素可以通过XML,Java注解或者Java代码提供。
-
什么是依赖注入?
在依赖注入中,不必创建对象,但必须描述如何创建他们。不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由IOC容器将它们装配到一起。
-
可以用多少种方式完成依赖注入?
通常,依赖注入可以通过三种方式完成,即:
- 构造函数注入
- setter注入
- 接口注入
在Spring Framework中,仅使用构造函数和setter注入。
-
区分构造函数注入和setter注入
构造函数注入 setter注入 没有部分注入 有部分注入 不会覆盖setter属性 会覆盖setter属性 任意修改都会创建一个新实例 任意修改都不会创建一个新实例 适用于设置很多属性 适用于设置少量属性 -
Spring中有多少IOC容器?
- BeanFactory:BeanFactory就像一个包含bean集合的工厂类,它会在客户端要求时实例化bean。
- ApplicationContext:ApplicationContext接口扩展了BeanFactory接口,它在BeanFactory基础上提供了一些额外的功能。
-
区别BeanFactory和ApplicationContext
BeanFactory ApplicationContext 它使用懒加载 他使用即时加载 它使用语法显式提供资源对象 它自己创建和管理资源对象 不支持国际化 支持国际化 不支持基于依赖的注解 支持基于依赖的注解 -
列举IOC的一些好处:
IOC的一些好处是:
- 它将最小化应用程序中的代码量;
- 他将使程序易于测试,因为它不需要单元测试用例中的任何单例或JNDI查找机制;
- 它以最小的影响和最少的侵入机制促进松耦合;
- 它支持即时的实例化和延迟加载服务。
-
Spring IOC的实现机制
Spring中的IOC实现原理就是工厂模式加反射机制。
-
什么是Spring Bean?
- 它们是构成应用程序主干的对象;
- Bean由Spring IOC容器管理;
- 它们由Spring IOC容器实例化,配置,装配,管理;
- Bean是基于用户提供给容器的配置元数据创建。
-
Spring提供了哪些配置方式?
-
基于xml配置:
Bean所需的依赖项和服务在XML格式的配置文件中指定。这些配置文件通常包含许多bean定义和特定于应用程序的配置选项。它们通常以bean标签开头。
例如:
<bean id="studentBean" class="org.edureka.firstSpring.StudentBean"> <property name="name" value="Edureka"/> </bean>
-
基于注解配置:
可以在相关的类,方法或字段上声明使用注解,将bean配置为组件类本身,而不是使用XML来描述Spring装配。默认情况下,Spring容器未打开注解装配。因此,需要在使用它之前在Spring配置文件中启用它。例如:
<beans> <context:annotation-config/> </beans>
-
基于Java API配置
Spring的Java配置是通过使用@Bean和@Configuration来实现。
-
@Bean注解扮演与元素相同搞定角色。
-
@Configuration类允许通过简单地调用同一个类中的其他@Bean方法来定义bean间的依赖关系。
例如:
@Configuration public class StudentConfig{ @Bean public StudentBean myStudent(){ return new StudentBean(); } }
-
-
-
Spring支持几种bean scope?
Spring bean 支持 5 种 scope:
-
Singleton - 每个 Spring IoC 容器仅有一个单实例。
-
Prototype - 每次请求都会产生一个新的实例。
-
Request - 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效。
-
Session - 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。
-
Global-session - 类似于标准的 HTTP Session 作用域,不过它仅仅在基于portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 globalsession 作用域中定义的bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web会自动当成 session 类型来使用。
仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用。
-
-
Spring bean容器的生命周期是什么样的?
spring bean 容器的生命周期流程如下:
-
Spring 容器根据配置中的 bean 定义中实例化 bean。
-
Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
-
如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。
-
如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
-
如果存在与 bean 关联的任何BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。
-
如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。
-
如果存在与 bean 关联的任何 BeanPostProcessors,则将调用postProcessAfterInitialization() 方法。
-
如果 bean实现DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
-
如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。
-