一、SpringBoot
(1)简介
SpringFramework:最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。使用 DI 或者是 IOC 的时候,可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
Spring MVC:提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
SpringBoot:Spring 和 SpringMVC 的问题在于需要配置大量的参数,通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
(2)Spring Boot 主要优点
1、容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
2、开箱即用,远离繁琐的配置。
3、提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
4、没有代码生成,也不需要XML配置。
5、避免大量的 Maven 导入和各种版本冲突。
二、注解
(1)Spring Boot 的核心注解
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude{DataSourceAutoConfiguration.class})
@ComponentScan:Spring组件扫描。
(2)
三、配置
(1) JavaConfig
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。
使用 JavaConfig 的优点在于:
1、面向对象的配置
2、减少或消除 XML 配置。
3、类型安全和重构友好
(2)Spring Boot 自动配置原理
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,
@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。
筛选有效的自动配置类。
每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能
(3) Spring Boot 配置加载顺序
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
1)properties文件;
2)YAML文件;
3)系统环境变量;
4)命令行参数;
(4) YAML
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
1、YAML 优势
1)配置有序,在一些特殊的场景下,配置有序很关键
2)支持数组,数组中的元素可以是基本数据类型也可以是对象
3)简洁
2、YAML 缺点
不支持@PropertySource 注解导入自定义的 YAML 配置。
(5)Spring Boot 使用 XML 配置
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
(6)spring boot 核心配置文件
单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。
spring boot 核心的两个配置文件:
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不能被覆盖;
application (. yml 或者 . properties):由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。
(7)Spring Profiles
Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。
因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。
四、安全
(1)Spring Boot 应用程序的安全性
为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。
(2)Spring Security 和 Shiro 的优缺点
由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。
Shiro 和 Spring Security 相比,主要有如下一些特点:
Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
Spring Security 功能强大;Shiro 功能简单
(3)Spring Boot 解决跨域问题
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求。
推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
由于登录拦截器和跨域的顺序有问题,出现了跨域的现象,先走filter到达servlet后才进行拦截器的处理,把cors放在filter里,就可以优先于权限拦截器执行。
(4)CSRF 攻击
CSRF 代表跨站请求伪造。
这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。
五、问题
(1)Spring Boot Stater
启动器是一套方便的依赖的描述符,它可以放在自己的程序中。一站式的获取所需要的 Spring 和相关技术,而不需要依赖描述符的通过示例代码搜索和复制黏贴的负载。
其它的启动器项目
Spring Boot 也提供了其它的启动器项目包括,包括用于开发特定类型应用程序的典型依赖项。
spring-boot-starter-web-services - SOAP Web Services
spring-boot-starter-web - Web 和 RESTful 应用程序
spring-boot-starter-test - 单元测试和集成测试
spring-boot-starter-jdbc - 传统的 JDBC
spring-boot-starter-hateoas - 为服务添加 HATEOAS 功能
spring-boot-starter-security - 使用 SpringSecurity 进行身份验证和授权
spring-boot-starter-data-jpa - 带有 Hibeernate 的 Spring Data JPA
spring-boot-starter-data-rest - 使用 Spring Data REST 公布简单的 REST 服务
(2) spring-boot-maven-plugin
pring-boot-maven-plugin 提供了一些像 jar 一样打包或者运行应用程序的命令。
spring-boot:run 运行你的 SpringBooty 应用程序。
spring-boot:repackage 重新打包你的 jar 包或者是 war 包使其可执行
spring-boot:start 和 spring-boot:stop 管理 Spring Boot 应用程序的生命周期(也可以说是为了集成测试)。
spring-boot:build-info 生成执行器可以使用的构造信息。
(3)Spring Boot 中添加静态资源
在源文件夹下,创建一个名为 static 的文件夹,把静态的内容放在里面
(4)Spring Data
Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。
SpringData 项目支持 NoSQL 存储:
MongoDB (文档数据库)
Neo4j(图形数据库)
Redis(键/值存储)
Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术:
JDBC
JPA
Spring Data Jpa 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成
(5)Spring Data REST
Spring Data TEST 可以用来发布关于 Spring 数据库的 HATEOAS RESTful 资源。
JPA注解
@RepositoryRestResource(collectionResourceRel = "data", path = "data")
path- 这个资源要导出的路径段。
collectionResourceRel- 生成指向集合资源的链接时使用的 rel 值。在生成 HATEOAS 链接时使用。
(6)JPA 和 Hibernate 有哪些区别?
JPA 是一个规范或者接口
Hibernate 是 JPA 的一个实现
使用 JPA 的时候,使用 javax.persistence 包中的注释和接口时,不需要使用 hibernate 的导入包。
建议使用 JPA 注释,因为没有将其绑定到 Hibernate 作为实现,可以使用另一种 JPA 实现。
(7)Spring Boot 用户应用程序自定义配置的最好方法是什么
@Value 的问题在于,您可以通过应用程序分配你配置值。
更好的操作是采取集中的方法,使用 @ConfigurationProperties 定义一个配置组件。
(8)在 spring-boot-starter-web 中用 jetty 代替 tomcat
在 spring-boot-starter-web 移除spring-boot-starter-tomcat依赖项,并把spring-boot-starter-jetty些添加进去。
(9)如何使用 Spring Boot 生成一个 WAR 文件
pom.xml修改为如下代码,主要两个改动
新加打包成war的声明:
<packaging>war</packaging>
spring-boot-starter-tomcat修改为 provided方式,以避免和独立 tomcat 容器的冲突.
表示provided 只在编译和测试的时候使用,打包的时候就没它。
(10)Spring Boot 应用程序作为 Java 应用程序运行时,后台会发生什么
当启动 java 应用程序的时候,spring boot 自动配置文件就会魔法般的启用了。
当 Spring Boot 应用程序检测到正在开发一个 web 应用程序的时候,它就会启动 tomcat。
(11) 创建一个 Spring Boot Project 的最简单的方法
Spring Initializr是启动 Spring Boot Projects 的一个很好的工具
(12)SpringBoot 打成jar和普通的jar有什么区别
Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过java -jar xxx.jar命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。
Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将 Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。
(13)运行SpringBoot有几种方式
打包用命令或者放到容器中运行
用Maven或Gradle插件运行
直接执行main方法运行
(14)开启Spring Boot特性有哪几种方式
继承spring-boot-starter-parent项目
导入spring-boot-dependencies项目依赖
(15)什么是Swagger
Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger消除了调用服务时的猜测。
(16)如何使用Spring Boot实现异常处理
Spring提供了一种使用ControllerAdvice处理异常的非常有用的方法。通过实现一个ControlerAdvice类,来处理控制类抛出的所有异常。
(17)什么是FreeMarker模板
FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。使用 Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。最后使用freemarker 可以将这些结合起来,给出最终的输出页面
(18)SpringBoot有哪几种读取配置的方式
Spring Boot 可 以 通 过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量。
(19)Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架。
(20)保护SpringBoot应用有哪些方法
在生产中使用HTTPS
使用Snyk检查你的依赖关系
升级到最新版本
启用CSRF保护
使用内容安全策略防止XSS攻击
(21)SpringBoot 2.X有哪些新特性?与1.X有什么区别
配置变更
JDK版本升级
第三方类库升级
响应式Spring编程支持
HTTP/2支持
配置属性绑定
更多改进与加强