Spring基础面试题合集

1、什么是 Spring 框架?

Spring框架是一个开源的Java平台,它最初由Rod Johnson创建,并在2003年首次公布。它的主要功能是简化Java开发,特别是企业级应用程序的开发。Spring框架的设计哲学是通过提供一系列模块化的组件,帮助开发者创建高性能、易测试、可重用的代码。现在,让我们更深入地了解Spring框架的核心部分和特性。

核心特性

依赖注入(DI):

这是Spring框架的核心特性之一,它通过控制反转(IoC)的方法来管理对象的创建和它们之间的依赖关系。

它允许对象定义它们依赖的组件(例如其他对象),而不是自己构造它们或查找服务定位器模式。

面向切面编程(AOP):

AOP允许开发者将某些功能分割出来进行模块化,如事务管理、日志记录等,这些功能可以横切多个类型和对象。

通过AOP,可以将这些横切关注点从对象的核心业务逻辑中分离出来,从而提高模块性。

模块化和分层架构:

Spring框架具有模块化结构,可以根据需要包含或排除具体的模块。

它支持分层架构,将不同的关注点(如数据访问、业务逻辑、表示层等)分离到不同的层次。

事务管理:

Spring提供了一致的事务管理接口,可以支持声明式或编程式的事务管理。

这降低了对特定数据库或JTA事务API的依赖。

MVC框架:

Spring Web MVC是一个基于模型-视图-控制器设计模式的富特性Web框架。

它轻松集成了其他Spring功能,如依赖注入,并提供了灵活的URL映射和视图解析。

2、Spring 框架中的七大核心模块有哪些,它们都是干什么的?

1、Spring Core:Spring 核心模块提供了 IOC(控制反转)和 DI(依赖注入)的支持,用于管理应用程序中的对象和依赖关系。

2、Spring AOP:Spring AOP 模块提供了 AOP(面向切面编程)的支持,用于解决应用程序中的横切关注点。

3、Spring Context:Spring 上下文模块是 Spring 核心模块的扩展,提供了 BeanFactory 的功能,并且还提供了许多企业级服务,例如 JNDI(Java 命名和目录接口)访问、EJB(企业 Java Bean)集成、远程访问和国际化等。

4、Spring JDBC:Spring JDBC 模块提供了 JDBC(Java 数据库连接)的支持,并且还提供了更高级别的抽象,使得开发者更容易地访问和操作数据库。

5、Spring ORM:Spring ORM 模块提供了对 ORM(对象关系映射)框架的支持,如 Mybatis、Hibernate、JPA(Java 持久化 API)等。

6、Spring Web:Spring Web 模块提供了构建 Web 应用程序所需的各种特性和工具,如 MVC(模型-视图-控制器)框架、RESTful Web 服务、WebSocket 和 Servlet 等。

7、Spring Test:Spring Test 模块提供了对单元测试和集成测试的支持,如 JUnit 和 TestNG 等。

3什么是AOP?描述5个AOP术语以及作用

Join Point: 连接点,程序执行过程中明确的点,如方法的调用或异常的抛出。

Advice: 通知,切面在特定连接点采取的动作。

Pointcut: 切点,匹配连接点的表达式。

Aspect: 切面,由通知和切点组成,它既包括横切逻辑也包括逻辑的执行点。

Weaving: 织入,把切面应用到目标对象并创建代理对象的过程。

4、Spring 中的依赖注入(DI)是什么,它的作用是什么?它有哪些常用的注入方式?

依赖注入(Dependency Injection,DI)是Spring框架的核心功能之一。它是一种设计模式,目的是为了减少组件之间的耦合度。通过DI,组件的依赖项不是由组件本身创建,而是由外部容器(在Spring中通常指的是Spring容器)在运行时注入。这样做的优点是可以提高组件的可测试性、可维护性和可扩展性。

作用

1. 松耦合

松耦合是DI的主要优点。组件不需要知道依赖的具体实现,只需要知道依赖的接口。这意味着,如果一个组件的依赖改变了实现方式,只要新的实现满足了接口的要求,该组件无需做任何修改。

