【23】进大厂必须掌握的面试题-50个spring面试

2021-04-07 10:52:07 浏览数 (1)

一般问题–Spring面试问题

1.不同版本的Spring Framework的主要功能是什么?

商标

特征

Spring2.5

该版本于2007年发布。它是第一个支持注释的版本。

Spring3.0

该版本于2009年发布。它 充分利用了Java5中的改进功能, 并为JEE6提供了支持。

Spring4.0

该版本于2013年发布。这是第一个为Java 8提供全面支持的版本。

Spring5.0

该版本于2017年发布。支持JDK 9和Java EE 8 API版本。

2. 什么是Spring框架?

  • Spring是一个功能强大的开源应用程序框架,旨在降低企业应用程序开发的复杂性。
  • 它重量轻且耦合松散。
  • 它具有分层的体系结构,使您可以选择要使用的组件,同时还为J2EE应用程序开发提供了一个紧密的框架。
  • Spring框架也称为基础框架,因为它为其他各种框架(如Struts,Hibernate,Tapestry,EJB,JSF等)提供支持。

3.列出Spring框架的优点。

  • 由于采用了Spring Frameworks分层体系结构,因此您可以使用所需的内容,而无需使用任何内容。
  • Spring Framework启用POJO(普通Java对象)编程,从而实现连续集成和可测试性。
  • 由于依赖注入和控制反转,JDBC得到了简化。
  • 它是开源的,没有供应商限制。

4. Spring Framework有哪些不同的功能?

  • 轻量级:在尺寸和透明度方面,Spring是轻量级的。
  • 控制反转(IOC): 对象提供其依赖关系,而不是创建或查找依赖对象。这称为控制反转。
  • 面向方面的编程(AOP): Spring中的面向方面的编程通过将应用程序业务逻辑与系统服务分开来支持内聚开发。
  • 容器: Spring Framework创建并管理应用程序对象的生命周期和配置。
  • MVC框架: Spring框架的MVC Web应用程序框架是高度可配置的。其他框架也可以代替Spring MVC框架轻松使用。
  • 事务管理: Spring框架提供了用于事务管理的通用抽象层。Spring的事务支持还可以在无容器的环境中使用。
  • JDBC异常处理: Spring的JDBC抽象层提供了一个异常层次结构,从而简化了错误处理策略。

5. Spring框架中有多少个模块,它们是什么?

大约有20个模块,它们被概括为核心容器,数据访问/集成,Web,AOP(面向方面的编程),检测和测试。

  • Spring核心容器–该层基本上是Spring框架的核心。它包含以下模块:
  • Spring Core
  • Spring Bean
  • SpEL(Spring表达语言)
  • Spring Context
  • 数据访问/集成-此层 提供与数据库交互的支持。它包含以下模块:
  • JDBC(Java数据库连接)
  • ORM(对象关系映射)
  • OXM(对象XML映射器)
  • JMS(Java消息服务)
  • Transaction(spring 事务)
  • Web – 此层提供创建Web应用程序的支持。 它包含以下模块:
  • Web
  • Web – MVC
  • Web – Socket
  • Web – Portlet
  • 面向方面的编程(AOP)–在这一层中, 您可以使用建议,切入点等来分离代码。
  • 工具- 该层 为类工具和类加载器实现提供支持。
  • 测试- 牛逼了层提供使用JUnit和TestNG测试支持。

下面给出了很少的其他模块:

  • Messaging–** 此 模块提供对STOMP的支持。它还支持注释编程模型,该模型用于路由和处理来自WebSocket客户端的STOMP消息。
  • Aspects–** 此模块提供与AspectJ集成的支持。

6.什么是Spring配置文件?

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

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

Spring应用程序通常由以下组件组成:

  • 接口:定义功能。
  • Bean类:它包含属性,其setter和getter方法,函数等。
  • Spring面向方面的编程(AOP):提供横切关注点的功能。
  • Bean配置文件:包含类的信息以及如何配置它们。
  • 用户程序:使用该功能。

8.使用Spring Framework的方式有哪些?

  1. 作为成熟的Spring Web应用程序。
  2. 作为第三方Web框架,使用Spring Frameworks中间层。
  3. 供远程使用。
  4. 作为Enterprise Java Bean,可以包装现有的POJO(普通的旧Java对象)。

依赖注入/ IoC容器 –Spring面试问题

