Java面试题-Spring(一)

  1. Spring Framework不同版本的功能
    Spring2.5支持注解;Spring4.0完全支持Java8;Spring5.0的最大特点是支持响应式编程。
  2. 什么是Spring Framework?
    Spring是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为J2EE应用程序开发提供了一个有凝聚力的框架,它可以集成其它框架,所以又称之为框架的框架。
  3. 列举Spring Framework的优点
    由于Spring Framework的分层架构,用户可以自由选择自己需要的组件。Spring Framework支持POJO(Plain Old Java Object)编程,从而具备持续集成和可测试性。由于依赖注入和控制反转,JDBC得以简化。它是开源免费的。
  4. Spring Framework的功能
  • 轻量级:Spring在代码量和透明度方面都很轻便。
  • IOC:控制反转
  • AOP:面向切面编程,可以将应用业务逻辑和系统服务分离,以实现高内聚
  • MVC:对web应用提供了高度可配置性,其他框架的集成也十分方便。
  • 事务管理:提供了用于事务管理的通用抽象层,Spring事务支持也可用于容器较少的环境。
  • JDBC异常:Spring的JDBC抽象层提供了一个异常层次结构,简化了错误处理策略。
  1. Spring Framework有多少个模块?分别是什么?
  1. Spring核心容器(Spring Framework的核心)
  • Spring Core
  • Spring Bean
  • SpEL(Spring Expression Language)
  • Spring Context
  1. 数据访问/集成(该层提供与数据库交互的支持)
  • JDBC(Java Database Connectivity)
  • ORM(Object Relational Mapping)
  • OXM(Object XML Mappers)
  • JMS(Java Messaging Service)
  • Transaction
  1. Web(该层提供创建Web应用程序的支持)
  • Web
  • Web-Servlet
  • Web-Socket
  • Web-Portlet
  1. AOP(该层支持面向切面编程)
  2. Instrumentation(该层为使用Junit和TestNG进行测试提供支持)
  3. Test(该层为使用Junit和TestNG进行测试提供支持)
  4. 几个杂项模块:
    Messaging:该模块为STOMP提供支持。
    它还支持注解编程模型,该模型用于从WebSocket客户端路由和处理信息STOMP消息。
    Aspects:该模块与AspectJ的集成提供支持。
  1. 什么是Spring配置文件?
    Spring配置文件是XML文件。该文件主要包含类信息,它描述了这些类是如何配置以及相互引入的。但是,XML配置文件冗长且更加干净。如果没有正确规划编写,那么在大项目中管理变得非常困难。
  2. Spring应用程序有哪些不同组件?
    Spring应用一般有以下组件:
  • 接口:定义功能
  • Bean类:它包含属性,Setter和Getter方法,函数等。
  • Spring面向切片编程(AOP):提供面向切片编程的功能。
  • Bean配置文件:包含类的信息以及如何配置它们。
  • 用户程序:它使用接口。
  1. 使用Spring有哪些方式?
  • 作为成熟的Spring Web应用程序
  • 作为第三方Web框架,使用Spring Framework中间层。用于远程使用,作为企业级Java Bean,可以包装现有的POJO(Plain Old Java Objects)
  1. 什么是Spring IOC容器?
    Spring框架的核心是Spring容器。容器创建对象,将他们装配到一起,配置它们并管理它们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接受对象进行实例化,配置和组装的指令。该元素可以通过XML,Java注解或者Java代码提供。
  2. 什么是依赖注入?
    在依赖注入中,不必创建对象,但必须描述如何创建他们。不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由IOC容器将它们装配到一起。
  3. 可以用多少种方式完成依赖注入?
    通常,依赖注入可以通过三种方式完成,即:
  • 构造函数注入
  • setter注入
  • 接口注入

在Spring Framework中,仅使用构造函数和setter注入。

  1. 区分构造函数注入和setter注入

构造函数注入

setter注入

没有部分注入

有部分注入

不会覆盖setter属性

会覆盖setter属性

任意修改都会创建一个新实例

任意修改都不会创建一个新实例

适用于设置很多属性

适用于设置少量属性

  1. Spring中有多少IOC容器?
  • BeanFactory:BeanFactory就像一个包含bean集合的工厂类,它会在客户端要求时实例化bean。
  • ApplicationContext:ApplicationContext接口扩展了BeanFactory接口,它在BeanFactory基础上提供了一些额外的功能。
  1. 区别BeanFactory和ApplicationContext

BeanFactory

ApplicationContext

它使用懒加载

他使用即时加载

它使用语法显式提供资源对象

它自己创建和管理资源对象

不支持国际化

支持国际化

不支持基于依赖的注解

支持基于依赖的注解

  1. 列举IOC的一些好处:
    IOC的一些好处是:
  • 它将最小化应用程序中的代码量;
  • 他将使程序易于测试,因为它不需要单元测试用例中的任何单例或JNDI查找机制;
  • 它以最小的影响和最少的侵入机制促进松耦合;
  • 它支持即时的实例化和延迟加载服务。
  1. Spring IOC的实现机制
    Spring中的IOC实现原理就是工厂模式加反射机制。
  2. 什么是Spring Bean?
  • 它们是构成应用程序主干的对象;
  • Bean由Spring IOC容器管理;
  • 它们由Spring IOC容器实例化,配置,装配,管理;
  • Bean是基于用户提供给容器的配置元数据创建。
  1. 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来实现。
  1. @Bean注解扮演与元素相同搞定角色。
  2. @Configuration类允许通过简单地调用同一个类中的其他@Bean方法来定义bean间的依赖关系。
    例如:
@Configuration
public class StudentConfig{
	@Bean
	public StudentBean myStudent(){
		return new StudentBean();
	}
}
  1. 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 时,最后三个才可用。

  1. Spring bean容器的生命周期是什么样的?
    spring bean 容器的生命周期流程如下:
  1. Spring 容器根据配置中的 bean 定义中实例化 bean。
  2. Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
  3. 如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。
  4. 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
  5. 如果存在与 bean 关联的任何BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。
  6. 如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。
  7. 如果存在与 bean 关联的任何 BeanPostProcessors,则将调用postProcessAfterInitialization() 方法。
  8. 如果 bean实现DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
  9. 如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。