首页 > 技术文章 > Java面试题-Spring(一)

1ldk 2021-04-16 23:48 原文

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抽象层提供了一个异常层次结构,简化了错误处理策略。
  5. Spring Framework有多少个模块?分别是什么?

    1. Spring核心容器(Spring Framework的核心)

      • Spring Core
      • Spring Bean
      • SpEL(Spring Expression Language)
      • Spring Context
    2. 数据访问/集成(该层提供与数据库交互的支持)

      • JDBC(Java Database Connectivity)
      • ORM(Object Relational Mapping)
      • OXM(Object XML Mappers)
      • JMS(Java Messaging Service)
      • Transaction
    3. Web(该层提供创建Web应用程序的支持)

      • Web
      • Web-Servlet
      • Web-Socket
      • Web-Portlet
    4. AOP(该层支持面向切面编程)

    5. Instrumentation(该层为使用Junit和TestNG进行测试提供支持)

    6. Test(该层为使用Junit和TestNG进行测试提供支持)

    7. 几个杂项模块:

      Messaging:该模块为STOMP提供支持。

      它还支持注解编程模型,该模型用于从WebSocket客户端路由和处理信息STOMP消息。

      Aspects:该模块与AspectJ的集成提供支持。

  6. 什么是Spring配置文件?

    Spring配置文件是XML文件。该文件主要包含类信息,它描述了这些类是如何配置以及相互引入的。但是,XML配置文件冗长且更加干净。如果没有正确规划编写,那么在大项目中管理变得非常困难。

  7. Spring应用程序有哪些不同组件?

    Spring应用一般有以下组件:

    • 接口:定义功能
    • Bean类:它包含属性,Setter和Getter方法,函数等。
    • Spring面向切片编程(AOP):提供面向切片编程的功能。
    • Bean配置文件:包含类的信息以及如何配置它们。
    • 用户程序:它使用接口。
  8. 使用Spring有哪些方式?

    • 作为成熟的Spring Web应用程序
    • 作为第三方Web框架,使用Spring Framework中间层。用于远程使用,作为企业级Java Bean,可以包装现有的POJO(Plain Old Java Objects)
  9. 什么是Spring IOC容器?

    Spring框架的核心是Spring容器。容器创建对象,将他们装配到一起,配置它们并管理它们的完整生命周期。Spring容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接受对象进行实例化,配置和组装的指令。该元素可以通过XML,Java注解或者Java代码提供。

  10. 什么是依赖注入?

    在依赖注入中,不必创建对象,但必须描述如何创建他们。不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由IOC容器将它们装配到一起。

  11. 可以用多少种方式完成依赖注入?

    通常,依赖注入可以通过三种方式完成,即:

    • 构造函数注入
    • setter注入
    • 接口注入

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

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

    构造函数注入 setter注入
    没有部分注入 有部分注入
    不会覆盖setter属性 会覆盖setter属性
    任意修改都会创建一个新实例 任意修改都不会创建一个新实例
    适用于设置很多属性 适用于设置少量属性
  13. Spring中有多少IOC容器?

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

    BeanFactory ApplicationContext
    它使用懒加载 他使用即时加载
    它使用语法显式提供资源对象 它自己创建和管理资源对象
    不支持国际化 支持国际化
    不支持基于依赖的注解 支持基于依赖的注解
  15. 列举IOC的一些好处:

    IOC的一些好处是:

    • 它将最小化应用程序中的代码量;
    • 他将使程序易于测试,因为它不需要单元测试用例中的任何单例或JNDI查找机制;
    • 它以最小的影响和最少的侵入机制促进松耦合;
    • 它支持即时的实例化和延迟加载服务。
  16. Spring IOC的实现机制

    Spring中的IOC实现原理就是工厂模式加反射机制。

  17. 什么是Spring Bean?

    • 它们是构成应用程序主干的对象;
    • Bean由Spring IOC容器管理;
    • 它们由Spring IOC容器实例化,配置,装配,管理;
    • Bean是基于用户提供给容器的配置元数据创建。
  18. 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();
        	}
        }
        
  19. 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 时,最后三个才可用。

  20. 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 属性),那么将调用它。

推荐阅读