2. 易于测试

DI使得在单元测试时可以轻松地替换组件使用的实际依赖为mock对象。

3. 易于维护

由于组件间的耦合度降低,系统的各个部分可以独立地发展,不会对其他部分产生影响,这使得维护和更新变得更简单。

4. 易于扩展

DI容器通常支持配置文件或注解,使得替换组件或添加新的依赖成为可能,这在不修改已有代码的情况下实现扩展。

常用的注入方式

在Spring中,有几种常见的依赖注入方式:

1. 构造器注入

通过类的构造器来注入依赖,这是推荐的注入方式,因为它可以保证所需的依赖不会是null,并且依赖项可以是不可变的。

@Component

public class MyService {

    private final Dependency dependency;

    @Autowired

    public MyService(Dependency dependency) {

        this.dependency = dependency;

    }

}

2. Setter注入

通过类的setter方法注入依赖,这种方式使得你的对象在构造后仍然可以改变其依赖。

@Component

public class MyService {

    private Dependency dependency;

    @Autowired

    public void setDependency(Dependency dependency) {

        this.dependency = dependency;

    }

}

3. 字段注入

直接在字段上注入依赖,虽然它简单方便,但通常不推荐使用,因为这种方式破坏了封装性,使得依赖项在类外部可被修改,并且这种方式不利于单元测试。

@Component

public class MyService {

    @Autowired

    private Dependency dependency;

}

4. 方法注入

这种方式较少使用,但在某些情况下可能会用到,比如当你需要在某个方法执行时才决定如何注入依赖。

@Component

public class MyService {

    private Dependency dependency;

    @Autowired

    public void prepare(Dependency dependency) {

        this.dependency = dependency;

    }

}

5.Spring 中的注解写出十个并描述它们的具体作用是什么?

Spring 中的注解有很多,以下是一些常用的注解和它们的作用:

1、@Autowired

@Autowired 注解用于自动装配,将匹配类型的 bean 自动连接到指定的字段、方法或构造函数上,从而简化了依赖注入的过程。

@Autowired和@Resource都是Spring中用于依赖注入的注解,它们的作用都是将一个bean注入到另一个bean中,

但两者有以下区别:

1.1、注入方式不同:

@Autowired是按照类型来自动装配的,它通过byType的方式实现自动装配,如果容器中有多个类型匹配的bean,那么会抛出异常。

@Resource默认按照名称来装配,它通过byName的方式实现自动装配,如果指定了name属性,那么会按照名称装配,如果没有指定name属性,那么会按照类型装配。

1.2、来源不同:

@Autowired是Spring提供的注解,而@Resource是JSR-250规范中定义的注解,因此@Autowired是Spring特有的注解,而@Resource是JavaEE的注解,它们的使用范围不同。

1.3、注入方式不同:

@Autowired只能注入其他bean类型的属性。

@Resource既可以注入其他bean类型的属性,也可以注入普通类型的属性。

1.4、属性不同:

@Autowired没有额外的属性。

@Resource有两个重要的属性,分别是name和type,其中name属性用于指定bean的名称,type属性用于指定bean的类型。

总的来说,@Autowired和@Resource都是用于实现依赖注入的注解,但使用方式和实现方式略有不同,开发者可以根据需要选择使用哪个注解。

2、@Qualifier

@Qualifier 注解与 @Autowired 注解配合使用,用于指定注入的 bean 的名称。当有多个同类型的 bean 时,可以使用该注解指定要注入的 bean 的名称。

3、@Component

@Component 注解用于将类标记为一个组件,告诉 Spring 要将其放入容器中管理。它是一个通用的注解,可以用于任何类,但通常用于服务层、数据访问层和控制器等组件类中。

4、@Controller

@Controller 注解用于标记一个类作为 Spring MVC 中的控制器,用于处理请求和响应。它通常与 @RequestMapping 注解一起使用,将请求映射到控制器处理方法。

5、@RequestMapping

@RequestMapping 注解用于将请求映射到控制器处理方法。它可以用于类级别和方法级别,用于指定请求的 URL 地址、请求方法、请求参数、请求头等信息。