9.什么是Spring IOC容器?

Spring容器位于Spring框架的核心。容器 c处理对象,将它们连接在一起,对其进行配置并管理其整个生命周期。Spring容器利用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收要实例化,配置和组装对象的指令。可以通过XML,Java批注或Java代码提供此元数据。

10.依赖注入是什么意思?

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

11.可以采用多少种方式进行依赖注入?

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

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

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

构造函数注入与二传手注入

构造函数注入

setter注射

没有部分注入。

可以进行部分注射。

它不会覆盖setter属性。

它覆盖了 构造函数属性。

如果进行了任何修改,它将创建一个新实例。

如果进行了任何修改,它将不会创建新实例。

它对许多 财产而言效果更好。

它对少数属性效果更好。

13.Spring有多少种IOC容器?

  1. BeanFactory:BeanFactory就像一个工厂类,其中包含一系列bean。每当客户要求时,它都会实例化bean。
  2. ApplicationContext:ApplicationContext接口建立在BeanFactory接口的顶部。它 在 BeanFactory的顶部提供了一些额外的功能。

14.区分BeanFactory和ApplicationContext。

BeanFactory与ApplicationContext

BeanFactory

ApplicationContext

它是在org.springframework.beans.factory中定义的接口。BeanFactory

它是在org.springframework.context中定义的接口。ApplicationContext

它使用延迟初始化

它使用急切/积极的初始化

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

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

它不支持国际化

支持国际化

它不支持基于注释的依赖

它支持基于注释的依赖

15.列出IoC的一些好处。

  • 它将最大限度地减少应用程序中的代码量。
  • 这将使您的应用程序易于测试,因为在单元测试用例中不需要任何单例或JNDI查找机制。
  • 它以最小的努力和最少的干扰机制促进了松耦合。
  • 它支持急切的实例化和服务的延迟加载。

Spring Beans–Spring面试问题

16.什么是Beans?

  • 可以控制它的属性、事件和方法是否暴露给其他程序。
  • Bean由Spring IoC容器管理。
  • 它们由Spring IoC容器实例化,配置,连接和管理
  • 使用用户提供给容器的配置元数据创建Bean。

17.如何将配置元数据提供给Spring容器?

可以通过以下方式将配置元数据提供给Spring容器:

  • 基于XML的配置: 在Spring Framework中,bean所需的依赖关系和服务在XML格式的配置文件中指定。这些配置文件通常包含许多Bean定义和特定于应用程序的配置选项。它们通常以bean标签开始。 例如:
代码语言:javascript复制
<bean id="studentbean" class="com.mushsoft.firstSpring.StudentBean">
 <property name="name" value="欢迎关注Java架构师社区公众号"></property>
</bean>
  • 基于注释的配置:可以使用相关类,方法或字段声明上的注释,而不是使用XML来描述bean的连接,而是可以将bean配置为组件类本身。默认情况下,Spring容器中未打开注释接线。因此,在使用它之前,需要在Spring配置文件中启用它。例如:
代码语言:javascript复制
<beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans>
  • 基于Java的配置: Spring Framework的新Java配置支持中的关键功能是@Configuration注释类和@Bean注释方法。
  • @Bean注释与元素具有相同的作用。
  • @ Configuration类允许通过简单地调用同一类中的其他@Bean方法来定义Bean间的依赖关系。

例如:

代码语言:javascript复制
@Configuration
public class StudentConfig { 
    @Bean
    public StudentBean myStudent() { 
        return new StudentBean(); 
    }
}

18. Spring支持多少个bean作用域?

Spring框架支持五个范围。他们是:

  • Singleton:为每个Spring IoC容器单个实例提供Bean定义的范围。
  • Prototype: 这为单个bean定义提供了具有任意数量的对象实例的范围。
  • Request: 这为HTTP请求的bean定义提供了范围。
  • Session: 这为HTTP会话的bean定义提供了范围。
  • Global-session: 这为全局HTTP会话提供了bean定义的范围。

19. Spring Bean Factory Container中的Bean生命周期是什么?

  1. Spring容器从XML文件中的bean定义实例化bean。
  2. Spring使用Bean定义中指定的依赖项注入来填充所有属性。
  3. 如果bean实现BeanNameAware接口,则工厂通过传递bean的ID来调用setBeanName()。
  4. 如果bean实现BeanFactoryAware接口,则工厂通过传递其自身的实例来调用setBeanFactory()。
  5. 如果有任何与Bean关联的BeanPostProcessor,则调用preProcessBeforeInitialization()方法。
  6. 如果为bean指定了初始化方法,那么它将被调用。
  7. 最后,如果有任何与Bean关联的BeanPostProcessor,将调用postProcessAfterInitialization()方法。

