Spring系列面试题概念自我总结

本文详细介绍了Spring框架的核心概念,包括IoC和AOP容器、依赖注入、SpringMVC的原理和应用,以及SpringBoot的简化配置和高级特性,如事务管理和性能优化。
摘要由CSDN通过智能技术生成

Spring

1.spring是什么

Spring是一个轻量级的IoC和AOP容器框架,为java提供了基础架构支持,简化了企业级应用开发,让开发者只需要关注业务逻辑。

2.spring的核心是什么:IOC和AOP

3.spring优缺点:

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

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

:使用大量反射机制,占内存,不如直接调用效率高

4.IOC是什么

控制反转,将创建对象进行反转,因为正常都是程序员去创建对象,现在使用spring容器去创建,根据需求自动去创建对象。对象实例化,通过spring容器进行创建和管理,spring通过DI(数据注入)实现IOC。

5.什么是DI

程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。而 Spring 的 DI 具体就是通过反射实现注入的,反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性

6.IOC的实现原理

实现原理是工厂模式加反射机制。

7.什么是AOP

AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块

7.AOP分为,区别

静态代理:AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。

动态代理:AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法

8.JDK动态代理和CGLIB动态代理

JDK代理:

1.JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口(兄弟两个拜把子模式)。JDK动态代理的核心是InvocationHandler接口和Proxy类,在获取代理对象时,使用Proxy类来动态创建目标类的代理类(即最终真正的代理类,这个类继承自Proxy并实现了我们定义的接口),当代理对象调用真实对象的方法时, InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;

2. InvocationHandler 的 invoke(Object  proxy,Method  method,Object[] args):proxy是最终生成的代理对象;  method 是被代理目标实例的某个具体方法;  args 是被代理目标实例某个方法的具体入参, 在方法反射调用时使用。

3.如果被代理类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

cglib动态代理:通过继承被代理的目标类(认干爹模式)实现代理,所以不需要目标类实现接口。(CGLIB 通过动态生成一个需要被代理类的子类(即被代理类作为父类),该子类重写被代理类的所有不是 final 修饰的方法,并在子类中采用方法拦截的技术拦截父类所有的方法调用,进而织入横切逻辑。)使用cglib实现的动态代理也有一个约束条件,就是被代理类不能被final修饰

9.AOP基本术语 

目标对象(target):需要被代理的类。 连接点(JoinPoint): 程序执行的某一个点,比如某个方法。

Aspect(切面):通常是一个类,里面定义Pointcut(切入点)和 Advice(通知) 

Pointcut(切入点):用来指定需要将Advice(通知)使用到哪些地方。

Advice(通知):所要增强或增加的功能。

weave(织入):把切面应用到目标对象并创建新的代理对象的过程.

introduction(引入):在不修改代码的前提下,引入可以在运行期为类动态地增加一些方法或字段。

10.springBean作用域

有状态: 有数据存储功能。无状态: 不会保存数据。

①singleton(单例模式): 默认作用域,在spring容器中一个bean只创建一个实例,所有对bean的请求和引用都会返回这个实例。适用都是无状态的bean。

②prototype(原型模式): 每次请求都会为bean创建一个实例。适用都是有状态的bean。

③request(请求作用域): 为每一个HTTP请求创建一个实例,在请求完成以后,bean会失效,会被垃圾回收器回收。

④session(会话作用域): 为每一个HTTP会话创建一个实例,不同会话使用不同实例,session销毁,bean失效。

⑤global-session(全局作用域): Spring5 已经没有了。

11.spring中bean的注入方式:构造器注入、setter、接口注入

12.BeanFactory 和 ApplicationContext有什么区别

是spring的核心接口,都可以作为容器,ApplicationContext是BeanFactory的子接口。
BeanFactory: 是spring最底层的接口,包含各种Bean的定义和Bean的管理。

ApplicationContext: 作为BeanFactory的派生,除了有BeanFactory的功能以外,还提供了更多的功能。

区别

① BeanFactroy采用的是延迟加载形式来注入Bean的,使用到bean才会加载。ApplicationContext是在容器启动时,一次性创建了所有的Bean。
② BeanFactory需要手动注册,而ApplicationContext则是自动注册。

③ BeanFactory不支持国际化,ApplicationContext支持国际化(实现MessageSource接口)。

13.spring的事务传播机制

