Spring面试题合集

打印 上一主题 下一主题

主题 689|帖子 689|积分 2067

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Spring

1.谈谈你对Spring的明白

起首Spring是一个轻量级的开源框架,为Java程序的开发提供了底子架构支持,简化了应用开发,让开发者专注于开发逻辑;
同时Spring是一个容器,它通过管理Bean的生命周期依靠注入,处理对象之间的依靠关系,从而简化了开发者的工作,让代码更加模块化、机动、易维护;
最后我认为Spring是一个生态,无论后面使用的springMVC,springboot,springcloud等等,都是基于Spring来开发的,为整个Spring百口桶提供了底层支持。
他最主要的两个焦点设计就是IOC控制反转和AOP面向切面编程
2.谈谈你对IOC的明白

控制反转,将创建对象进行反转,就是由容器来负责控制对象的生命周期和对象间的关系。以前是我们想要什么,就自己创建什么,现在是我们必要什么,容器就给我们送来什么。
依靠注入(DI)是IOC的具体实现:指的是Spring容器会根据配置(XML、注解或Java配置类),自动将对象的依靠关系注入到对应的类中
常见的依靠注入方式有两种:


  • 构造函数注入:通过类的构造函数来注入依靠。
  • Setter方法注入:通过类的setter方法注入依靠。
IOC的实现原理

实现原理是工厂模式加反射机制。
3.Spring框架中都用到了哪些设计模式?



  • 工厂模式: BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
  • 单例模式: Bean默认为单例模式。
  • 代理模式: Spring的AOP功能用到了JDK的动态代理和CGLIB字节码天生技能;
  • 模板方法: 用来解决代码重复的题目。比如. RestTemplate, JmsTemplate, JpaTemplate。
  • 观察者模式: 定义对象键一种一对多的依靠关系,当一个对象的状态发生改变时,所有依靠于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
  • 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
  • 装饰器模式: Spring 中配置 DataSource 的时候,DataSource 大概是不同的数据库和数据源,项目必要连接多个数据库,这种模式让我们可以根据客户需求切换不同的数据源。
  • 计谋模式: Spring中资源访问接口Resource的设计是一种典型的计谋模式。Resource接口是所有资源访问类所实现的接口,客户端程序只和 Resource 接口耦合,并不知道底层采用何种资源访问计谋,这样客户端程序可以在不同的资源访问计谋之间自由切换
4.谈谈你对AOP的明白

  面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),添加通用的代码逻辑,减少体系中的重复代码,降低了模块间的耦合度,同时提高了体系的可维护性。可用于权限认证、日志、事务处理等。
AOP通过一种动态插入的方法使我们可以或许在不修改焦点业务逻辑的情况下增强功能,帮助保持代码的清洁与模块化。
AOP的实现原理

AOP的实现原理是动态代理。
动态代理分为 JDK 动态代理CGLIB(Code Generation Library)动态代理 两种方式。


  • JDK 动态代理: JDK的动态代理机制只实用于实现了接口的类。它通过 java.lang.reflect.Proxy 和 InvocationHandler 这两个类动态创建代理对象。主要工作原理如下:
    这种方式比较轻量,效率较高,但只能代理接口方法。

    • 创建一个代理对象,代理对象与目标对象具有相同的接口。
    • 通过 InvocationHandler 拦截目标对象的方法调用。
    • 在 InvocationHandler.invoke() 方法中插入切面逻辑,比如日志记录、权限校验等。

  • CGLIB 动态代理: CGLIB 是一种基于 字节码 的动态代理机制,可以或许代理没有实现接口的普通类。它通过 继续 目标类并重写其方法来实现代理。主要工作原理如下:
    CGLIB 更加通用,但由于是基于继续的,以是不能代理 final 修饰的方法。

    • 天生目标类的子类,并通过字节码技能对目标类的方法进行重写。
    • 在重写的方法中插入切面逻辑,调用父类的原方法以保持业务逻辑不变。

AOP有哪些焦点概念


  • 切面(Aspect):封装横切关注点的模块。可以明白为包含与业务无关的某些功能的类
  • 连接点(Join Point):插入切面逻辑的地方。
  • 通知(Advie):在特定连接点执行的操纵,定义了具体行为。
  • 切入点(Pointcut):定义在什么地方应用切面。用来选择哪些连接点应该插入切面通知
  • 织入(Weaving):将切面代码插入到目标代码中的过程。可在编译时、加载时、或运行时进行。
 Advice通知的五种类型


  • 前置通知(Before Advice):在目标方法执行前前执行
  • 后置通知(After Advice):在目标方法执行后执行
  • 围绕通知(Around Advice):在目标方法调用前后均可执行自定义逻辑
  • 返回通知(After returning Advice):在目标方法返回结果后执行
  • 异常通知(After throwing Advice):异常通知,在方法抛出异常后执行
