Spring的面试题

常见面试题

1. 什么是spring,spring由哪些功能组成?

spring是分层的JavaEE\SE应用轻量级开源框架,spring在mvc三层当中为各个层级提供了相应的解决方案,例如:针对所有层级都基于IOC与DI的思想;在表现层有springmvc,也可集成struts、struts2,在业务层中IOC与DI可派上用场;在持久层可使用spring提供的JDBCTemplate,也可集成使用Mybatis。
spring以IOC容器为核心 + AOP面向切面 + 与浏览器进行交互的web模块(提供springmvc、struts、jsps、pdf、转excel服务)+ 与数据库交互的jdbc与事务操作 + ORM对象关系映射模块 + JEE常用服务模块(例如消息、邮件、远程调用等服务)。

2. spring配置bean实例化有哪些方式?

有三种方式

  • 第一种是通过类中的无参构造来实现,在ioc容器中配置<bean>标签,实例化出的对象默认是单例模式,生命周期与ioc容器一致;当然也可配置成多例模式,多例模式下的bean会在被需要时才被实例化;<bean>中也可通过<propoty>来set属性值,调用属性的set方法。
  • 第二种通过类中的实例方法来实现,类中需要构造一个实例方法,返回该类的实例,可在<bean>
    中配置factory-method = "方法名称" factory-bean = "bean唯一标识",让spring调用该方法获取实例。
  • 第三种通过类中静态方法来实现,一样要在类中写一个静态方法返回该类实例,配置factory-method = "方法名称"来获取实例。

3. 你对Spring IOC和DI的理解,它们有什么区别?

简单来说IOC就是将指定的实例化对象都放入ioc容器中;DI就是在某一个需要另一个类的引用时,spring通过set注入、构造器注入或自动注入该类的引用;
之前写的理解IOC与DI的文章

4. 描述下什么是AOP和AOP的实现原理?

AOP是面向切面编程,譬如说要在指定的方法中加上相应日志信息,可以将要加上的日志功能视为切面,指定的方法视为切点,配置切面类,配置切面的相应方法,即可实现AOP。AOP底层思想是动态代理,spring判断当前的被代理类是否实现接口,如果实现某个接口则底层使用基于接口的动态代理,否则使用基于子类的动态代理。

5. 描述下SpringMVC的核心组件和处理流程

SpringMVC的五大核心组件:DispatcherServlet、handlerMapping、Conrtroller、ModelAndView、ViewResolver

–>第一核心组件DispatcherServlet,所有来自浏览器的请求都会进入该servlet,加载ioc容器与mvc配置文件,实例化必须的bean(例如请求映射器、控制器、视图解析器)
–> 再进入handlerMapping进行请求映射
–> 进入prehandle()拦截器
–> 进入控制器目标方法之前会实例化出modelandview对象等其他需要服务数据的类,将请求数据给予modelandview进而赋予给方法中的参数列表,进入目标方法,方法返回的数据与视图信息也会存入modelandview,数据进而存入request当中
–> 进入posthandle()
–> 视图信息给视图解析器,拼接前缀与后缀形成页面的url,返回给浏览器。

6. 描述下Spring常用注解和其作用(至少6个)

7. 描述下Mybatis中${}和#{}的区别?

#{}是以预编译的形式将参数设置到sql语句中
${}是直接取出参数值拼接在sql中,会引发sql注入问题

8. 什么是ORM?

9. 在Mapper中如何传递多个参数?

用集合封装参数
用注解@param("")指定参数名

10. DI有几种方式、分别是什么,你常用的是哪种方式?

三种方式

  • 第一种利用set方法将值或引用注入给bean中属性<bean>中加入<propoty>来注入value或是ref引用。
  • 第二中利用有参构造方式注入属性<bean>中配置<constructor-arg name="" value/ref = "">来注入,还可利用index与type属性来指定参数索引位置与参数数据类型。
  • 第三中就是用的最多的自动注入,用注解也行,在<bean>中配置autowire属性也行,autowire取值可以是byname、bytype、constructor,分别通过set、类型、构造器来自动注入。

11. 谈谈你对MVC的理解?

MVC三层由Controller控制层、View视图层、Model模型层组成,视图层是直接显示给用户看的,用户可以点击按钮获取结果数据,控制器层会接收用户的请求并返回相应的结果数据,模型层相当于JavaBean实体类,实体类封装了一个类特有的属性,可再不同类中进行使用,提高了代码的复用性.一个项目分了三层之后,每一层的代码都有自己特定的功能和逻辑,这样很好的降低了代码之间的耦合度,也提高了代码的扩展性,如果以后想修改某一层里的内容,其他层不一定需要修改,也提高了维护性

