1、依赖注入的方式有几种? setter注入与构造函数注入的区别?
有3种依赖注入的方式 1、接口注入:我们平时开发使用最多的一种方式 2、setter注入 3、构造函数注入 (其中建议使用set注入可以防止循环依赖的问题)
- 在Setter注入,可以将依赖项部分注入,构造方法注入不能部分注入,因为调用构造方法如果传入所有的参数就会报错。
- 如果我们为同一属性提供Setter和构造方法注入,Setter注入将覆盖构造方法注入。但是构造方法注入不能覆盖setter注入值。显然,构造方法注入被称为创建实例的第一选项。
- 使用setter注入你不能保证所有的依赖都被注入,这意味着你可以有一个对象依赖没有被注入。在另一方面构造方法注入直到你所有的依赖都注入后才开始创建实例。
- 在构造函数注入,如果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容器的过程写的非常详细、
12.介绍一下 WebApplicationContext吧
13、SpringBoot的启动机制
14、SpringBoot如何实现异常处理以及如何实现全局异常管理?
(补充现有系统的全局异常的捕获机制)@ControllerAdvice的用法、