AOP的应用场景 

1. 日志记录:通常,在每个方法调用时,我们盼望记录日志来跟踪体系的行为,包括方法的开始、结束、耗时等信息。
2.事务管理:通过 AOP,可以在数据库操纵方法前后插入事务的开启、提交和回滚逻辑,从而避免在业务逻辑中直接处理事务控制。
3.数据缓存:通过 AOP,可以在数据访问方法前检查缓存中是否已经存在数据,如果存在则直接返回缓存数据,否则执行目标方法并将结果缓存。
4.权限校验:某些方法只允许特定角色的用户访问。通过 AOP,可以在方法执行之前进行权限检查,如果用户没有权限,则直接抛出异常。
5.Spring的事务管理

编程式: beginTransaction()、commit()、rollback()等事务管理相干的方法,机动度高,但是维护性差。
声明式: 利用注解或者xml配置,将业务和事务分离出来,是依靠AOP实现的。通过@Transactional 注解来定义事务界限,避免了使用复杂的编程式事务管理。
事物的实现方式和实现原理

spring事务就是对数据库事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。
通过AOP天生动态代理帮开发接管事物的开启回滚和提交
隔离级别



  • DEFAULT:使用数据库默认的隔离级别。
  • READ_UNCOMMITTED:允许读取未提交的数据,会出现脏读、不可重复读、幻读。
  • READ_COMMITTED:只允许读取已提交的数据,避免脏读,但大概出现不可重复读、幻读。
  • REPEATABLE_READ:确保同一事务内多次读取的数据是一致的,防止脏读和不可重复读,但大概出现幻读。
  • SERIALIZABLE:最高的隔离级别,完全避免脏读、不可重复读、幻读,但性能最差。
事务的传播行为 


  • REQUIRED(默认):默认事务传播行为,存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
  • REQUIRE_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • NESTED:如果当前存在事务,就嵌套当前事务中去执行,如果当前没有事务,那么就新建一个事务,类似 REQUIRE_NEW这个样一个传播行为。
  • SUPPORTS:表示支持当前当前的事务,如果当前不存在事务,就以非事务的方式去执行。
  • NOT_SUPPORT: 总是非事务地执行,并挂起任何存在的事务。
  • MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个运动的事务,则抛出异常。
  • NEVER:就是以非事务的方式来执行,如果存在事务则抛出一个异常。
事务失效场景 


6.Spring的常用注解


Web:


  • @Controller:组合注解(组合了@Component注解),应用在MVC层(控制层)。
  • @RestController:该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
  • @RequestMapping:用于映射Web哀求,包括访问路径和参数。如果是Restful风格接口,还可以根据哀求类型使用不同的注解:

    • @GetMapping
    • @PostMapping
    • @PutMapping
    • @DeleteMapping

  • @ResponseBody:支持将返回值放在response内,而不是一个页面,通常用户返回json数据。
  • @RequestBody:允许request的参数在request体中,而不是在直接连接在地址后面。
  • @PathVariable:用于吸收路径参数,比如@RequestMapping(“/hello/{name}”)申明的路径,将注解放在参数中前,即可获取该值,通常作为Restful的接口实现方法。
  • @RestController:该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
容器:


  • @Component:表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解。
  • @Service:组合注解(组合了@Component注解),应用在service层(业务逻辑层)。
  • @Repository:组合注解(组合了@Component注解),应用在dao层(数据访问层)。
  • @Autowired:Spring提供的工具(由Spring的依靠注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入)。
  • @Qualifier:该注解通常跟 @Autowired 一起使用,当想对注入的过程做更多的控制,@Qualifier 可帮助配置,比如两个以上相同类型的 Bean 时 Spring 无法抉择,用到此注解
  • @Configuration:声明当前类是一个配置类(相当于一个Spring配置的xml文件)
  • @Value:可用在字段,构造器参数跟方法参数,指定一个默认值,支持 #{} 跟 ${} 两个方式。一般将 SpringbBoot 中的 application.properties 配置的属性值赋值给变量。
  • @Bean:注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destroy()方法,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定义,在构造之后执行init,在销毁之前执行destroy。
  • @Scope:定义我们采用什么模式去创建Bean(方法上,得有@Bean) 其设置类型包括:Singleton 、Prototype、Request 、 Session、GlobalSession。