为了更好地理解它,请查看下图:

20.在Spring解释内部类对象。

只有当一个bean用作另一个bean的属性时,才能将其声明为内部bean。为了定义bean,Spring的基于XML的配置元数据在或内部提供了元素的使用。内部bean始终是匿名的,并且始终以原型为范围。例如,假设我们有一个Student类引用Person类。在这里,我们将只创建一个Person类实例,并在Student中使用它。

这是一个Student类,后跟bean配置文件:

Student.java

代码语言:javascript复制
public class Student{
    private Person person;
        //Setters and Getters
    }
    public class Person{
        private String name;
        private String address;
        //Setters and Getters
    }
}

studentbean.xml

代码语言:javascript复制
<bean id="StudentBean" class="com.mushsoft.Student">
    <property name="person">
        <!--This is inner bean -->
        <bean class="com.mushsoft.Person">
            <property name="name" value="请关注"></property>
            <property name="address" value="Java架构师社区"></property>
        </bean>
    </property>
</bean>

21.定义Bean接线。

当在Spring容器中将bean组合在一起时,称为接线或bean接线。Spring容器需要知道需要哪些bean,以及在对bean进行接线时,容器应如何使用依赖注入将bean绑在一起。

22.通过自动装配并命名不同的模式,您了解什么?

Spring容器能够自动装配协作bean之间的关系。也就是说,可以通过检查BeanFactory的内容来让Spring自动为您的bean解析协作者。 Bean自动装配的不同模式是:

  1. 默认设置: 这是默认设置,表示没有自动装配。应使用显式bean参考进行接线。
  2. byName: 根据bean的名称注入对象依赖。它将其属性与XML文件中由相同名称定义的bean进行匹配和关联。
  3. byType:根据类型注入对象依赖项。如果它的类型与XML文件中的bean名称之一完全匹配,则它匹配并连接属性。
  4. 构造函数:通过调用类的构造函数来注入依赖项。它 具有大量参数。
  5. autowire:首先,容器尝试通过构造函数使用autowire进行连线,如果不能,则尝试通过byType自动进行连线

23.自动装配有哪些限制?

以下是自动装配可能会遇到的一些限制:

  • 覆盖的可能性: 您始终可以使用和设置指定依赖项,这些设置将覆盖自动装配。
  • 基本数据类型:不能自动装配简单属性,例如基本属性,字符串和类。
  • 令人困惑的性质:始终喜欢使用显式接线,因为自动装配不太精确。

Spring Annotations–Spring面试题

24.您对基于注释的容器配置的含义是什么?

通过使用相关类,方法或字段声明上的注释,开发人员无需使用XML来描述bean的连接,而是将配置移入组件类本身。 它可以替代XML设置。 例如:

代码语言:javascript复制
@Configuration
public class AnnotationConfig{
    @Bean
    public MyDemo myDemo(){ 
        return new MyDemoImpll(); 
    }
}

25.如何在Spring中打开注解?

默认情况下,Spring容器中的注解。因此,要使用注解, 我们必须通过配置< context:annotation-config /> 元素在Spring配置文件中启用它 。 例如:

代码语言:javascript复制
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:context="http://www.springframework.org/schema/context">
<context:annotation-config/>
<beans &hellip;&hellip;&hellip;&hellip; />
</beans>

26. Spring中的@ Component,@ Controller,@ Repository和@Service批注有什么区别?

@Component: 这将Java类标记为Bean。它是任何Spring管理的组件的通用构造型。spring的组件扫描机制现在可以拾取它并将其拉入应用程序上下文。

@Controller:这将一个类标记为Spring Web MVC控制器。标有它的Bean将自动导入到Dependency Injection容器中。

@Service:此批注是组件批注的特化。它不提供@Component注释以外的任何其他行为。您可以 在服务层类中使用@Service而不是@Component ,因为它可以更好地指定意图。

@Repository: 此注释是@Component注释的特化,具有相似的用途和功能。它为DAO提供了额外的好处。它将DAO导入DI容器, 并使未经检查的异常有资格转换为Spring DataAccessException。