12. 简要说明SSM框架搭建步骤?

web xml中先行配置DispatcherServlet,init-param引入springmvc配置文件,配置监听引入spring配置文件,配置utf-8过滤器;当然springmvc配置与spring配置合在一个配置文件也行。
在springmvc中配置扫包,只扫controller包,配置视图解析器,不用@requestMapping的话加配handlerMapping,用注解就开启mvc注解驱动。
spring配置中一样扫包,除去controller包,配置数据源,配置mybatis的sqlsessionfactory、mapperScannerConfigurer;mybatis配置多的话分一个mybtis-config出来,sqlsessionfactory中引入该配置文件。

Spring基础概念

不同版本的 Spring Framework 有哪些主要功能?

版本特点
Spring 2.5发布于 2007 年。这是第一个支持注解的版本。
Spring 3.0发布于 2009 年。它完全利用了 Java5 中的改进,并为 JEE6 提供了支持。
Spring 4.0发布于 2013 年。这是第一个完全支持 JAVA8 的版本。

什么是 Spring Framework?
Spring 是一个开源框架,其存在就是为了降低开发 J2EE 企业级应用的难度,其具有轻量松耦合具有分层体系集成很多其他框架等特点,分层体系可以让开发者任意选择组件或重写一个组件,高集成性例如可以集成 MyBatis、Structs、JEE服务框架等。

Spring Framework 有哪些不同的功能?
IOC - 控制反转
DI - 依赖注入
AOP - 面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚、高扩展性
容器 - Spring 负责创建和管理对象(Bean)的生命周期和配置
MVC - 对 web 应用提供了高度可配置性,其他框架的集成也十分方便
事务管理 - 提供了用于事务管理的通用抽象层,Spring 的事务支持也可用于容器较少的环境
JDBC 异常 - Spring 的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略

Spring Framework 中有多少个模块,它们分别是什么?
在这里插入图片描述
Spring 核心容器

  • Core 模块:包含框架基本的核心工具类。是其他组件的基本核心。
  • Beans 模块:包含访问配置文件、创建和管理 bean 以及进行 IOC/DI 操作相关的类。
  • Context模块:构建于Core和Bean模块基础之上,提供了一种类似JNDI注册器的框架式对象访问方法。ApplicationContext接口是Context模块的关键。
  • SpEL:提供了一种操作对象的表达式语言。

数据访问模块
JDBC(Java DataBase Connectivity)Java数据库连接对象
ORM(Object Relational Mapping)对象关系映射
OXM(Object XML Mappers)对象 XML 映射
JMS(Java Messaging Service)Java消息服务
Transaction 事务

Web 模块
Web
Servlet
WebSocket
Portlet

AOP - 该层支持面向切面编程
Aspects - 该模块为与 AspectJ 的集成提供支持。
Instrumentation - 该层为类检测和类加载器实现提供支持。
Messaging - 该模块为 STOMP 提供支持。它还支持注解编程模型,该模型用于从WebSocket 客户端路由和处理 STOMP 消息
Test - 该层为使用 JUnit 和 TestNG 进行测试提供支持。

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

依赖注入(Dependency Injection)

什么是依赖注入
在依赖注入中,不必主动创建对象,但必须描述如何创建它们(例如声明一个数据库连接对象但不赋值)。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些 bean 对象需要哪些 bean 对象的引用。由 IOC 容器将它们装配在一起。

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

构造函数注入setter 注入
不会覆盖类中属性会覆盖类中属性
任意修改都会创建一个新实例任意修改不会创建一个新实例
适用于设置很多属性适用于设置少量属性

Spring 中有多少种 IOC 容器?

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

区分 BeanFactory 和 ApplicationContext

BeanFactoryApplicationContext
它使用懒加载它使用即时加载
它使用语法显式提供资源对象它自己创建和管理资源对象
不支持国际化支持国际化
不支持基于依赖的注解支持基于依赖的注解

列举 IOC 的一些好处

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

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

interface Fruit {
     public abstract void eat();
}

class Apple implements Fruit {
    public void eat(){
        System.out.println("Apple");
    }
}

class Orange implements Fruit {
    public void eat(){
        System.out.println("Orange");
    }
}