6、@Service

@Service 注解用于标记一个类作为服务层的组件,通常用于封装业务逻辑的方法。

7、@Repository

@Repository 注解用于标记一个类作为数据访问层的组件,通常用于封装数据访问的方法。

8、@Configuration

@Configuration 注解用于标记一个类为 Spring 的配置类,用于定义 bean。它通常与 @Bean 注解一起使用,将方法返回的对象注册为一个 bean。

9、@Bean

@Bean 注解用于将方法返回的对象注册为一个 bean。它通常与 @Configuration 注解一起使用,用于定义 bean。

10、@Value

@Value 注解用于将属性值注入到一个 bean 中。它可以用于类级别和字段级别,用于指定属性的值。

11、@Scope

@Scope 注解用于指定 bean 的作用域。它可以用于类级别和方法级别,用于指定 bean 的生命周期、作用域和代理方式等信息。

12、@Transactional

@Transactional 注解用于标记一个方法或类为事务处理方法。它通常用于封装数据库操作的方法,保证数据库操作的原子性、一致性和隔离性。

这些注解可以帮助 Spring 容器自动完成依赖注入、bean 的创建和管理、请求的处理等工作,从而简化了应用程序的开发。

6、spring 事务实现方式有哪些?

编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用

beginTransaction()、 commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。

基于 TransactionProxyFactoryBean 的声明式事务管理

基于@Transactional 的声明式事务管理

基于 Aspectj AOP 配置事务

7、使用mybaits编写一对一(班级和老师)、一对多(班级和学生)的关联映射查询ResultMap?

<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">  

        <!-- 实体类的字段名和数据表的字段名映射 -->  

        <id property="id" column="c_id"/>  

        <result property="name" column="c_name"/>  

        <association property="teacher" javaType="com.lcb.user.Teacher">  

            <id property="id" column="t_id"/>  

            <result property="name" column="t_name"/>  

        </association>  

    </resultMap>  

<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">  

        <id property="id" column="c_id"/>  

        <result property="name" column="c_name"/>

        <collection property="student" ofType="com.lcb.user.Student">  

            <id property="id" column="s_id"/>  

            <result property="name" column="s_name"/>  

        </collection>  

    </resultMap>  

8、描述Spirng MVC的常用组件?

DispatcherServlet(前端控制器)

说明:Spring MVC 的入口函数,接收请求,响应结果,相当于转发器,中央处理器,它就相当于mvc模式中DispatcherServlet的存在降低了组件之间的耦合性。

HandlerMapping(处理器映射器)

说明:根据请求的url查找Handler(即处理器Controller),映射方式有配置文件方式,实现接口方式,注解方式等。

HandlerAdapter(处理器适配器)

说明:HandlerAdapter是适配器模式的应用,按照HandlerAdapter要求的规则去执行Handler。

Handler(处理器)

说明:Handler需要开发工程师按照HandlerAdapter的要求去做,是后端控制器,处理具体的业务逻辑。

View resolver(视图解析器)

说明:进行视图解析,首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

视图View

说明:View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf等)

9、什么是Spring MVC ?简单介绍下你对springMVC的理解?

一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层,是Spring框架的一个后续产品。通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

​ spring MVC是一种分层设计思想,目标是将复杂的应用系统按照分层处理进行设计和规划,通过这种设计方式达到分而治之的效果,从而降低程序开发的难度,提高代码的可维护性.**Spring MVC核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口。

什么是MVC

mvc是一种设计模式(设计模式就是日常开发中编写代码的一种好的方法和经验的总结)。模型(model)-视图(view)-控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据处理的分离。

mvc设计模式的好处

1.分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。

2.有利于系统的并行开发,提升开发效率。

10、SpringMVC的执行流程?

(1)用户发送请求至前端控制器DispatcherServlet;

(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;

(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;

(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;

(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);

(6)Handler执行完成返回ModelAndView;

(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;

(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;

(9)ViewResolver解析后返回具体View;

(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

(11)DispatcherServlet响应用户。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值