27.您对@Required注释了解什么?

@Required应用于bean属性设置器方法。该注释仅表明必须在配置时借助bean定义中的显式属性值或自动装配来填充受影响的bean属性。如果尚未填充受影响的bean属性,则容器将抛出BeanInitializationException。

例如:

代码语言:javascript复制
public class Employee{
    private String name;

    @Required
    public void setName(String name){
        this.name=name; 
    }
    public string getName(){ 
        return name; 
    }
}

28.您对@Autowired注解有什么了解?

@Autowired 注解提供了在哪里以及如何自动装配应做更精确的控制。该批注用于将setter方法,构造函数,一个或多个具有任意名称或多个参数的方法自动连接到bean。默认情况下,它是类型驱动的注入。

例如:

代码语言:javascript复制
public class Employee{
    private String name;

    @Autowired
    public void setName(String name){
        this.name=name; 
    }
    public string getName(){ 
        return name; 
    }
}

29.您对@Qualifier注释了解多少?

当您创建多个相同类型的bean,并且只想连接其中一个带有属性的bean时,可以使用 @Qualifier 注释和 @ Autowired 通过指定应该连接的确切bean来消除歧义。

例如,这里我们有两个类,分别是Employee和EmpAccount。在EmpAccount中,使用@Qualifier指定必须连接ID为emp1的bean。

Employee.java

代码语言:javascript复制
public class Employee{

    private String name;

    @Autowired
    public void setName(String name){ 
        this.name=name; 
    }
    public string getName(){ 
        return name; 
    }
}

EmpAccount.java

代码语言:javascript复制
public class EmpAccount{
    private Employee emp;

    @Autowired
    @Qualifier(emp1)
    public void showName(){
        System.out.println("Employee name : " emp.getName);
    }
}

30.您对@RequestMapping注释了解多少?

@RequestMapping批注用于将特定的HTTP请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可以在两个级别上应用:

  • 类级别:映射请求的URL
  • 方法级别:映射URL以及HTTP请求方法

数据访问 –Spring面试问题

31.描述Spring DAO支持吗?

Spring中的数据访问对象(DAO)支持使以一致的方式轻松使用JDBC,Hibernate或JDO等数据访问技术。这使人们可以轻松地在持久性技术之间切换。它还使您无需担心捕获每种技术特有的异常即可进行编码。

32.命名Spring DAO类抛出的异常。

1)CleanupFailureDataAccessException 一项操作成功地执行,但在释放数据库资源时发生异常(例如,关闭一个Connection) 2)DataAccessResourceFailureException 数据访问资源彻底失败,例如不能连接数据库 3)DataIntegrityViolationException Insert或Update数据时违反了完整性,例如违反了惟一性限制 4)DataRetrievalFailureException 某些数据不能被检测到,例如不能通过关键字找到一条记录 5)DeadlockLoserDataAccessException 当前的操作因为死锁而失败 6)IncorrectUpdateSemanticsDataAccessException Update时发生某些没有预料到的情况,例如更改超过预期的记录数。当这个异常被抛出时,执行着的事务不会被回滚 7)InvalidDataAccessApiUsageException 一个数据访问的JAVA API没有正确使用,例如必须在执行前编译好的查询编译失败了 8)InvalidDataAccessResourceUsageException 错误使用数据访问资源,例如用错误的SQL语法访问关系型数据库 9)OptimisticLockingFailureException 乐观锁的失败。这将由ORM工具或用户的DAO实现抛出 10)TypemismatchDataAccessException Java类型和数据类型不匹配,例如试图把String类型插入到数据库的数值型字段中 11)UncategorizedDataAccessException 有错误发生,但无法归类到某一更为具体的异常中

33. spring JDBC API中存在哪些类?

JDBC API中存在的类如下:

  1. Jdbc模板
  2. SimpleJdbcTemplate
  3. NamedParameterJdbcTemplate
  4. SimpleJdbcInsert
  5. SimpleJdbcCall

34.使用Spring可以通过什么方式访问Hibernate?

  1. 使用休眠模板和回调进行控制反转
  2. 扩展HibernateDAOSupport并应用AOP拦截器节点

35.命名Spring支持的事务管理的类型。