AOP:


  • @Aspect:声明一个切面(类上) 使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。

    • @After :在方法执行之后执行(方法上)。
    • @Before:在方法执行之前执行(方法上)。
    • @Around:在方法执行之前与之后执行(方法上)。
    • @PointCut:声明切点 在java配置类中使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持(类上)。

事务:


  • @Transactional:在要开启事务的方法上使用@Transactional注解,即可声明式开启事务。
第一类是:声明bean,有@Component、@Service、@Repository、@Controller
第二类是:依靠注入相干的,有@Autowired、@Qualifier、@Resourse
第三类是:设置作用域 @Scope
第四类是:spring配置相干的,比如@Configuration,@ComponentScan 和 @Bean
第五类是:跟aop相干做增强的注解 @Aspect,@Before,@After,@Around,@Pointcut
 
7.什么是Bean

在 Spring 框架中,Bean 是最基本的概念之一。Spring IoC(Inversion of Control,控制反转)容器负责管理这些 Bean,它们是组成应用程序的焦点组件。在 Spring 中,所有的 Bean 都是由 IoC 容器来创建、初始化和管理的。
在 Spring 框架中,Bean 是指由 Spring 容器管理的对象。Bean 可以是任何类型的对象,通常是服务层、数据访问层或者业务逻辑层的组件。Spring 通过 ApplicationContext 容器创建并管理这些对象。
Bean的生命周期



Bean的注入方式(DI)

Spring 容器负责管理 Bean 的依靠注入(Dependency Injection,DI)。通过依靠注入,Spring 可以将一个 Bean 的依靠对象(其他 Bean)自动注入到这个 Bean 中,避免了手动管理依靠的繁琐。


  • 构造函数注入,构造器依靠注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依靠。
  • Setter 方法注入,Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依靠注入。
Bean的作用域 

Spring 提供了多种作用域来定义 Bean 的生命周期管理方式,常见的作用域包括:


  • singleton(默认值):整个 Spring 容器中只会创建一个 Bean 实例,容器启动时创建,所有哀求共享同一个实例。
  • prototype:每次哀求都会创建一个新的 Bean 实例,恰当必要频仍厘革的对象。
  • request(仅限 Web 应用):每个 HTTP 哀求都会创建一个新的 Bean 实例,哀求结束后,Bean 实例被销毁。
  • session(仅限 Web 应用):每个 HTTP 会话创建一个 Bean 实例,会话结束后,实例被销毁。
  • globalSession(仅限 Web 应用):类似于 session 作用域,但实用于全局会话环境(如 Portlet 应用)。
Spring框架中的单例bean是线程安全的吗? 

Spring中的单例Bean不是线程安全的
因为单例Bean,是全局只有一个Bean,所有线程共享。如果说单例Bean,是一个无状态的,也就是线程中的操纵不会对Bean中的成员变量执行查询以外的操纵,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。
如果这个Bean是有状态的,也就是会对Bean中的成员变量进行写操纵,那么大概就存在线程安全的题目。
循环依靠题目 

循环依靠:循环依靠其实就是循环引用,也就是两个或两个以上的bean互相持有对方,终极形成闭环。比如A依靠于B,B依靠于A
循环依靠:A依靠B,B依靠C,C依靠A,形成了闭环。
①构造器的循环依靠: 这种依靠spring是处理不了的,直接抛出异常。
②单例模式下的setter循环依靠: 通过"三级缓存"处理循环依靠,能处理。
③多例模式下的setter循环依靠: 不能处理,会不停产生新的Bean,导致OOM。

 
循环依靠在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依靠
一级缓存:单例池,缓存已经履历了完整的生命周期,已经初始化完成的bean对象
二级缓存:缓存早期的bean对象(生命周期还没走完)
三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

SpringMVC

