技术栈 | 传送门 |
JAVA 基础 | 手撸架构,Java基础面试100问_vincent-CSDN博客 |
JAVA 集合 | 手撸架构,JAVA集合面试60问_vincent-CSDN博客 |
JVM 虚拟机 | 手撸架构,JVM面试30问_vincent-CSDN博客 |
并发编程 | 手撸架构,并发编程面试123问_vincent-CSDN博客 |
Spring | 手撸架构,Spring面试63问_vincent-CSDN博客 |
Spring cloud | 手撸架构,Spring cloud面试45问_vincent-CSDN博客 |
SpringBoot | 手撸面试,Spring Boot面试41问_vincent-CSDN博客 |
Netty 与 RPC | 手撸架构,Netty 与 RPC面试48问_vincent-CSDN博客 |
Doubo | 手撸架构,Dubbo面试49问_vincent-CSDN博客 |
Redis | 手撸架构,Redis面试41问_vincent-CSDN博客 |
Zookeeper | 手撸架构,Zookeeper面试27问_vincent-CSDN博客 |
Mysql | 手撸架构,Mysql 面试126问_vincent-CSDN博客 |
MyBatis | 手撸架构,MyBatis面试42问_vincent-CSDN博客 |
MongoDB | 手撸架构,MongDB 面试50问_vincent-CSDN博客 |
Elasticsearch | 手撸架构,Elasticsearch 面试25问_vincent-CSDN博客 |
RabbitMQ | 手撸架构,RabbitMQ 面试49问_vincent-CSDN博客 |
Kafka | 手撸架构,Kafka 面试42问_vincent-CSDN博客 |
Docker | 手撸架构,Docker 面试25问_vincent-CSDN博客 |
Nginx | 手撸架构,Nginx 面试40问_vincent-CSDN博客 |
算法 | 常用排序算法总结(1)-- 比较排序_vincent-CSDN博客_比较排序 常用排序算法总结(2)-- 非比较排序算法_vincent-CSDN博客_非比较排序的算法有 |
分布式事务 | 分布式事务解决方案(总览)_vincent-CSDN博客 |
HTTP | 太厉害了,终于有人能把TCP/IP 协议讲的明明白白了_vincent-CSDN博客_tcp和ip |
多年来,随着新功能的增加,spring 变得越来越复杂。只需访问 https://spring.io/projects
页面,我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如果必
须启动一个新的 Spring 项目,我们必须添加构建路径或添加 Maven 依赖关系,配置应用程
序服务器,添加 spring 配置。因此,开始一个新的 spring 项目需要很多努力,因为我们现
在必须从头开始做所有事情。
Spring Boot 是解决这个问题的方法。Spring Boot 已经建立在现有 Spring 框架之上。使用
Spring 启动,我们避免了之前我们必须做的所有样板代码和配置。因此,Spring Boot 可以
帮助我们以最少的工作量,更加健壮地使用现有的 Spring 功能。
Spring 框架提供多种特性使得 web 应用开发变得更简便,包括依赖注入、数据绑定、切面编程、数据存取等等。
随着时间推移,Spring 生态变得越来越复杂了,并且应用程序所必须的配置文件也令人觉得可怕。这就是 Spirng Boot 派上用场的地方了 – 它使得 Spring 的配置变得更轻而易举。
实际上,Spring 是 unopinionated(予以配置项多,倾向性弱) 的,Spring Boot 在平台和库的做法中更 opinionated ,使得我们更容易上手。
这里有两条 SpringBoot 带来的好处:
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IOC 容器的纯 Java 方法。因此
它有助于避免使用 XML 配置。
使用 JavaConfig 的优点在于:
这可以使用 DEV 工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式 tomcat 将重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生 产力。Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务 器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次 手动部署更改的需要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员 最需要的功能。DevTools 模块完全满足开发人员的需求。该模块将在生产环境中被禁用。
它还提供 H2 数据库控制台以更好地测试应用程序。
org.springframework.boot spring-boot-devtools true
Spring boot actuator 是 spring 启动框架中的重要功能之一。
Spring boot 监视器可帮助您访 问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和 监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。
监视器 模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态。
Pinpoint: https://github.com/naver/pinpoint
默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有 ACTUATOR 角色的用户才能访 问它们。安全性是使用标准的 HttpServletRequest.isUserInRole 方法实施的。 我们可以使用 management.security.enabled = false 来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。
为了在自定义端口上运行 Spring Boot 应用程序,您可以在 application.properties 中指定端口。
server.port = 8080
YAML 是一种人类可读的数据序列化语言,它通常用于配置文件。
与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。
Spring Profiles 允许用户根据环境读取使用配置文件(dev,test,prod 等),Spring Boot 使得使用配置文件非常简单。
单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。
spring boot 核心的两个配置文件:
先在properties配置文件中配置两个数据源,创建分包mapper,使用@ConfigurationProperties读取properties中的配置,使用@MapperScan注册到对应的mapper包中
为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添
加安全配置。它只需要很少的代码。配置类将必须扩展 WebSecurityConfigurerAdapter 并覆
盖其方法。
由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是 Spring Boot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro 和 Spring Security 相比,主要有如下一些特点:
CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的 Web 应用
程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击
者无法查看对伪造请求的响应。
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
对于集成 Spring Boot 和 ActiveMQ,我们使用 spring-boot-starter-activemq 依赖关系。 它只需要很少的配置,并且不需要样板代码。
使用 Spring Boot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页的 org.springframework.data.domain.Pageable 传递给存储库方法。
Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。
当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻 辑来理解远程服务并与其进行交互。因此,Swagger 消除了调用服务时的猜测。
Spring Boot Batch 提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟 踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供了更先进 的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。
Spring Batch 之 背景框架简介_vincent-CSDN博客
FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。使用 Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。最后使用 freemarker 可以将这些结合起来,给出最终的输出页面。
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。
@ControllerAdvice是在类上声明的注解,其用法主要有三点:
@RestControllerAdvice
public class GlobalHandler {
private final Logger logger = LoggerFactory.getLogger(GlobalHandler.class);
// 这里@ModelAttribute("loginUserInfo")标注的modelAttribute()方法表示会在Controller方法之前
// 执行,返回当前登录用户的UserDetails对象
@ModelAttribute("loginUserInfo")
public UserDetails modelAttribute() {
return (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
// @InitBinder标注的initBinder()方法表示注册一个Date类型的类型转换器,用于将类似这样的2019-06-10
// 日期格式的字符串转换成Date对象
@InitBinder
protected void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
// 这里表示Controller抛出的MethodArgumentNotValidException异常由这个方法处理
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result exceptionHandler(MethodArgumentNotValidException e) {
Result result = new Result(BizExceptionEnum.INVALID_REQ_PARAM.getErrorCode(),
BizExceptionEnum.INVALID_REQ_PARAM.getErrorMsg());
logger.error("req params error", e);
return result;
}
// 这里就是通用的异常处理器了,所有预料之外的Exception异常都由这里处理
@ExceptionHandler(Exception.class)
public Result exceptionHandler(Exception e) {
Result result = new Result(1000, "网络繁忙,请稍后再试");
logger.error("application error", e);
return result;
}
}
怎么禁用某些自动配置特性?
如果我们想禁用某些自动配置特性,可以使用 @EnableAutoConfiguration 注解的 exclude 属性来指明。例如,下面的代码段是使 DataSourceAutoConfiguration 无效:
// other annotations
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }
如果我们使用 @SpringBootApplication 注解 — 那个将 @EnableAutoConfiguration 作为元注解的项,来启用自动化配置,我们能够使用相同名字的属性来禁用自动化配置:
// other annotations
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyConfiguration { }
我们也能够使用 spring.autoconfigure.exclude 环境属性来禁用自动化配置。application.properties 中的这项配置能够像以前那样做同样的事情:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
为了注册一个自动化配置类,我们必须在 META-INF/spring.factories 文件中的 EnableAutoConfiguration 键下列出它的全限定名:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration
Spring Initializr是启动 Spring Boot Projects 的一个很好的工具。
这有助于增加更少的依赖关系,并减少版本的冲突。
我们都知道,新创建一个 Spring Boot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
总结就是打包用的
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 ,一个可执行,一个可引用。
通常,我们将 web 应用程序打包成 WAR 文件,然后将它部署到另外的服务器上。这样做使得我们能够在相同的服务器上处理多个项目。当 CPU 和内存有限的情况下,这是一种最好的方法来节省资源。
然而,事情发生了转变。现在的计算机硬件相比起来已经很便宜了,并且现在的注意力大多转移到服务器配置上。部署中对服务器配置的一个细小的失误都会导致无可预料的灾难发生。
Spring 通过提供插件来解决这个问题,也就是 spring-boot-maven-plugin 来打包 web 应用程序到一个额外的 JAR 文件当中。为了引入这个插件,只需要在 pom.xml 中添加一个 plugin 属性:
org.springframework.boot
spring-boot-maven-plugin
有了这个插件,我们会在执行 package 步骤后得到一个 JAR 包。这个 JAR 包包含所需的所有依赖以及一个嵌入的服务器。因此,我们不再需要担心去配置一个额外的服务器了。
我们能够通过运行一个普通的 JAR 包来启动应用程序。
注意一点,为了打包成 JAR 文件,pom.xml 中的 packgaing 属性必须定义为 jar:
jar
如果我们不定义这个元素,它的默认值也为 jar。
如果我们想构建一个 WAR 文件,将 packaging 元素修改为 war:
war
并且将容器依赖从打包文件中移除:
org.springframework.boot
spring-boot-starter-tomcat
provided
执行 Maven 的 package 步骤之后,我们得到一个可部署的 WAR 文件。
spring-boot-maven-plugin 提供了一些像 jar 一样打包或者运行应用程序的命令。
对于一个 Spring Boot 应用程序来说,你可以生成一个包含 Embedded Tomcat 的应用程序 jar。你就可以想运行正常 Java 应用程序一样来运行 web 应用程序了。
嵌入式服务器就是我们的可执行单元包含服务器的二进制文件(例如,tomcat.jar)。
在 spring-boot-starter-web 移除现有的依赖项,并把下面这些添加进去。
像其他 Java 程序一样,一个 SpringBoot 命令行程序必须要有一个 main 方法。这个方法作为一个入口点,通过调用 SpringApplication#run 方法来驱动程序执行:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class);
// other statements
}
}
SpringApplication 类会启动一个 Spirng 容器以及自动化配置 beans。
要注意的是我们必须把一个配置类传递到 run 方法中作为首要配置资源。按照惯例,这个参数一般是入口类本身。
在调用 run 方法之后,我们可以像平常的程序一样执行其他语句。
SpringBoot 对外部配置提供了支持,允许我们在不同环境中运行相同的应用。我们可以使用 properties 文件、YAML 文件、环境变量、系统参数和命令行选项参数来声明配置属性。
然后我们可以通过 @Value 这个通过 @ConfigurationProperties 绑定的对象的注解或者实现 Enviroment 来访问这些属性。
以下是最常用的外部配置来源:
SpringBoot中的松绑定适用于配置属性的类型安全绑定。使用松绑定,环境属性的键不需要与属性名完全匹配。这样就可以用驼峰式、短横线式、蛇形式或者下划线分割来命名。
例如,在一个有 @ConfigurationProperties 声明的 bean 类中带有一个名为 myProp 的属性,它可以绑定到以下任何一个参数中,myProp、 my-prop、my_prop 或者 MY_PROP。
Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
Spring Boot 2.x 新特性总结及迁移指南