
Spring Boot学习笔记
文章平均质量分 68
本专栏记录在spring boot学习过程中的知识点
骑着蜗牛向前跑
纵若急风起
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Failed to determine a suitable driver class
Description:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following: If you want an embedded database (H2,原创 2022-10-19 15:30:49 · 552 阅读 · 0 评论 -
spring 单元测试为 logback 添加环境变量
spring 单元测试为 logback 添加环境变量原创 2022-09-07 12:17:03 · 1827 阅读 · 0 评论 -
java 时间类型和 mysql 时间类型对应关系
java 时间类型和 mysql 时间类型对应关系原创 2022-08-07 13:02:27 · 806 阅读 · 0 评论 -
java 从 HDFS 读取数据到本地文件
java 代码从 hdfs 读取数据到本地文件并合并数据原创 2022-08-07 12:32:13 · 1205 阅读 · 0 评论 -
两种 java 向 yarn 提交 spark 任务命令的区别
client.run() client.submitApplication()client.monitorApplication原创 2022-07-26 20:51:29 · 746 阅读 · 0 评论 -
log4j2 jdbc appender
项目要求将关键日志存储到mysql中,遂研究下log4j2…。原创 2022-07-22 20:30:35 · 870 阅读 · 0 评论 -
不同环境下控制@Schedule 开启
场景应用程序中有多个调度任务。@EnableScheduling 注解放在启动类上可以实现在生产环境下开启全部调度任务。但如果在单元测试中通过"class.method"只实测指定某个调度功能时,使用 @SpringBootTest注解会开启项目中的全部调度任务,这可能会造成单元测试失败,甚至是数据异常。@SpringBootApplication@EnableSchedulingpublic class VocDataWarehouseSyncApplication { public stati原创 2022-04-19 11:01:33 · 1858 阅读 · 1 评论 -
Spring boot 配置健康检查
依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.6.6</version></dependency>配置management: endpoint: health: pro原创 2022-04-07 17:53:49 · 6696 阅读 · 0 评论 -
基于 mockMvc 的 Controller 层单元测试
场景单元测试是个让人很纠结的东东,dealline 催的很紧,不想写单测,但当项目复杂到一定程度需要重构时,返现没有单测,不敢随便改代码,生怕”敲一锤子,倒一大片“,但此时再补,已经有点晚了。磨刀不误砍柴功,这会偷的懒后面总要跟你算账的,所以还乖乖写吧。单测目的这个很重要,不清楚目的,就不知道接下来该怎么做。这样也行,那样好像也可以,埋头写一大片,很快就没了兴趣,而且还会很烦写单测。常见 web 服务大都是 controller、service、repository 三层架构。每一层都有各自的任务,基原创 2022-03-05 01:13:20 · 1818 阅读 · 0 评论 -
spring boot + hibernate + h2 搭建单元测试
场景在开发中经常会遇到持久化层的单元测试,如果直接连 MySQL 那就需要本地提前安装好,并且在每个测试 case 上加回滚操作,这当然是能做到的,但终究有种很”重“ 的感觉。使用 H2 内存数据库,就可以实现随地单测,并且每个测试 case 执行完毕后 session 自动关闭,从而批量跑单测的时候(CICD)多个 case 之间不会相互影响。所以搭建内存数据库用作持久化层的单元测试是很有必要的。搭建网上有很多这方面的博客,对对错错那就要靠自己踩坑甄别了,一番操作后做以记录。添加依赖<原创 2022-02-08 16:46:41 · 1116 阅读 · 0 评论 -
spring boot 参数校验国际化异常信息
场景validator 校验参数不通时,将错误信息保存到 BindingResult,最后使用 i18n 根据不同国家和地区展示对应的异常信息。要求配置好后不需要再在应用程序中添加额外代码,就能实现上述功能。在 springboot 大行其道的今天,使用 spring boot 的 validator 校验请求参数,再由 BindingResult 将异常信息抛出,这种解决方法随处可见。但坑就在这里:spring boot 的 validator 不支持异常信息国际化,要使用 hibernate val原创 2022-02-04 23:41:37 · 2549 阅读 · 0 评论 -
基于 sentry 搭建异常监控服务
有一个活忙完了,踩了坑,写个博客记录下。场景任务很简单,基于 sentry 做个异常监控,CS 架构,当应用程序出现异常时,将信息发送给 sentry 服务器,服务器可以存储、展示、或者邮件提醒用户有异常出现。那这就涉及两部分:服务端搭建 和 客户端信息上报。服务端搭建官方 sentry 镜像过期了Sentry 是开源的异常监控服务,它的搭建网上有很多资料,但是好多都过时了。尤其不能从官方镜像库基于 docker 搭建 sentry 服务。这个博客写的很清楚,照着操作是 work 的。但.原创 2022-01-14 12:12:45 · 1678 阅读 · 0 评论 -
guava Event Bus 使用方式和半 Spring 式 Event Bus
1.场景描述遇到个需求:在发放给用户奖励的时候,将奖励明细记录下来。部分代码如下:// 从数据库中读取 userGameInfo。UserGameInfo userGameInfo = getUserGameInfo(userId);//...... 其他逻辑 .....// 给 userGameInfo 增加 faceValue 的奖励,再 save 到数据库中。userRepository.saveUserGameInfo(userGameInfo.addGold(faceValue));原创 2021-11-04 14:15:51 · 1333 阅读 · 0 评论 -
一个 Spring 应用程序性能监控方案
Actutaor 内部集成了 Micrometer,可以对应用程序进行监控和管理。Actuator 内置了非常多的 endpoint(health、info、beans、metrics、shutdown等),而且允许创建自定义的 endpoint。Prometheus 通过读 actuator 暴露的 endpoint,将应用的程序的运行参数按照时间序列持久化。Grafana 读取 prometheus 存户的数据,渲染到 UI 界面,对外展示。使用方式加入依赖:implementation '.原创 2021-07-19 18:29:23 · 645 阅读 · 0 评论 -
Spring Boot 事务实现过程(二)
接上一篇博客这篇博客主要介绍事务对象已经被封装成了代理对象,那代理对象是怎么执行事务的目标方法的。#1. 代理对象执行目标放方法的整体逻辑。public class Main { public static void main(String[] args) throws Exception { // 创建容器。 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicat原创 2021-06-29 18:04:10 · 391 阅读 · 1 评论 -
Spring Boot 事务实现原理(一)
1.事务相关的类spring 事务也是通过 aop 实现的,那肯定也有切面、切点、通知、为目标对象创建代理对象,代理对象执行目标方法等等。先小小回顾一下普通 aop 的相关知识点:切面、切点、通知 都是自定义的,根据需求开发不同的切面。在项目启动时,AnnotationAwareAspectJAutoProxyCreator 解析了所有切面 ,为每一个通知创建一个增强器,并将所有的增强器注入容器中。在项目启动时, bean被创建后要执行初始化,在初始化过程中,AnnotationAwareA原创 2021-06-26 16:27:20 · 1014 阅读 · 1 评论 -
Spring AOP 的 Advice 和 Advisor 有什么区别
简单来说:Advice 是通知,Advisor 是增强器。(说了跟没说一样…)使用 spring aop 要定义切面,切面里面有 通知 和 切点。在项目启动的过程中,项目中的所有切面会被 AnnotationAwareAspectJAutoProxyCreator 解析,它会找到切面中的每一个通知以及通知对应的切点,拿这二者构建一个新的对象,这个对象就是 Advisor()。最后将所有解析得到的增强器注入到容器中。// 这是项目中增强器的类型final class InstantiationMode原创 2021-06-25 10:45:35 · 3646 阅读 · 0 评论 -
Spring Boot 事务传播特性
Spring Boot 事务的传播特性指的是:方法 A 内部调用了方法 B,且二者都有 @Transaction 注解,此时事务该怎么处理?// A 方法@Transactionalpublic void externalMethod() throws Exception { userRepository.updateUserMoney("diego",900); userService.internalMethod(); int number = 9; if (num原创 2021-06-24 17:40:22 · 772 阅读 · 1 评论 -
Spring AOP 的实现过程
1. 什么是 aop?aop 的作用是在书写上将辅助业务逻辑从主业务的逻辑中拆出来,实现主业务和辅助业务的解耦,但在执行主业务逻辑的时候,辅助业逻辑业也会执行。从而保证拆前拆后功能不变。那辅助业务拆出来放在哪里?辅助业务封装在切面中,所以 面向切面编程。什么是切面?切面就是一个类,并且被 @Aspect 注释。辅助业务在切面的哪里?辅助业务封装在切面的方法里,不同的方法封装不同的辅助业务逻辑。切面中的方法是怎么触发的呢?给封装辅助业务逻辑所在的方法标注 @Before 、@After、@A原创 2021-06-23 20:32:22 · 2007 阅读 · 2 评论 -
Spring Boot 自动配置过程
写个文字版,记忆模糊了就来着看看…Spring Boot 项目在启动时会自动加载许多类,为这些类创建各自的 bean 并保存在 applicationContext 中。这些自动加载的类可以分为两种:第一种:用户自己写的业务类,比如被 @Controller、@Respository、@Service 等注释的类,他们是通过解析 @ComponentScan 注解执行基包扫描被注入 applicationContext 的。第二种:项目依赖的jar 包中的类,像 AopAutoConfigurat.原创 2021-06-17 19:17:10 · 375 阅读 · 2 评论 -
解决 @Validate 在 Service 层的单元测试不生效(二)
前面记录的第一种方式与其说是单测更像是集成测试,将方法的入口参数和方法里面的业务逻辑一起给测试了,写法也稍微复杂些,更重要的是多个测试案例一起跑可能会相互有影响。service 层的测试可以将 方法入口参数 和 方法中的业务逻辑分开做单测,因为最终的目的是让整个项目有一个较为全面的单测覆盖,以便日后可以很洒脱的做重构。service 层的方法:public void createNewUser(CreateUserCommand createUserCommand);方法入口参数长这个样子,要校验原创 2021-05-14 10:47:48 · 1953 阅读 · 0 评论 -
解决 @Validate 在 Service 层的单元测试不生效
@Validate、@Vaild 注解之前被用在 controller 层做 requestBody 参数校验。项目打算将 controller 层变薄,requestBody 放到 service 层做校验,那这样的话,之前相关的单侧也要移到 service 层才可以。结果发现 这两个注解在 service 层的单测中不生效,开始搞事情。代码不能直接贴,写了个简化版的。@Service@Validatedpublic class UserService { public void原创 2021-05-10 21:44:29 · 6336 阅读 · 1 评论 -
流程图:Spring aop 拦截器链调用
Spring Boot 启动过程:1. 创建 SpringApplication 对象。2. 执行对象的 run() 方法。3. 将 class 变成 beanDefinition。4. 将 beanDefinition 变成 bean5. 图解 循环依赖6. 图解 bean 的生命周期7. 图解 aop 拦截器链调用...原创 2021-05-10 01:24:08 · 846 阅读 · 1 评论 -
流程图:Spring bean 的生命周期
Spring Boot 启动过程:1. 创建 SpringApplication 对象。2. 执行对象的 run() 方法。3. 将 class 变成 beanDefinition。4. 将 beanDefinition 变成 bean5. 图解 循环依赖6. 图解 bean 的生命周期7. 图解 aop 拦截器链调用...原创 2021-05-07 00:37:30 · 448 阅读 · 1 评论 -
流程图:Spring 解决循环依赖
1. 循环依赖// A.java@Componentpublic class A { @Autowired private B b; public String getA(){ return a; }}// B.java@Componentpublic class B { @Autowired private A a; public String getB(){ return b; }}在程序启动时,A、B在各自 bean原创 2021-05-06 19:21:05 · 774 阅读 · 0 评论 -
Spring Boot 启动过程(四):将 beanDefinition 变成 bean
还剩下最后一个阶段: beanDefinition --> bean。该阶段是在下面的方法中执行的。/** AbstractApplicationContext.java*/public void refresh() throws BeansException, IllegalStateException { // .... // 实例化所有剩余(非懒加载)的单例。 finishBeanFactoryInitialization(beanFactory);}在执行f原创 2021-05-02 10:58:57 · 2008 阅读 · 0 评论 -
SpringBoot启动过程(三)class 变成 beanDefinition
Spring Boot 在启动是执行了自动配置:class --> beanDefinition --> bean。这篇文章主要想梳理下:class 是怎么变成 beanDefinition 的。上一篇博客提到过,执行 run 方法中 invokeBeanFactoryPostProcessors(beanFactory) 方法执行了这一变换,看下这个方法了到了干了什么?1. invokeBeanFactoryPostProcessors/** AbstractApplicationCont原创 2021-04-28 10:42:29 · 1515 阅读 · 1 评论 -
spring boot 启动过程(二)run()方法
上一篇博客中写到,spring boot 应用程序在启动时先创建了 SpringApplication 对象,并且将框架默认的 启动引导器、初始化器、监听器都从文件加载到 SpringApplication 对象中。这篇博客先整体看下 run 方法做了什么。1. 先概述下 run 方法做了什么事情它创建了一个上下文(Context) 里面有个 IOC容器(BeanFactory),并且为系统默认的一些类和开发者写的一些类创建了一个对象(每一个对象叫做 一个bean),最后将这些对象放到了 IOC容器.原创 2021-04-26 01:09:08 · 1881 阅读 · 0 评论 -
BeanFactory 和 FactoryBean 的区别
是翻译过来的,自己重新组织了下:原文在这里,需要科学上网。在 Spring 中,有两个接口:BeanFactory 和 FactoryBean 因为名字相近很容易被混淆。那他们之间有什么区别呢?先说结论:BeanFactory: 是 IOC 容器,并且提供方法支持外部程序对这些 bean 的访问,在程序启动时 根据传入的参数产生各种类型的 bean,并添加到 IOC容器 中。FactoryBean: 首先是个 bean,也存放在 BeanFactory 中。它具有工厂方法的功能,在程序运行中 产生原创 2021-04-14 21:42:06 · 7844 阅读 · 2 评论 -
spring boot 启动过程(一):创建 SpringApplication 对象
Spring Boot 启动过程从代码上分为了两部分:创建 SpringApplication对象;执行对象的 run() 方法。@SpringBootApplicationpublic class AutoconfigApplication { public static void main(String[] args) { SpringApplication.run(AutoconfigApplication.class, args); }}1. 创建 SpringApplic原创 2021-04-05 17:45:37 · 2190 阅读 · 2 评论 -
spring security(一):默认的配置都干了什么
先啰嗦一些理论。客户端请求发送到 web 服务之前,以及 web 服务的响应返回到客户端之前,需要经过一系列的过滤器(这些过滤器组成了一个过滤器链)。过滤器有两个作用:(1)阻止请求发送到后面的过滤器或者 web 服务;(2)修改请求或者响应的内容再送到后面去。图中的 Servlet 就是程序员开发的 web 应用。如果这块不太清楚,建议刷一下《Hand First Servlet & Jsp》。1、过滤器和负责安全校验的过滤器。根据 filter 功能的不一样,比如:魔改请求与响应、校验用原创 2020-12-09 11:19:20 · 677 阅读 · 0 评论 -
spring boot + mybatis + h2 配置 + 源码
开发需要写单测,遇到持久化测试的场景。如果用 MySQL 或者其他本地数据库,等项目迁移后需要重新配置数据库,很麻烦。更难以接受的是 单测时 MySQL 不会回滚数据,这导致单测跑完,数据库里存了一堆数据。手动不清空可能会影响到下次测试,更有甚者是在一次测试中,前后两个单测相互影响,跑挂了测试。如果采用内存数据库,就可以避免上述的问题。之前配置过,结果忘得差不多了。这次因为其他需求,要在搞一遍,顺带这记录下配置细节。1、源码demo2、 添加依赖compile group: 'com.h2data原创 2020-12-04 18:23:57 · 2302 阅读 · 1 评论 -
OncePerRequestFilter 和 Filter 有什么区别?
OncePerRequestFilter 实现了 Filter 接口,但是两者有什么区别呢?在使用上方法上:MyFilter implement Filter 的类,要重写 doFilter(****) 方法。将所有的业务逻辑都写到里面去。OncePerRequestFilter 实现了 Filter 并且已经重写了 doFilter(****),@Overridepublic final void doFilter(ServletRequest request, ServletResponse原创 2020-12-02 15:14:22 · 9819 阅读 · 8 评论 -
Spring Boot 过滤器使用 + 测试代码
1 什么是过滤器1.1 过滤器在一个请求的哪个环节?过滤器是拦截请求和响应的。准确的说是在请求到达 controller(servlet)前,和响应返回给浏览器之前被过滤器拦截,过滤器可以对请求和响应做些处理。下图中的容器可以理解为 tomcat。1.2 过滤器是干什么用的请求过滤器可以:做安全检查(用户认证)、重新格式化请求首部或者请求体、建立请求审计或日志。响应过滤器可以:压缩响应流、追加或者修改响应流、创建一个完全不同的响应。没有什么”请求过滤器“或者”响应过滤器“ 之分,请求被哪个过滤原创 2020-12-01 19:10:55 · 742 阅读 · 0 评论 -
spring boot 请求转发和重定向
在尝试过滤器的时候牵扯到请求转发的场景,就顺手测试了一下。这里记录基本的使用套路。1. 添加依赖maven:<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artif原创 2020-12-01 15:44:16 · 16000 阅读 · 1 评论 -
四个小问题,简单解释一下 tomcat 和servlet 的关系
1. Servlet 是什么?servlet 是个 sun 公司开发的一种web技术,这个技术制定了一个规范,落实到代码上他就是一个接口。那这个规范是做什么用的呢?这个规范是处理网络请求用的,所以,实现了这些规范的类是用来处理网络请求的。// Servlet.java 是源码,在官方 jar 包里。public interface Servlet { public void init(ServletConfig config) throws ServletException; publ原创 2020-11-27 20:57:43 · 1419 阅读 · 0 评论 -
记一次手动创建 servlet java web 项目
如果高手翻到这篇文章,请忽略它。内容很简单,可能还不太透彻,写的也很啰嗦。小白可以姑且看下,如果觉得谬论太多,也请忽略。前几天在 zhi hu 上看到一个话题回答,观点是说:学习java web 不应该直接从 spring boot 等框架着手,而是先学习 Servlet,框架实则是对技术进行了封装,虽使初学者容易上手,但少了份明白。我当时挺有感触的,自己”打怪升级“正好遇到了”过滤器“和”拦截器“,自然扯出了 servlet,”IDEA + spring 框架 + 平时工作大多是业务逻辑“ 这样的场.原创 2020-11-22 16:07:08 · 2489 阅读 · 0 评论 -
java Comparator 多个字段比较
List 中元素需要排序时,需要比较元素值,当元素是复杂对象时,有时需要根据多个字段进行排序。package com.example.demo.domain;import lombok.Getter;import lombok.NoArgsConstructor;import lombok.ToString;@Getter@ToString@NoArgsConstructorpublic class Employee { private Long id; private Stri原创 2020-10-20 19:05:47 · 5241 阅读 · 0 评论 -
用洋葱架构实现领域驱动设计
刚开始做java开发,用博客记录一些知识,做以积累。这篇文章大部分都是翻译的英文资料,英语一般,翻译的有点蹩脚,外加自己的少部分理解。原英文资料:Domain-Driven Design with Onion Architecture国外一位开发者 Wade Waldron结合洋葱架构使用了领域驱动设计后,代码质量得到显著的提高,并且可读性、可理解性和易于维护性也都大大加强。洋葱架构有时候也...原创 2019-02-28 15:06:26 · 1339 阅读 · 0 评论 -
身份认证和权限控制
这次在读《kubernetes权威指南》时,看到第六章对身份认证和权限控制这部分的内容。自己平时虽然一直都在使用这两个功能,但理解的最觉得很片段。这里将原理整体介绍了(自己感觉的),在此做以摘抄。我们都知道,Kubernetes 集群中所有的资源访问和变更都是通过 Kubernetes API Server 的 REST API 来实现的,所以集群安全的关键点就在于如何识别并认证(Authentication)客户端身份,以及随后的访问权限的授权(Authorization)这两个关键的问题,本节对认证管原创 2020-09-13 17:41:01 · 1145 阅读 · 0 评论