Spring MVC 是 Spring 框架中的一部分,用于构建基于 Web 的应用程序。它是一个 Model-View-Controller (MVC) 模式的实现,帮助开发者将 Web 应用程序的业务逻辑、用户界面和数据分离开来,从而提高代码的模块化和可维护性。
Spring MVC 的焦点组件



  • DispatcherServlet(前端控制器):所有哀求都会起首经过 DispatcherServlet,它是 Spring MVC 的焦点组件,负责将哀求分发给适当的处理器(Controller)。
  • Handler Mapping(处理器映射器):根据哀求 URL,查找可以或许处理该哀求的 Controller。
  • HandlerAdapter(处理器适配器)  在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
  • Controller(控制器):处理客户端的哀求,通常会获取用户输入、调用业务逻辑层处理哀求,并返回一个视图名和模子数据。
  • ModelAndView:将业务处理后的数据模子与视图名称绑定在一起,返回给 DispatcherServlet。
  • View Resolver(视图剖析器):根据 ModelAndView 中的视图名剖析并天生实际的视图,通常是 JSP、HTML、Thymeleaf 等。
  • Model:存储处理完的业务数据,提供给视图用于渲染页面。
SpringMVC的工作流程 


1、用户发送出哀求到前端控制器DispatcherServlet接待,这是一个调理中心
2、DispatcherServlet收到哀求调用HandlerMapping(处理器映射器)。
3、HandlerMapping找到具体的处理器(可查找xml配置或注解配置),天生处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。
4、DispatcherServlet调用HandlerAdapter(处理器适配器)。
5、HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。
6、Controller执行完成返回ModelAndView对象。
7、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover(视图剖析器)。
9、ViewReslover剖析后返回具体View(视图)。
10、DispatcherServlet根据View进行渲染视图(即将model模子数据填充至视图中)得到JSP。
11、DispatcherServlet将JSP响应用户。
 SpringMVC Restful风格的接口的流程是什么样的 



  • 客户端向服务端发送一次哀求,这个哀求会先到前端控制器DispatcherServlet
  • DispatcherServlet吸收到哀求后会调用HandlerMapping处理器映射器。由此得知,该哀求该由哪个Controller来处理
  • DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller
  • Controller被封装成了ServletInvocableHandlerMethod,HandlerAdapter处理器适配器去执行invokeAndHandle方法,完成对Controller的哀求处理
  • HandlerAdapter执行完对Controller的哀求,会调用HandlerMethodReturnValueHandler去处理返回值,主要的过程:
    5.1. 调用RequestResponseBodyMethodProcessor,创建ServletServerHttpResponse(Spring对原生ServerHttpResponse的封装)实例
    5.2.使用HttpMessageConverter的write方法,将返回值写入ServletServerHttpResponse的OutputStream输出流中
    5.3.在写入的过程中,会使用JsonGenerator(默认使用Jackson框架)对返回值进行Json序列化
  • 执行完哀求后,返回的ModealAndView为null,ServletServerHttpResponse里也已经写入了响应,以是不消关心View的处理
SpringMVC的常用注解

Spring MVC 通过注解简化了开发,常见的注解有:


  • @Controller:用于标记类为控制器,处理客户端的哀求。
  • @RequestMapping:用于映射 URL 到控制器的具体方法,可以作用在类或方法上。
  • @GetMapping、@PostMapping:是 @RequestMapping 的简化版本,用于处理 GET 和 POST 哀求。
  • @RequestParam:用于获取哀求中的参数。
  • @PathVariable:用于获取 URL 中的路径变量。
  • @ModelAttribute:用于绑定哀求参数到模子对象中。
  • @ResponseBody:用于将控制器方法的返回值直接作为 HTTP 响应体(通常用于返回 JSON 数据)。
在前后端分离的开发模式中,以下是 Spring MVC 的关键组件和它们的作用:


  • @RestController:它是 @Controller 和 @ResponseBody 的组合,表明这是一个控制器,并且方法的返回值会自动转换为 JSON 或 XML 格式,而不是返回视图名。
  • HttpMessageConverter:负责将 Java 对象转换为客户端哀求的数据格式(如 JSON、XML),也可以将客户端发送的数据转换为 Java 对象。默认使用 Jackson 库来处理 JSON 格式数据。
  • @RequestMapping、@GetMapping、@PostMapping 等注解:用于映射不同的 HTTP 哀求到控制器的相应方法,如 GET、POST、PUT 和 DELETE。
  • @PathVariable 和 @RequestParam:用于获取 URL 路径变量或哀求参数,处理前端转达的数据。
  • @ResponseBody:告诉 Spring MVC 直接将方法返回的 Java 对象转换为 HTTP 响应体中的数据(如 JSON),而不是视图。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表