目录
6、SpringBoot运行原理?有哪些类?以什么顺序执行?
1、Spring框架有哪些设计模式?
1.单例模式:
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供了一个全局访问点。在 Spring 中,Bean 默认是单例的,这意味着每个 Bean 只会被创建一次,并且可以在整个应用程序中共享
单例模式的实现方式有饿汉模式和懒汉模式两种。
饿汉模式(线程安全):在类加载时就创建实例对象,保证在整个程序生命周期内只存在一个实例,所以在多线程环境下也能保持唯一性。
懒汉模式(线程不安全):非必要不加载,只有在第一次使用时创建单例对象,避免在类加载时就创建对象。如果有多个线程同时创建实例对象,就有可能产生线程不安全的情况。
2.工厂模式:
它提供了一种创建对象的方式,使得应用程序可以更加灵活和可维护。Spring 提供了多种工厂模式,如 BeanFactory 和 ApplicationContext 等,通过这些工厂可以创建和管理对象的实例。
3.代理模式:
代理模式是一种结构型设计模式,它允许开发人员在不修改原有代码的情况下,向应用程序中添加新的功能。在 Spring AOP(面向切面编程)就是使用代理模式的实现,它允许开发人员在方法调用前后执行一些自定义的操作,比如日志记录、性能监控等
4.观察者模式:
Spring 事件机制就是基于观察者模式实现的,通过事件源和监听器来实现对象之间的解耦。
5.适配器模式:
适配器模式是一种结构型设计模式,它允许开发人员将一个类的接口转换成另一个类的接口,以满足客户端的需求。在 Spring 中,适配器模式常用于将不同类型的对象转换成统一的接口。
2、介绍一下Spring框架和SpringBoot框架?
Spring
Spring 是一个轻量级的开源框架,它提供了一种简单的方式来构建企业级应用程序。Spring 框架的核心是 IoC 和 AOP 两个概念。
IoC 是一种设计模式,它将对象的创建和依赖关系的管理从应用程序代码中分离出来,使得应用程序更加灵活和可维护。
AOP 是一种编程范式,它允许开发人员在不修改原有代码的情况下,向应用程序中添加新的功能。
Spring 框架提供了很多模块,包括核心容器、数据访问、Web、AOP、消息、测试等。开发人员可以根据自己的需求选择合适的模块来构建应用程序。
Spring Boot
Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring 提供更加有力的支持。 Spring Boot 也提供了很多特性,包括自动配置、嵌入式 Web 服务器、健康检查、度量指标、安全性等。开发人员可以通过使用 Spring Boot Starter 来快速集成常用的第三方库和框架,比如 Spring Data、Spring Security、MyBatis、Redis 等
Spring Boot 是一个基于 Spring 框架的快速开发框架,它有以下优点:
- 快速集成框架,Spring Boot 提供了启动添加依赖的功能,⽤于秒级集成各种框架。
- 内置运⾏容器,⽆需配置 Tomcat 等 Web 容器,直接运⾏和部署程序。
- 快速部署项⽬,⽆需外部容器即可启动并运⾏项⽬。
- 可以完全抛弃繁琐的 XML,使⽤注解和配置的⽅式进⾏开发。
- ⽀持更多的监控的指标,可以更好的了解项⽬的运⾏情况。
- SpringBoot的核心:
1、快速添加依赖
2、内置web容器
3、自动装配(即SpringBoot自动构建复杂对象,构建好的对象可以直接使用)
Spring Boot 项⽬的⼀大特点:约定⼤于配置。较于Spring需要配置Bean的扫描路径,而SpringBoot就不需要
3、介绍一下SpringBoot具有哪些功能模块?
-
自动配置模块:自动配置根据项目中引入的依赖和应用程序的环境自动配置Spring应用程序。它大大减少了繁琐的配置过程。
-
起步依赖模块:Spring Boot提供了许多预配置的起步依赖,可以轻松添加常用的功能模块。例如,你可以通过添加
spring-boot-starter-web
起步依赖来快速构建Web应用程序。 -
嵌入式Web服务器模块:Spring Boot集成了嵌入式的Web服务器,如Tomcat、Jetty、Undertow等,可以使应用程序成为自包含的可执行JAR文件。
-
配置管理模块:Spring Boot简化了配置管理,可以使用属性文件、YAML文件、环境变量等来配置应用程序。
-
日志管理模块:Spring Boot集成了常见的日志框架,如Logback、Log4j2等,可以方便地配置和管理日志输出。
SpringBoot模块中操作数据库的模块是Spring Data JPA
4、Spring用到了什么组件?
-
Spring Boot:Spring Boot是Spring框架的扩展,提供了自动配置和快速启动功能,简化了应用程序的开发和部署过程。
-
Spring MVC:Spring MVC是一个基于模型-视图-控制器(MVC)设计模式的Web框架,用于构建Web应用程序。它提供了处理请求和响应的控制器、视图解析器等组件。
-
Spring Data:Spring Data是一个简化数据库访问的组件,提供了对关系型数据库和NoSQL数据库的统一访问方式,包括Spring Data JPA、Spring Data JDBC、Spring Data MongoDB等子项目。
-
Spring AOP:Spring AOP(面向切面编程)是一种编程范式,用于实现横切关注点的模块化。它可以将通用的横切逻辑(例如日志、事务管理等)与其他模块分离开来。
-
Spring Core(核心):Spring Core是Spring框架的核心组件,提供了IoC(控制反转)和DI(依赖注入)容器,用于管理应用程序中的对象和依赖关系。
5、什么是IoC? 什么是AOP?
IoC的含义是控制反转,举个汽车例子可以更好的帮助我们理解何为控制反转。
构建⼀辆⻋(Car Class),然⽽⻋需要依赖⻋身,⽽⻋身需要依赖底盘,⽽底盘需要依赖轮胎,由上往下一层层实现;
一种汽车型号的轮胎尺寸大小是固定的,当需要生产不同尺寸大小的轮胎尺寸时,此时就需要由上到下修改轮胎尺寸参数,十分繁琐。为此我们转换思路,将原来由⾃⼰创建的下级类,改为传递的⽅式(也就是注⼊的⽅式),因为我们不需要在当前类中创建下级类了,所以下级类即使发⽣变化(创建或减少参数),当前类本身也⽆需修改任何代码,这样就完成了程序的解耦。
IoC容器的优点:实现了代码的解耦,无需关注代码实现的细节
AOP见下图所示:
AOP的好处包括:
- 降低代码的重复性:相同的横切关注点逻辑可以在多个地方重用,减少了代码冗余。
- 提高代码的可维护性:将横切关注点从核心业务逻辑中分离出来,使代码更加清晰和易于理解。
- 提高代码的可重用性:切面的逻辑可以独立于核心业务逻辑进行修改和扩展,提高了代码的可重用性。
- 改善代码的灵活性和可扩展性:通过配置切面,可以动态地增加、删除或修改横切关注点的逻辑,而无需修改核心AOP是面向切面编程的缩写。
6、SpringBoot运行原理?有哪些类?以什么顺序执行?
SpringBoot是一个基于Spring框架的快速开发脚手架,它的运行原理可以简单概括为以下几个步骤:
-
SpringBoot的启动类是@SpringBootApplication注解标注的类,它会自动扫描同级包及其子包下的所有类,将它们作为Spring Bean进行加载。
-
SpringBoot会根据classpath下的配置文件(application.properties或application.yml)来配置应用程序的行为,例如端口号、数据库连接等。
-
SpringBoot会根据依赖关系自动配置应用程序的各种组件,例如WebMvc、JdbcTemplate等。
-
SpringBoot会根据配置文件中的信息来启动内嵌的Tomcat、Jetty或Undertow等Web容器,将应用程序部署到Web容器中。
-
应用程序启动后,SpringBoot会自动运行所有实现了CommandLineRunner接口的Bean,这些Bean可以用来执行一些初始化操作。
Spring Boot 的底层原理主要涉及以下几个关键类和组件:
- SpringApplication:这是启动过程的起点。首先会创建一个新的SpringApplication实例,并解析传入的命令行参数。
- SpringApplicationRunListeners:这个类处理Spring Boot应用程序的启动和关闭事件,比如监听器会根据应用程序的不同阶段执行自定义逻辑。
- Environment:通过Environment对象加载配置文件中的设置,并根据这些设置调整应用程序的行为。
- SpringApplicationContext:一旦创建了SpringApplication实例,就会创建一个新的SpringApplicationContext实例,该实例会加载应用程序的Bean和相关的依赖关系。
- ApplicationContextRunner:这个类负责执行在创建ApplicationContext时注册的ApplicationContextInitializer。
- WebServer:对于Web应用程序,Spring Boot会启动一个嵌入式Web服务器(如Tomcat或Jetty),该服务器负责处理HTTP请求和响应。
7、SpringBoot启动流程?
Spring Boot启动流程大致如下:
- 加载Spring Boot应用的配置文件,包括application.properties或application.yml等。
- 创建并配置Spring应用上下文(ApplicationContext),包括扫描并加载Bean定义、配置Bean之间的依赖关系等。
- 注册Spring Boot内置的各种组件,如自动配置、自动装配、自动扫描等。
- 执行各种自定义的初始化操作,如注册自定义的Bean、配置拦截器、过滤器等。
- 启动内嵌的Servlet容器(如Tomcat、Jetty等),并将Spring应用上下文部署到Servlet容器中。
- 启动完成,监听请求并处理业务逻辑。
总的来说,Spring Boot的启动流程主要包括加载配置、创建Spring应用上下文、注册组件、执行初始化操作和启动内嵌的Servlet容器等步骤。
8、对于SpringBoot和SpringMVC的理解?
SpringBoot的理解:
Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,可以理解为创建Spring框架的脚手架,大大提高了创建Spring项目的效率。同时SpringBoot框架还具备了约定大于配置的特点。
Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。
Spring Boot 翻译⼀下就是 Spring 脚⼿架,就是为了快速开发 Spring 框架⽽诞⽣的
Spring Boot 项⽬的⼀大特点:约定⼤于配置。较于Spring需要配置Bean的扫描路径,而SpringBoot就不需要。
SpringMVC的理解:
Spring MVC是一个基于Java的Web框架,用于开发Web应用程序。它基于MVC(Model-View-Controller)设计模式,将应用程序的逻辑分为模型(Model)、视图(View)和控制器(Controller)三个部分,以实现代码的分离和模块化。
Spring MVC的工作流程如下:
- 客户端发送一个HTTP请求到服务器。
- 前端控制器(DispatcherServlet)接收到请求,并负责请求的分发和处理。
- 根据请求的URL,前端控制器将请求发送给合适的控制器(Controller)。
- 控制器处理请求,执行相应的业务逻辑,并可能访问数据库或其他外部服务。
- 控制器将处理结果封装为模型(Model)对象,交给视图解析器(View Resolver)。
- 视图解析器根据控制器返回的模型和视图的名称,找到对应的视图(View)。
- 视图负责渲染模型数据,并生成最终的响应内容。
- 响应内容通过前端控制器发送给客户端。
Spring MVC的特点和优势包括:
-
灵活性:Spring MVC以松散耦合的形式组织代码,可以与其他Spring框架集成,并可以与多种视图技术(如JSP、Thymeleaf、Freemarker等)搭配使用。
-
易于测试:通过使用MVC模式,控制器(Controller)和模型(Model)可以独立于视图(View)进行测试,提高了代码的可测试性。
-
强大的请求处理:Spring MVC提供了灵活的请求映射和处理机制,可以根据URL、请求参数、请求方法等进行精确匹配,并提供了丰富的支持RESTful风格的请求处理。
-
国际化和本地化支持:Spring MVC提供了多语言和多区域的支持,可以根据用户的语言和地区自动切换视图和文本资源。
-
强大的数据绑定和表单处理:Spring MVC支持数据绑定,可以将请求参数自动绑定到控制器中的Java对象,并提供了表单验证和错误处理的功能。
-
安全性:Spring MVC集成了Spring Security框架,可以方便地实现用户认证和授权功能。
9、Spring常用注解?
详细注解见此篇文章:Spring常见注解
10、Spring的注入的底层原理是什么?
在Spring框架中,注入的底层原理主要基于反射 和 依赖注入(DI)两个关键技术:
1、反射:Spring使用Java的反射机制来实现依赖注入。通过反射,Spring可以在运行时动态地获取类的信息,包括构造函数、字段、方法等。
这使得 Spring能够在不依赖编译时信息的情况下,动态地注入依赖对象。
2、依赖注入(DI):依赖注入是一种设计模式,它将对象的创建和依赖关系的管理从应用程序代码中分离出来,使得应用程序更加灵活和可维护。
在 Spring 框架中,当容器创建一个对象时,依赖注入会检查该对象的依赖关系,并使用反射机制查找依赖对象。然后容器将依赖对象注入到该对象中。
依赖注入的实现三种方式:
1:属性注入:通过反射,Spring直接将依赖对象注入到Bean的字段中,即直接对Bean对象的字段赋值。
2:Setter注入:Spring容器在实例化Bean之后,通过反射调用Bean中对应的Setter方法来注入所需的依赖对象。
3:Spring容器通过反射调用目标Bean的构造函数,将依赖对象作为构造函数的参数传递进去。
一句话总结Spring注入的底层原理就是:当 Spring 容器启动时,它会扫描应用程序中的所有 Bean,并将它们存储在一个 BeanFactory 中。当 Spring 容器需要注入某个 Bean 时,Spring 容器会使用 Java 反射机制来查找符合条件的 Bean,并将其注入到应用程序中。