栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

Spring/Springboot面试问题整理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring/Springboot面试问题整理

一、Spring基础 1. 什么是Spring框架

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。

一般说的 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring 支持 IoC(Inverse of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。


2. Spring的优点
  • Spring 属于低侵入式设计,代码的污染极低

  • Spring 的 DI 机制将对象之间的依赖关系交由框架处理,减低组件的耦合性

  • Spring 提供了 AOP 技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用

  • Spring 对于主流的应用框架提供了集成支持


3. Spring,Spring MVC,Spring Boot 之间什么关系?

Spring 包含了多个功能模块(上面刚刚提高过),其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块。

Spring MVC 是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

使用 Spring 进行开发各种配置过于麻烦比如开启某些 Spring 特性时,需要用 XML 或 Java 进行显式配置。于是,Spring Boot 诞生了!

Spring Boot 只是简化了配置,如果你需要构建 MVC 架构的 Web 程序,你还是需要使用 Spring MVC 作为 MVC 框架,只是说 Spring Boot 帮你简化了 Spring MVC 的很多配置,真正做到开箱即用!

4. Spring 框架中用到了哪些设计模式
  • 工厂设计模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
  • 。。。。

5. 介绍一下 BeanFactory 和 ApplicationContext

BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当做 Spring 的容器。其中 ApplicationContext 是 BeanFactory 的子接口。

BeanFactory 是 Spring 里面最底层的接口,包含了各种 bean 的定义,读取 bean 配置文档,管理 bean 的加载、实例化,控制 bean 的生命周期,维护 bean 之间的依赖关系。

ApplicationContext 接口作为 BeanFactory 的派生,除了提供 BeanFactory 所具有的功能外,还提供了更完整的框架功能,例如支持国际化,提供统一的资源文件访问方式,提供在监听器中注册 bean 的事件,允许同时加载多个配置文件,载入多个(有继承关系)上下文(使得每一个上下文都专注于一个特定的层次,比如应用的 web 层)等等。


二、Spring IOC 1. 谈谈对Spring IOC的理解

IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理,这种设计的好处在于降低了程序里面对象和对象之间的耦合性,使得程序的整个体系结构更加灵活。

最直观的表达就是,IOC 让对象的创建不用去 new 了,可以由 Spring 自动生产,使用 java 的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。

在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。


2. 对DI的理解

DI(Dependency Injection),即依赖注入,和控制反转是同一个概念的不同角度的描述,即应用程序在运行时依赖 IoC 容器来动态注入对象需要的外部资源。

控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。 于是,取名叫做“依赖注入(Dependency Injection)

所谓依赖注入,就是由IOC容器在运行期间,如果bean之间存在依赖关系,那么IOC容器需要自动取实现依赖对象的属性注入,主要有两种注入方式:1)xml注入;2)注解注入。

给属性赋值可以使用

  • 1)xml配置文件中的标签和属性 ;

    优点:代码和bean的声明赋值是完全分离的,配置文件独立于代码之外,如果要调整,只改配置文件就可以。

    缺点:大型项目的情况下,配置较多,效率比较低,难以管理。

  • 2)使用注解。

    优点:使用方便,简单快捷效率高

    缺点:注解和代码放在一起,任何改动都会引起源代码重新编译,结构上比较乱。

基于XML的DI分类:

1 set注入,也叫做设值注入 ;

2 构造注入。

基于注解的DI:

@Component 普通java对象

@Respository Dao对象,持久层对象, 表示对象能访问数据库。

@Service service对象, 业务层对象, 处理业务逻辑,具有事务能力

@Controller 控制器对象, 接收请求,显示请求的处理结果。 视图层对象

@Value //简单类型属性赋值

@Autowired @Qualifier @Resource // 引用类型赋值

解耦:这种设计的好处在于降低了程序里面对象与对象之间的耦合性,使得程序的整个体系结构变得更加灵活。


3. 什么是Spring Bean

简单来说,Bean 代指的就是那些被 IoC 容器所管理的对象。

Bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。

我们需要告诉 IoC 容器帮助我们管理哪些对象,这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。


4. Bean的声明方式
  • XML文件声明,比如xml文件中的bean的标签
  • 注解声明
声明类的Bean注解
  • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
  • @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

5. @Component 和 @Bean 的区别
  • @Component 和 @Bean 是两种使用注解来定义bean的方式。
  • @Component用于自动检测和使用类路径扫描自动配置bean。注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。
  • @Bean 需要在配置类中使用,即类上需要加上@Configuration注解
  • 两者都可以通过@Autowired装配
  • @Bean注解比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候,就只能通过@Bean注解来实现。
6. @Autowired 和 @Resource 的区别

两者都是表示注入Bean的注解,主要区别:

  1. @Autowired 是Spring提供的,@Resource 是Java提供的。

  2. @Autowired 默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它 required 属性为 false)如果想使用名称装配可以结合@Qualifier注解进行使用;

  3. @Resource 默认是按照名称来装配注入的,只有当找不到与名称匹配的 bean 才会按照类型来装配注入。@Resource(name=“beanName”)但是如果name属性一旦指定,就只会按照名称进行装配。

7. Bean 的作用域
  1. singleton:默认,每个容器中只有一个 bean 的实例,单例的模式由 BeanFactory 自身来维护

  2. prototype:为每一个 bean 请求提供一个实例

  3. request:为每一个网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回收

  4. session:与 request 范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean 会随之失效

  5. global-session:全局作用域


