Spring面试题整理

1、依赖注入的方式有几种? setter注入与构造函数注入的区别?
 

有3种依赖注入的方式 1、接口注入:我们平时开发使用最多的一种方式 2、setter注入 3、构造函数注入 (其中建议使用set注入可以防止循环依赖的问题)

  1. 在Setter注入,可以将依赖项部分注入,构造方法注入不能部分注入,因为调用构造方法如果传入所有的参数就会报错。
  2. 如果我们为同一属性提供Setter和构造方法注入,Setter注入将覆盖构造方法注入。但是构造方法注入不能覆盖setter注入值。显然,构造方法注入被称为创建实例的第一选项。
  3. 使用setter注入你不能保证所有的依赖都被注入,这意味着你可以有一个对象依赖没有被注入。在另一方面构造方法注入直到你所有的依赖都注入后才开始创建实例。
  4. 在构造函数注入,如果A和B对象相互依赖:A依赖于B,B也依赖于A,此时在创建对象的A或者B时,Spring抛出ObjectCurrentlyInCreationException。所以Spring可以通过setter注入,从而解决循环依赖的问题。
     

 2、BeanFactory 和 ApplicationContext之间的区别

BeanFactory使用懒加载 ApplicationContext使用即时加载,支持国际化,支持基于依赖的注解 

3、Spring IoC 的实现机制

实现机制通过工厂模式和反射来实现:Spring通过xml配置文件或者注解然后通过反射Class.forName(“com.xx.Xx”)来初始化一个类。访问通过IOC容器工厂进行访问。

4、 Spring自动装配的方式?

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

5、Spring事务管理 

6、DispatcherServlet 的工作流程 

  • 1、向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。
  • 2、 DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解 析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对 象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
  • 3、 DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。(附注:如果成功获得 HandlerAdapter 后,此时将开始 执行拦截器的 preHandler(...)方法)。
  • 4、提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler ( Controller)。在填充 Handler 的入参过程中,根据你的配置,Spring 将 帮你做一些额外的工作  
  •  HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换 成一个对象,将对象转换为指定的响应信息。
  •  数据转换:对请求消息进行数据转换。如 String 转换成 Integer、 Double 等。
  •  数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字 或格式化日期等。
  •  数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中。 5、Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
  • 6、根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已 经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet。
  • 7、 ViewResolver 结合 Model 和 View,来渲染视图。
  • 8、视图负责将渲染结果返回给客户端。 

7、SpringBean的生命周期 

8、Spring 中用到了那些设计模式?

9、Spring框架中的单例bean是线程安全的吗?

 不是,Spring框架中的单例bean不是线程安全的。
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。实际上大部分 spring bean 是无状态的(比如 dao 类),在某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model )就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了, 保证线程安全了。

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

Spring如何处理线程并发问题?
一般只有无状态的Bean才可以在多线程下共享,大部分是无状态的Bean。当存有状态的Bean的时候,spring一般是使用ThreadLocal进行处理,解决线程安全问题。

10、SpringBoot 的自动配置是怎么做的?

 https://blog.csdn.net/weixin_44399827/article/details/120517087

 11、说说Ioc容器的加载过程

文章对整个Spring的IOC容器的过程写的非常详细、 

 ioc容器加载过程_cswhl的博客-CSDN博客_ioc加载过程1、ioc容器的初始化过程1、实例化一个ApplicationContext对象2、解析 xml配置文件路径3、创建bean工厂4、创建bean定义,保存到beanDefinitonMap,用于后期的bean实例化5、调用bean工厂的后置处理器,可自定义修改bean定义invokeBeanFactoryPostProcessors(beanFactory)6、判断beanDefiniton是否符合生产标准(是不是抽象的,单例,懒加载)preInstantiateSingletons(https://blog.csdn.net/cswhl/article/details/118586677

 12.介绍一下 WebApplicationContext吧

 Spring WebApplicationContext 介绍_实践是最好的方法-CSDN博客_webapplicationcontext是什么目录 一、ServletContext介绍二、Spring Web应用上下文配置三、总结一、ServletContext介绍javaee标准规定了,servlet容器需要在应用项目启动时,给应用项目初始化一个ServletContext作为公共环境容器存放公共信息,ServletContext中的信息都是由容器提供的。在web项目中,web.xml文件我们通常有如下配置...https://blog.csdn.net/u012385190/article/details/81368172

 13、SpringBoot的启动机制

 14、SpringBoot如何实现异常处理以及如何实现全局异常管理?

   (补充现有系统的全局异常的捕获机制)@ControllerAdvice的用法、

SpringBoot实战 之 异常处理篇_Q码记-CSDN博客_springboot 异常在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然后给予相应的处理即可。但实现的方式却有好多种,例如:try { ...} catch (Exception e) { doSomeThing();}像这种标准的 try-catchhttps://blog.csdn.net/chinrui/article/details/71036544

@ControllerAdvice 的介绍及三种用法_fadai-CSDN博客_@controlleradvice@ControllerAdvice 的介绍及三种用法浅析@ControllerAdvice首先,ControllerAdvice本质上是一个Component,因此也会被当成组建扫描,一视同仁,扫扫扫。然后,我们来看一下此类的注释:这个类是为那些声明了(@ExceptionHandler、@InitBinder 或 @ModelAttribute注解修饰的)方法的类而提供的专业化的...https://blog.csdn.net/qq_36829919/article/details/101210250

    15、Spring Boot 中如何解决跨域问题 ?

 Spring Boot:如何解决跨域问题 ?_琦彦-CSDN博客_springboot 跨域问题跨域问题现象been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource上面的意思就是 你访问一个什么地址被CORS 协议阻止, 没有 在Hearder 里面发现 Access-Control-Allow-Origin 的参数的 资源跨域问题分析跨域问题的原因:浏览器出于安全考虑,限制访问本站点以为的资源。比如你有一个 网站 127..https://blog.csdn.net/fly910905/article/details/115484101

     16、SpringBoot启动机制

      SpringBoot启动原理及相关流程_javarrr的博客-CSDN博客_springboot启动流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值