为什么要用SpringBoot
(1)简化部署 在使用Spring时,项目部署时需要我们在服务器上部署Tomcat,然后把项目打成war包扔到Tomcat里, 在使用SpringBoot后,我们不需要在服务器上去部署Tomcat,因为SpringBoot内嵌了Tomcat,我们只 需要将项目打成jar包就能独立运行,所有的依赖包都在一个jar包内。 (2)简化配置 Spring 虽然是Java EE轻量级框架,但是配置却是极其繁琐的,有各种xml、Annotation配置,一旦出错了是很难找到出错原因的。SpringBoot采用了Java Config 的方式,对spring进行配置。例如我们新建一个类,在这个类中使用@Configuration和@Bean两个注解,@Configuration注解代表该类是个配置类, @Bean注解表示该方法返回一个Bean对象 (3)自动配置 Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starterweb启动器就能拥有web的功能,无需其他配置。 (4)简化监控 我们可以引入 spring-boot-start-actuator 依赖,直接使用REST方式来获取进程的运行期性能参数,从而 达到监控的目的,比较方便。但是 SpringBoot 只是个微框架,没有提供相应的服务发现与注册的配套功能,没有外围监控集成方案,没有外围安全管理方案,所以在微服务架构中,还需要SpringCloud来配合一 起使用。 (5)简化依赖,比如我们要创建一个web项目,在使用spring的时候,需要在pom文件中添加多个依赖; 而SpringBoot则会帮助开发者快速启动一个web容器,在SpringBoot中,我们只需要在pom文件中添加一个 spring-boot-starter-web依赖即可。
SpringBoot的核心注解是什么,它由哪些注解组成?
核心注解是@SpringBootApplication,它也是启动类上的注解,该注解主要包含了以下3个注解: (1)@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能 (2)@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭 数据源自动配置的功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) (3)@ComponentScan:Spring组件扫描
Spring Boot启动流程
(1)首先从main找到run()方法,在执行run()方法之前new一个SpringApplication对象 (2)进入run()方法,创建应用监听器SpringApplicationRunListeners开始监听 (3)然后加载SpringBoot配置环境(ConfigurableEnvironment),然后把配置环境(Environment)加入监听对象中 (4)然后加载应用上下文(ConfigurableApplicationContext),当做run方法的返回对象 (5)最后创建Spring容器,refreshContext(context),实现starter自动化配置和bean的实例化等工作。
自动配置原理
(1)收集Spring开发者的编程习惯,整理开发过程使用的常用技术列表——>(技术集A) (2)收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的常用设置列表——>(设置集B) (3)初始化SpringBoot基础环境,加载用户自定义的bean和导入的其他坐标,形成初始化环境 (4)将技术集A包含的所有技术都定义出来,在Spring/SpringBoot启动时默认全部加载 (5)将技术集A中具有使用条件的技术约定出来,设置成按条件加载,由开发者决定是否使用该技术(与初始化环境比对) (6)将设置集B作为默认配置加载(约定大于配置),减少开发者配置工作
SpringBoot自动装配原理
(1)自动装配, 简单来说就是自动把第三方组件的 Bean 装载到 Spring IOC 容器里面,不需要开发人员再去写 Bean 的相关配置。在 Spring Boot 应用里面, 只需要在启动类上加上@SpringBootApplication 注解就可以实现自动装配。 (2)@SpringBootApplication 是 一 个 复 合 注 解 , 真 正 实 现 自 动 装 配 的 是@EnableAutoConfiguration注解。 ①引入 Starter 启动依赖组件的时候, 这个组件里面必须要包含一个@Configuration 注解配置类,而在这个配置类里面通过@Bean 注解声明需要装配到 IOC 容器的 Bean 对象。 ②这个配置类是放在第三方的 jar 包里面, 然后通过 SpringBoot 中的约定优于配置思想, 把这个配置类的全路径放在 classpath:/META-INF/spring.factories 文件中。这样SpringBoot 就可以知道第三方 jar 包里面的配置类的位置, 这个步骤主要是用到了 Spring 里面的 SpringFactoriesLoader 来完成。 ③SpringBoot 拿到第三方 jar 包里面声明的配置类以后, 再通过 Spring 提供的ImportSelector 接口, 实现对这些配置类 的动态加载。 (3)在我看来, SpringBoot 是约定优于配置这一理念下的产物, 所以在很多的地方,都会看到这类的思想。 它的出现, 让开发人员更加聚焦在了业务代码的编写上,而不需要去关心和业务无关的配置。 (4)其实, 自动装配的思想, 在 SpringFramework3.x 版本里面的@Enable 注解, 就有了实现的雏形。 @Enable 注解是模块驱动的意思, 我们只需要增加某个@Enable 注解, 就自动打开某个功能, 而不需要针对这个功能去做 Bean 的配置, @Enable 注解的底层也是帮我们去自动完成这个模块相关 Bean 的注入。
简单回答: 1.启动类的@SpringBootApplication注解由@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration三个注解组成,三个注解共同完成自动装配; 2.@SpringBootConfiguration 注解标记启动类为配置类 3.@ComponentScan 注解实现启动时扫描启动类所在的包以及子包下所有标记为bean的类由IOC容器注册为bean 4.@EnableAutoConfiguration通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过AutoConfigurationImportSelector 类的 selectImports 方法去读取需要被自动装配的组件依赖下的spring.factories文件配置的组件的类全名,并按照一定的规则过滤掉不符合要求的组件的类全名,将剩余读取到的各个组件的类全名集合返回给IOC容器并将这些组件注册为bean
SpringBoot如何优化启动速度?
(1)检查项目的依赖项,删除不必要的依赖项可以显著减少启动时间。另外,还可以选择更轻量级的替代品或自定义的实现,以减少依赖项的数量和大小。 (2)启用Spring Boot的快速启动模式:在Spring Boot 2.3及更高版本中,引入了快速启动模式,它可以明显减少应用程序的启动时间。您可以在application.properties文件中添加以下配置来启用快速启动模式:
spring.main.lazy-initialization=true
这样可以延迟初始化非必需的bean,加快启动速度。 (3)使用嵌入式数据库:考虑使用嵌入式数据库,如H2或HSQLDB。与传统的数据库相比,嵌入式数据库的启动速度更快,并且不需要额外的配置和安装。 (4)优化自动配置:使用@EnableAutoConfiguration注解的exclude属性来排除特定的自动配置类。 (5)启用Spring Boot的DevTools:Spring Boot DevTools是一组开发工具,可以提供快速的重新启动和自动重新加载功能,从而加快开发周期。您可以添加以下依赖项以启用DevTools:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
DevTools还提供禁用模板缓存和静态资源缓存的选项,可在开发环境中使用,加快启动速度。 (6)使用@Lazy注解来标记需要延迟初始化的bean,从而减少启动时间和内存消耗。 (7)预热缓存和连接池
一个 SpringBoot 项目能处理多少请求?
(1)如果一个SpringBoot 项目未进行过任何特殊的配置,全部采用默认设置,这个项目同一时刻最多能同时处理多少请求,取决于我们使用的 web 容器,而 SpringBoot 默认使用的是 Tomcat。 (2)Tomcat 的默认核心线程数是 10,最大线程数 200,队列长度是无限长。但是由于其运行机制和 JDK 线程池不一样,在核心线程数满了之后,会直接启用最大线程数。所以,在默认的配置下,同一时刻,可以处理 200 个请求。 (3)在实际使用过程中,应该基于服务实际情况和服务器配置等相关消息,对该参数进行评估设置。
什么是跨域?SpringBoot 如何解决跨域问题
什么是跨域
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
SpringBoot 如何解决跨域问题
(1)SpringBoot 配置 CORS 解决跨域,即在我们所有响应头配置允许跨域访问 ①在项目中创建一个新的配置文件,添加@Configuration注解实现WebMvcConfigurer接口 ②重写addCorsMappings方法并设置允许跨域的代码 ③具体代码如下:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 所有接口
.allowCredentials(true) // 是否发送 Cookie
.allowedOriginPatterns("*") // 支持域
.allowedMethods("GET", "POST", "PUT", "DELETE") // 支持方法
.allowedHeaders("*")
.exposedHeaders("*");
}
}
(2)通过 CorsFilter 解决跨域,通过Java Config的方式配置跨域访问,具体代码如下
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class MyCorsFilter {
@Bean
public CorsFilter corsFilter() {
// 1.创建 CORS 配置对象
CorsConfiguration config = new CorsConfiguration();
// 支持域
config.addAllowedOriginPattern("*");
// 是否发送 Cookie
config.setAllowCredentials(true);
// 支持请求方式
config.addAllowedMethod("*");
// 允许的原始请求头部信息
config.addAllowedHeader("*");
// 暴露的头部信息
config.addExposedHeader("*");
// 2.添加地址映射
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**", config);
// 3.返回 CorsFilter 对象
return new CorsFilter(corsConfigurationSource);
}
}
(3)SpringBoot 通过注解解决跨域 可以在我们的控制器类或控制器方法上添加,添加在类上表示里面所有方法都可跨域,添加在方法上表示指定方法可以跨域,具体代码如下:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
@GetMapping
public String getAll() {
return "成功";
}
}
(4)通过 nginx 配置 CORS 解决跨域,如果我们项目有用 nginx 做反向代理服务器时,也可以在nginx中配置CORS来解决跨域
简单回答: 1.添加@Configuration注解实现WebMvcConfigurer接口,重写addCorsMappings方法 2.在我们的控制器类或控制器方法上添加@CrossOrigin注解 3.通过 nginx 配置