三、Spring AOP 1. 对AOP的理解

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

AOP,它是作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为切面(Aspect)。

AOP 减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。

AOP 实现的关键在于代理模式,AOP 代理主要分为静态代理和动态代理。静态代理的代表为AspectJ,而动态代理则以 Spring AOP 为代表。


2. Spring AOP 和 AspectJ AOP 有什么区别

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单。

  • AspectJ 是静态代理的增强,AOP 框架会在编译阶段生成 AOP 代理类,它会在编译阶段将切面织入到 Java 字节码中。
  • Spring AOP 使用的是动态代理。所谓的动态代理就是说 AOP 框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个 AOP 对象,这个 AOP 对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

3. AspectJ 定义的通知类型有哪些
  • Before(前置通知):目标对象的方法调用之前触发
  • After (后置通知):目标对象的方法调用之后触发
  • AfterReturning(返回通知):目标对象的方法调用完成,在返回结果值之后触发
  • AfterThrowing(异常通知) :目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。
  • Around: (环绕通知)编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法

四、Spring 事务 Spring 管理事务的方式,它们之间的区别
  • 编程式事务 : 在代码中硬编码(不推荐使用) : 通过 TransactionTemplate或者 TransactionManager 手动管理事务,实际应用中很少使用。
  • 声明式事务 : 在 XML 配置文件中配置或者直接基于注解(推荐使用),实际是通过 AOP 实现(基于@Transactional 的全注解方式使用最多)其本质是通过 AOP 功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

区别:

声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过 @Transactional 注解的方式,便可以将事务规则应用到业务逻辑中。

声明式事务要优于编程式事务,这正是 Spring 倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。


五、Spring和Springboot 1. Spring和Springboot小结

Spring和Spring Boot基于IOC AOP理念实现,Spring Boot集成了Spring。

Spring框架: Spring框架解决了企业级的开发的复杂性,它是一个容器框架,用于装java对象(Bean),使程序间的依赖关系交由容器统一管理,松耦合,提高了可测试性和维护效率,Spring主要为我们做了两件事,一省去了我们创建对象的操作,二声明了属性赋值。

对于我来说,Spring框架就是提供了IOC容器、控制反转、依赖注入以及一些模块,简化了大量的代码,便捷了程序的开发,节省了开发时间,提高了效率。Spring框架为我们提供了全面的基础框架,但是Spring框架的配置是一项问题,使用一项第三方jar包的时候都需要配置相关的XML文件,有时候配置起来十分麻烦,降低了编程效率。编写基于ssm框架的项目需要配置Tomcat,把封装好的war包放到Tomcat容器运行。Spring可以接管Web层、业务层、dao层、持久层的组件,可以配置各种bean。

总体而言,Spring框架就是为我们解决开发中的基础性问题,使我们开发者可以更加专注于应用程序的开发,并且Spring框架是轻量级框架,扩展性强,非侵入式框架,消耗的资源少,占用的空间小,运行和部署简单。

Spring Boot框架:

Spring Boot是一个微服务框架,延续了Spring框架的核心思想IOC和AOP,简化了应用的开发和部署。

在我看来Spring Boot框架是对Spring框架的补充,它消除了Spring框架配置XML的麻烦事,简化xml配置,全部采用注解形式,内置Http服务器(Jetty和Tomcat)完善了Spring框架的开发环境,使我们可以更加高效的完成编程,并且为我们提供了 spring-boot-starter-web 依赖,这个依赖包含了Tomcat和springmvc等一系列的web依赖(无需部署war文件)。

以前我们SpringMVC要配置properties文件的时候需要写大量的配置,现在用Spring Boot只需要导入相关依赖,然后写两句话就可以配置完Web程序,并且还提供了@Configuration来替代XML配置。

2. Spring 和 Spring Boot的区别

Spring Boot的核心理念是简化Spring应用的搭建和开发过程,提出了约定大于配置和自动装配的思想。

  1. 我们使用Spring创建Web程序时需要导入几个Maven依赖,而Spring Boot只需要一个Maven依赖来创建Web程序,并且Spring Boot还把我们最常用的依赖都放到了一起,现在的我们只需要spring-boot-starter-web这一个依赖就可以完成一个简单的Web应用。
  2. 以前用Spring的时候需要XML文件配置开启一些功能,现在Spring Boot不用XML配置了,只需要写一个配置类(@Configuration和继承对应的接口)就可以继续配置。
  3. Spring Boot会通过启动器开启自动装配功能以@EnableAutoConfiguration扫描在spring.factories中的配置,然后通过@XxxxautoConfiguration进行扫描和配置所需要的Bean,自动的扫描Spring Boot项目引入的Maven依赖,只有用到的才会被创建成Bean,然后放到IOC容器内。
  4. Spring Boot的自动装配得益于Spring推出了JavaConfig的这种模式,Java开发人员可以通过@Configuration + @Bean的方式向Spring IOC容器注入Bean。每个场景启动器其实都添加了一个这样的JavaConfig,只要这些JavaConfig配置类能被加入到IOC容器,那么自然而然的就可以自动注入JavaConfig提供的Bean。

总结:Spring Boot就是Spring的完善和扩展,就是为我们便捷开发,方便测试和部署,提高效率而诞生的框架技术。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1040556.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号