即在我们所有响应头配置允许跨域访问,CORS也已经成为主流的跨域解决方案。
在项目中创建一个新的配置文件添加@Configuration注解实现WebMvcConfigurer接口重写addCorsMappings方法并设置允许跨域的代码
一、独立运行
Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
二、简化配置
spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。
三、自动配置
Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
四、无代码生成和XML配置
Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
约定优于配置,并不是零配置或者完全没有配置,而是通过约定来减少配置
1)Spring Boot是一个依靠大量注解实现自动化配置的全新框架。在构建Spring应用时,我们只需要添加相应的场景依赖,Spring Boot就会根据添加的场景依赖自动进行配置,在无须额外手动添加配置的情况下快速构建出一个独立的Spring应用。
2)直接嵌入Tomcat、Jetty 和Undertow 服务器(无须部署WAR文件)
推荐和默认的日志框架是哪个?
Spring Boot 支持 Java Util Logging、Log4j2、Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架。
1.提供了一个配置类,该配置类定义了我们需要的对象的实例化过程;
2.提供了一个spring.factories文件,包含了配置类的全限定名;
3.将配置类和spring.factories文件打包为一个启动器starter;
4.程序启动时通过加载starter.jar包的spring.factories文件信息,然后通过反射实例化文件里面的类。
8.SpringBoot2.x有什么新特性?与1.x的区别?
9. SpringBoot支持什么前端模板?
优点:
1、创建独立Spring应用
2、内嵌web服务器
3、自动starter依赖,简化构建配置
4、自动配置Spring以及第三方功能
5、提供生产级别的监控、健康检查以及外部优化配置
6、无代码生成、无需编写XML
缺点:
1、迭代快
2、封装太深,内部原理复杂,不容易精通
运行springboot有以下4种方式:1.直接启动 2.解包运行 3.自定义运行 4.使用插件
不必要。Spring Boot应用程序本身是一个独立的容器,可以直接运行,无需依赖其他外部容器。Spring Boot内嵌了一个Servlet容器(如Tomcat、Jetty或Undertow),可以通过简单的配置和命令来启动应用程序。
1. 使用@SpringBootAppliation注解:在主应用程序类上使用`@SpringBootApplication`注解,这个注解包含了多个Spring Boot特性的组合,包括自动配置、组件扫描和启动器依赖导入。
2. 使用@EnableAutoConfiguration注解:可以通过在主应用程序类上使用`@EnableAutoConfiguration`注解,来启用Spring Boot的自动配置特性。这样,Spring Boot会自动根据项目的依赖关系,为应用程序自动配置各种功能。
3. 使用@Configuration注解:可以使用`@Configuration`注解来声明配置类,通过在该类中定义`@Bean`注解的方法,来配置应用程序的各种组件。
4. 使用@Import注解:使用`@Import`注解可以将其他配置类导入到主应用程序类中,从而启用额外的Spring Boot特性。
5. 使用 application.properties 或 application.yml 文件:通过在src/main/resources目录下提供一个名为application.properties或application.yml的配置文件,可以配置应用程序的各种属性和特性。
Spring 事务分两种方式:
编程式事务,通过编码方式实现事务。
声明式事务,基于 AOP将具体业务逻辑与事务处理解耦。本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。(建议采用)
在实际使用中声明式事务用的比较多 ,原因在于声明式事务不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码。
实现声明式事务有两种方式:一种是在 XML 配置文件中做相关的事务规则声明;另一种是基于 @Transactional 注解的方式(用的最多
16.Async异步调用方法?
第一种:创建类,并实现ApplicationRunner接口,重写run方法
第二种:创建类,实现CommandLineRunner接口,重写run方法
第三种:注解式,创建方法,添加注解:@PostConstruct
注意事项:不管是实现接口还是使用注解来实现功能,他们的类上都需要添加@Component注解
SpringBoot分别提供3中方式读取项目的application.properties配置文件的内容。这个方式分别为:Environment类、@Value注解以及@ConfigurationProperties注解。
19.什么是JavaConfifig?
Spring Boot的自动配置原理基于条件注解和Spring的条件搜寻技术。当Spring Boot启动时,它会自动扫描classpath下的所有jar包寻找可用的配置,并根据这些配置为应用程序创建Spring上下文。
具体来说,Spring Boot的自动配置原理如下:
Spring Boot扫描classpath下META-INF/spring.factories文件,该文件列出了所有自动配置的类。
每个自动配置类都包含一个或多个条件注解(@Conditional),它们决定了是否启用该自动配置类。
根据条件注解,Spring Boot会根据不同的条件属性来搜索Spring上下文中的Bean,如果Bean存在,则自动配置不会被应用。
如果没有找到与条件匹配的Bean,则自动配置会被应用,并将相关的Bean注入到Spring上下文中。
1、在 SpringApplication 引导类所在的目录下的 /config 文件夹中查找。
2、在类路径中查找,包括 jar 包中的 META-INF/spring.factories 文件中 SpringApplicationInitializer 所引用的配置文件以及总类路径下的 application.properties(application.yml) 文件。
3、通过 spring.config.name 和 spring.config.location 确定的指定位置来加载。
22.如何理解 Spring Boot中的 Starter?
23.如何在 Spring Boot 中添加通用的 JS 代码?
24.Spring Boot 配置的默认 H2 数据库的名宇是上面?
1 修改项目的pom.xml文件
2 创建一个继承SpringBootServletInitializer的类
3 配置Spring Boot项目的入口类
4 执行Maven打包命令
5 部署war包到Servlet容器
Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因
此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION
中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环
境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用
1、多数据源:就是一个项目中使用多个jdbc连接不同的数据库;
例举:一个公司有两个数据库,一个是专门存放共同配置文件的数据库,一个是数据库垂直业务数据库。(垂直:根据业务划分具体数据库)
2、在一个项目中如何划分多数据源:分包名(业务)划分,或者通过注解方式划分
其实也就是怎么区别这个方法或者这个类具体用的哪个数据库
基于 SpringBoot 的多数据源组件,功能强悍,支持 Seata 分布式事务
支持 数据源分组,适用于多种场景,纯粹多库、读写分离、一主多从混合模式
支持数据源敏感配置信息加密 ENC()
支持每个数据库独立初始化表结构 scheme 和数据库 database
支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)
支持 自定义注解,需继承 DS(3.2.0+)
提供并简化 Druid,HikariCp、BeeCp、Dbcp2的快速集成
提供对 Mybatis-Plus、Quartz、ShardingJdbc、P6sy、Jndi等组件的集成方案
提供 自定义数据源来源 方案(如全从数据库加载)
提供项目启动后 动态增加移除数据源 方案
提供 Mybatis 环境下的 纯读写分离 方案
提供使用 spel 动态参数解析数据源方案,内置 spel,session、header,支持自定义
支持 多层数据源嵌套切换(ServiceA >>> ServiceB >>> ServiceC)
提供基于 Seata 的分布式事务方案
提供本地数据源事务方案(附:不能和原生 Spring 事务混合)
在生产中使用HTTPS
使用 Snyk 检查你的依赖关系
升级到最新版本
启用 CSRF 保护
使用内容安全策略防止 XSS 攻击
会话固定攻击:这是一种攻击类型,通过提供相同网站的JSESSIONIDURL 并附加到 URL 中,使用 URL 重写方法,可以窃取您当前的会话。默认情况下,Spring Security Framework 已经处理了这个问题,并且一旦用户登录它就会迁移会话。相应的配置是
保护会话 cookie:恶意脚本可以从浏览器端读取您的 cookie 信息,因此您需要确保您的 cookie 是安全的,并且可以通过制作它们来由服务器端代码访问HttpOnly。为此,您可以在 application.properties 中使用以下配置
在 Https 上运行您的应用程序:确保您在生产中使用 https,并且在这种情况下,您只能通过在 application.properties 中添加以下配置来强制您的 cookie 通过 https 协议传输。
应用 CSP:用户内容安全策略,以避免任何 XSS 攻击。Spring security 默认提供各种安全头。但它不会添加内容安全策略标头。
31.比较一下Spring security和Shiro各 自的优缺点?
1)使用 @CrossOrigin 注解:在需要支持跨域的控制器或方法上添加 @CrossOrigin 注解,可以设置允许跨域的域名、请求方法和请求头等信息。
2)配置 CorsFilter:可以通过配置 CorsFilter 来解决跨域问题,可以在 WebConfig 配置类中注册 CorsFilter 实例。
3)使用 WebMvcConfigurer:通过实现 WebMvcConfigurer 接口并重写 addCorsMappings 方法,可以配置全局跨域请求处理。
Spring boot actuator 是 spring 启动框架中的重要功能之一。Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。
1.扫包优化
会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时,影响会特别明显。会加载一些不需要的多余的实例(beans)。会增加CPU消耗。
针对以上三个情况,我们可以移除 @SpringBootApplication 和 @ComponentScan 两个注解来禁用组件自动扫描,然后在我们需要的 bean 上进行显式配置.
2.将Servlet容器变成Undertow
Undertow是Jboss旗下的一个采用Java开发的灵活的高性能Web服务器,提供包括阻塞和基于NIO的非堵塞机制,吞吐量会比tomcat高出几千,需要先移除tomcat插件。
3.JVM调优
37.如何使用 SpringBoot 自动重装我的应用程序?
1. 使用基于Cookie的session共享:默认情况下,Spring Boot使用基于Cookie的session管理。确保多个微服务的域名和Cookie配置相同,以便在不同的服务之间共享session信息。
2. 使用基于数据库的session共享:将session数据存储在共享的数据库中,以实现不同微服务之间的session共享。可以使用Spring Session将session数据持久化到数据库中。
3. 使用分布式缓存存储session:使用分布式缓存(如Redis、Memcached)来存储session数据,并在多个微服务中共享缓存。可以使用Spring Session和分布式缓存集成来实现。
4. 使用JWT(JSON Web Token)实现状态无关的session管理:JWT是一种基于Token的无状态认证机制,可以在不同的微服务之间共享用户身份信息。使用JWT可以避免session共享的复杂性和管理开销。每个微服务都可以自行验证和解析JWT令牌来获取用户信息。
39您使用了哪些starter maven依赖项?
Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。
总结:
它整合了这个模块需要的依赖库;
提供对模块的配置项给使用者、并可以对配置项提供默认值,使得使用者可以不指定配置时提供默认配置项值,也可以根据需要指定配置项值;
提供自动配置类对模块内的Bean进行自动装配
1. 统一版本管理:`spring-boot-starter-parent`定义了一组被继承的依赖项的版本号。通过继承该父项目,子项目可以省略版本号,而直接使用父项目中定义的版本,保证了项目中各个依赖项的版本一致性。
2. 默认配置和插件管理:`spring-boot-starter-parent`提供了一些默认的配置和插件管理,如编译、测试、打包等。这样,子项目无需显式配置这些共享的构建和插件设置。
3. Maven插件集成:`spring-boot-starter-parent`定义了一组常用的Maven插件,这些插件被广泛用于Spring Boot项目的构建、测试和部署等工作中。
4. 版本升级和维护:`spring-boot-starter-parent`随着Spring Boot的版本发布而升级和更新。通过升级父项目的版本,可以轻松地将子项目迁移到最新的Spring Boot版本,享受新功能和改进。
Spring Boot有两种打包方式:jar, war。两者区别在于jar内嵌了tomact,而war没有。因此jar部署简单快速,也是Spring Boot默认打包方式。
1、 jar打包 网盘进入”spring-boot-cors “项目目录后输入”cmd”打开命令行工具,运行 mvn clean package -Dmaven.test.skip=true 命令,即可快速打包 Spring Boot 应用。
2、 war打包
步骤一:修改pom.xml文件
步骤二:排除内置Tomcat
步骤三:注册启动类(告诉Tomcat应用入口在哪里)
步骤四:war打包生成war包的命令与jar包的方式是一样的,具体命令:mvn clean package -Dmaven.test.skip=true