Spring支持两种类型的事务管理。他们是:

  1. 程序化事务管理:在这种情况下,借助编程来管理交易。它为您提供了极大的灵活性,但是很难维护。
  2. 声明式事务管理:在此,事务管理与业务代码分开。仅注释或基于XML的配置用于管理事务。

36. Spring支持哪些不同的ORM?

面向方面的编程(AOP) –Spring面试问题

37.描述AOP。

面向方面的编程或AOP是一种编程技术,它使程序员可以模块化横切关注点或行为,从而跨越典型的职责划分。横切关注点的示例可以是日志记录和事务管理。AOP的核心是一个切面。它将可能影响多个类的行为封装到可重用的模块中。

38. Aspect是什么意思?

Aspect是跨多个对象的关注模块化。事务管理是J2EE应用程序中横切关注的一个很好的例子。方面是使用常规类或在Spring Framework中使用@Aspect批注注释的常规类实现的。

39.解释JoinPoint。

程序执行期间的一个点称为JoinPoint,例如方法的执行或异常的处理。 在Spring AOP中,连接点始终代表方法的执行。

40.什么是Advice?

一个方面在特定联接点上 采取的操作称为建议。Spring AOP使用建议作为拦截器,在“连接点”周围维护一系列拦截器。

41.有哪些不同类型的Advices?

Spring AOP中的不同类型的建议是:

  1. Before: 这些类型的建议在连接点方法之前执行,并使用@Before 注释标记进行配置 。
  2. After returning: 这些类型的建议在joinpoint方法正常完成执行后执行,并使用@AfterReturning注释标记进行配置。
  3. After throwing: 仅当joinpoint方法因抛出异常而退出并且使用@AfterThrowing注释标记进行配置时,才执行这些类型的建议。
  4. After (finally):这些类型的建议在连接点方法之后执行,无论该方法的退出是正常返回还是异常返回,都使用@After注释标记进行配置。
  5. Around: 这些类型的建议的之前和之后执行 连接点一个次使用@Around注释标记被配置。

42.指出SpringAOP中关注点和跨领域关注点之间的区别吗?

问题是我们希望在应用程序的特定模块中具有的行为。可以将其定义为我们要实现的功能。

跨领域关注点是适用于整个应用程序的关注点。这会影响整个应用程序。例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要考虑的问题,因此它们是跨领域的问题。

43. AOP的实现有哪些不同?

下图描述了不同的AOP实现:

44. Spring AOP和AspectJ AOP有什么区别?

Spring AOP与AspectJ AOP

SpringAOP

AspectJ AOP

通过代理进行运行时编织

通过AspectJ Java工具完成编译时的编织

它仅支持方法级别PointCut

它支持字段级切入点

它是基于DTD的

它基于架构和注释配置

45.在Spring Framework中,代理是什么意思?

将建议应用于目标对象后创建的对象称为代理。对于客户端对象,目标对象和代理对象相同。

46.在Spring, Weaving是什么?

将方面与其他应用程序类型或对象链接以创建建议对象的过程称为Weaving。在Spring AOP中,编织是在运行时执行的。请参考下图:

MVC(模型-视图-控制器) –Spring面试问题

47. Spring MVC框架是什么意思?

Spring Web MVC框架提供了模型-视图-控制器体系结构,并准备使用可用于开发灵活且松散耦合的Web应用程序的组件。MVC模式有助于分离应用程序的不同方面,例如输入逻辑,业务逻辑和UI逻辑,同时在所有这些元素之间提供松散的耦合。

48.描述DispatcherServlet。

DispatcherServlet是Spring Web MVC框架的核心。它处理所有HTTP请求和响应。DispatcherServlet从配置文件接收处理程序映射的条目,并将请求转发给控制器。控制器然后返回模型和视图的对象。DispatcherServlet检查配置文件中的视图解析器条目,并调用指定的视图组件。

49.解释WebApplicationContext。

WebApplicationContext是纯ApplicationContext的扩展。它具有Web应用程序必需的一些额外功能。它在解析主题和确定与哪个Servlet关联的能力方面与普通的ApplicationContext不同。

50.在Spring MVC框架中,控制器是什么?

控制器提供对应用程序行为的访问。这些行为通常是通过服务接口定义的。控制器解释用户输入并将其转换为模型,该模型由视图表示给用户。在Spring中,控制器以非常抽象的方式实现。它还使您能够创建各种各样的控制器。

0 人点赞