class Factory {
    public static Fruit getInstance(String ClassName) {
        Fruit f=null;
        try {
            f=(Fruit)Class.forName(ClassName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}

class Client {
    public static void main(String[] a) {
        Fruit f=Factory.getInstance("Apple");
        if(f!=null){
            f.eat();
        }
    }
}

Beans

什么是 spring bean?
它们是构成应用程序的对象。
Bean 由 Spring IOC 容器管理。
它们由 Spring IOC 容器实例化,配置,装配和管理。
Bean 是基于用户提供给容器的配置元数据创建。

Spring 提供了哪些配置 bean 的方式?

  • 在 XML 格式的配置文件中指定,以 bean 标签开头。
  • 基于注解配置,您可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它。例如:
<beans>
	<context:annotation-config/>
</beans>
  • 基于 Java API 配置,可通过使用 @Bean 和 @Configuration 来实现。@Bean 可作用于方法上,表示该方法返回值对象会注册到 IOC 容器中,@Configuration 作用于类上,表示该类是配置类,也会注册进 IOC 容器。例如:
@Configuration
public class StudentConfig {
    @Bean
    public StudentBean myStudent() {
        return new StudentBean();
    }
}

spring 支持几种 bean 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 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web 会自动当成 Session 类型来使用。

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 属性),那么将调用它。
    最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法。
  7. 如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
  8. 如果为 bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。

什么是 Spring 的内部 bean?
只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在或 中提供了元素的使用。内部 bean 总是匿名的,它们总是作为原型。

什么是 Spring 装配?
将一个 bean 的引用赋予给另一个 bean 中的属性时,称为装配或 bean 装配。

自动装配有哪些方式?

  • no - 默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。
  • byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。
  • byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。
  • 构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。
  • autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过 byType 自动装配。

注解

你用过哪些重要的 Spring 注解?
@Controller - 用于 Spring MVC 项目中的控制器类。
@Service - 用于服务类。
@Repository - 用于持久化层
@RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。
@ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。
@RequestBody、@RequestParam - 获取请求参数
@RequestHeader、@CookieValue - 获取请求头参数、cookie 中参数
@ModelAttribute
@SessionAttribute - 将数据存入 seesion 当中
@PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。
@Autowired - 用于在 spring bean 中自动装配依赖项。
@Qualifier - 使用 @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。
@Scope - 用于配置 Spring bean 的范围。
@Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。
@Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。

@Component, @Controller, @Repository, @Service 有何区别?

  • @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。Spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
  • @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IOC 容器中。
  • @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。
  • @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IOC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

@Required 注解有什么用?
@Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置 bean 时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。如果尚未填充受影响的 bean 属性,则容器将抛出 BeanInitializationException。

public class Employee {
    private String name;
    
    @Required
    public void setName(String name){
        this.name=name;
    }
}

@Autowired 注解有什么用?
@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配 bean。默认情况下,它是类型驱动的注入。

@Qualifier 注解有什么用?
当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。@Qualifier 可通过指定 bean 的 id 来注入。

@RequestMapping 注解有什么用?
@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注解可应用于两个级别:
类级别:映射请求的 URL
方法级别:映射 URL 以及 HTTP 请求方法

数据访问

Spring DAO 有什么用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。

列举 Spring DAO 抛出的异常
在这里插入图片描述
Spring JDBC API 中存在哪些类?

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

Spring 支持哪些 ORM 框架
Hibernate
iBatis
JPA
JDO
OJB

AOP

什么是 AOP?
AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角。在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect (切面)。

AOP 中的 Aspect、Advice、Pointcut、JointPoint 参数分别是什么?
在这里插入图片描述

  • Aspect (切面)是一个放切面方法的类,例如事务管理、打印日志等方法。切面类可以在配置文件中配置,或者使用 @Aspect 注解将类声明为切面类。
  • Advice (通知)是为被代理方法服务的方法。
  • JoinPoint (连接点)业务中的所有方法。所有的切点都是连接点,但连接点不一定是切点。(业务中所有方法都是连接点,都可被代理,但不是所有方法都需要被代理,需要被代理的方法才叫切点)
  • Pointcut (切点)可以通过 expression 来指定被代理的方法,被代理的方法就是切点。
  • Advice Arguments - 我们可以在 advice 方法中传递参数。我们可以在切点中使用 args() 表达式来应用于与参数模式匹配的任何方法。如果我们使用它,那么我们需要在确定参数类型的 advice 方法中使用相同的名称。

有哪些类型的通知(Advice)?

  • Before(前置通知) - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置。
  • After Returning(后置通知)这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解标记进行配置。
  • After Throwing(异常通知)这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行。
  • After(最终通知)这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。
  • Around(环绕通知)这些类型的 Advice 在连接点之前和之后执行,并使用 @Around 注解标记进行配置。

AOP 有哪些实现方式?

  • 静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;
  • 编译时编织(特殊编译器实现)
  • 类加载时编织(特殊的类加载器实现)。
  • 动态代理 - 在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
  • JDK 动态代理
  • CGLIB

MVC

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

描述一下 DispatcherServlet 的工作流程
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值