REQUIRED(必需的): (默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务

REQUIRES_NEW (需要新的): 无论当前存不存在事务,都创建新事务进行执行

SUPPORTS(支撑): 如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行

NOT_SUPPORTED(不支持): 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

NESTED (嵌套的): 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行

MANDATORY(强制性的): 如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常

NEVER(绝不):以非事务方式执行,如果当前存在事务,则抛出异常。

14.spring事务的隔离级别

  • 脏读:一个事务读取到了另一个事务修改的数据之后,后一个事务又进行了回滚操作,从而导致第一个事务读取的数据是错误的。
  • 不可重复读:一个事务两次查询得到的结果不同,因为在两次查询中间,有另一个事务把数据修改了。
  • 幻读:一个事务两次查询中得到的结果集不同,因为在两次查询中另一个事务有新增了一部分数据。
  • 不可重复读和幻读两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。
  1. DEFAULT: Spring 中默认的事务隔离级别 ,以连接的数据库的事务隔离级别为准;
  2. READ_UNCOMMITTED:读未提交,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读;
  3. READ_COMMITTED:读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读;
  4. REPEATABLE_READ:可重复读,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读 (Phantom Read);

  5. SERIALIZABLE:串行化,最高的事务隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

SpringMVC面试题:

1、什么是Spring MVC 

Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

2、SpringMVC的流程

  • (1)用户发送请求至前端控制器DispatcherServlet;
  • (2)DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;
  • (3)处理器映射器根据请求url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet;
  • (4)DispatcherServlet 调用 HandlerAdapter处理器适配器,请求执行Handler;
  • (5)HandlerAdapter 经过适配调用 具体处理器进行处理业务逻辑;
  • (6)Handler执行完成返回ModelAndView;
  • (7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
  • (8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
  • (9)ViewResolver解析后返回具体View;
  • (10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
  • (11)DispatcherServlet响应用户。

 3、Springmvc的优点:

(1)可以支持各种视图技术,而不仅仅局限于JSP;

(2)与Spring框架集成(如IoC容器、AOP等);

(3)清晰的角色分配:前端控制器(dispatcherServlet) ,请求到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)。

4、SpringMvc里面拦截器是怎么写的:
1.定义拦截器,实现HandlerInterceptor接口,接口中提供三个方法

preHandle:在进入Handler方法之前执行,用于身份认证、身份授权。例如进行身份认证,如果认证通过则表示当前用户没有登录,需要此方法拦截不再向下执行。

postHandler:在进入Handler方法之后,返回ModelAndView之前执行,应用场景从ModelAndView出发,将公用的模型数据(如菜单导航)在这里传到视图,也可以在这里统一指定视图。

afterCompletionHandler执行完成之后执行此方法,应用场景包括统一异常处理、统一日志处理。

2.继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:

5、Spring MVC的异常处理 ?

 可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。

6.SpringMvc的控制器是不是单例模式?如果是,有什么问题?怎么解决

是单例模式,在多线程访问的时候有线程安全问题,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。

SpringBoot

1.谈谈你对springBoot的理解

是一站式解决方案,简化了spring繁重的配置,提供了各种启动器,让开发者更好上手。

2. 为什么要用SpringBoot

快速开发,快速整合,配置简化、内嵌服务容器

3.SpringBoot与SpringCloud 区别

SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot。

4.Spring Boot 优点

开箱即用,远离繁琐的配置提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等

5.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

@SpringBootApplication:包含了三个注解。

1.@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

2.@EnableAutoConfiguration: 打开自动配置的功能,也可以关闭某个自动配置的选项, 例如: java 如关闭数据源自动配置功能:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

3.@ComponentScan Spring组件扫描。

6.运行 Spring Boot 有哪几种方式

  1. 打包用命令或者放到容器中运行
  2. 用 Maven/ Gradle 插件运行
  3. 直接执行 main 方法运行

7. SpringBoot事物的使用

SpringBoot的事物很简单,首先使用注解EnableTransactionManagement开启事物之后,然后在Service方法上添加注解Transactional便可。

8.Async异步调用方法

在SpringBoot中使用异步调用是很简单的,只需要在方法上使用@Async注解即可实现方法的异步
调用。 注意:需要在启动类加入@EnableAsync使异步调用@Async注解生效。

9.Spring Boot 有哪几种读取配置的方式

Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationPropertie注
解来绑定变量

10.如何使用 Spring Boot 实现全局异常处理

Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个
ControlerAdvice 类,来处理控制器类抛出的所有异常

11.SpringBoot性能如何优化

如果项目比较大,类比较多,不使用@SpringBootApplication,采用@Compoment指定扫包范
围在项目启动时设置JVM初始内存和最大内存相同

12.Spring Boot 打成的 jar 和普通的 jar 有什么区别

 1.Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命
令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。

2.Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOTINF\classes 目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用

13.SpringBoot核心配置文件是什么

bootstrap.properties 和 application.properties

14.你如何理解 Spring Boot 配置加载顺序

Spring Boot 配置加载顺序优先级是:propertiese文件、YAML文件、系统环境变量、命令行参数。

15.application.properties 和 bootstrap.properties 有何区别 ?

bootstrap 比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效, 而且 boostrap 里面的属性不能被覆盖;application 用于 Spring Boot 项目的自动化配置

16.Spring Boot 中的监视器是什么

 Spring boot actuator 是 spring 启动框架中的重要功能之一,Spring boot 监视器可以访问生产环境中正在运行的应用程序的当前状态。监视器模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态

17. SpringBoot Starter的工作原理

在sprinBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的
spring.factories文件,该文件里配置了所有需要被创建spring容器中的bean,并且进行自动配置把
bean注入SpringContext中 //(SpringContext是Spring的配置文件)

19.什么是 JavaConfig

Spring JavaConfig 是 Spring 社区的产品,Spring 3.0引入了他,它提供了配置 Spring IOC 容器的
纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:
面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。


减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。


类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java
5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字
符串的查找。

常用的Java config:
@Configuration:在类上打上写下此注解,表示这个类是配置类
@ComponentScan:在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan >。
@Bean:bean的注入:相当于以前的< bean id=“objectMapper”
class=“org.codehaus.jackson.map.ObjectMapper” />
@EnableWebMvc:相当于xml的<mvc:annotation-driven >
@ImportResource: 相当于xml的 < import resource=“applicationContextcache.xml”>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值