![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
spring boot
文章平均质量分 86
fenglllle
这个作者很懒,什么都没留下…
展开
-
Tomcat get请求传数组集合参数
最近做项目,需要通过GET传参,来实现查询的能力,本来是RPC调用,直接参数序列化即可。但是服务最近修改为HTTP,本来Spring Cloud的feign也可以直接传参数,但是当使用Nginx访问时参数到底传啥呢,笔者传入?list=['xxx']直接就报错了,错误类型。原创 2024-06-24 22:54:32 · 1005 阅读 · 0 评论 -
Spring boot 注入成员变量HttpServletRequest的原理
最近做项目,springboot项目,本来我们在controller的requestmapping取参数值或者返回写时,使用方法参数,但是发现老项目直接注入了成员变量,Spring本身是单例的,如果是成员变量注入,那么也是单例的,怎么实现不同的请求读取不同的参数呢,如果实现线程安全呢,笔者立马想到了ThreadLocal,但是如果要说就是这个原理,那么必须源码证明。原创 2024-05-21 22:25:12 · 837 阅读 · 0 评论 -
@Configuration自身循环依赖及解决办法
实际上循环依赖不仅是Spring Bean的循环依赖,还有接口调用的循环依赖,不过Springboot在2.6.0版本已经默认不允许循环依赖,就是不解决这个问题了,如果spring.main.allow-circular-references配置true,那么还是可以跟以前一样,不过不确定什么时候就移除这个配置。另外自身循环依赖比较特别,主要是Springboot下动态代理的结果,本身方法的引用是不会出现循环依赖的。原创 2024-05-04 16:54:42 · 866 阅读 · 0 评论 -
Maven插件打fatjar的一些技巧
最近做项目,Java实际上一般情况也不用fatjar,毕竟CICD都是流水线构建,不过在预研的过程中,使用fatjar可以内置manifest的main类直接启动,就很方便,尤其是在服务器运行环境。实际上golang还是很方便的,可以交叉编译二进制可执行文件,不过在交叉编译跨语言的能力的时候经常很难弄环境。实际上工作中大部分Java项目都是通过这种jar方式来来执行的,当然也可以封装java class -cp xxx的方式执行,不过文件太分散,不便管理。原创 2024-04-07 18:49:12 · 1164 阅读 · 0 评论 -
mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑
mybatis plus这个是直接丢弃相同Id的statement,安装先后顺序,会造成执行过程的误解,不过有日志可以查看,而且mybatis原生的starter是有校验的,直接报错了。mybatis的xml如果写错,那么启动居然不报错,执行任意statement前需要执行未完成的statement,来达到快速失败的情况,这种情况对健康检查提出了新挑战,否则可能出现启动OK,但是mybatis失败的情况。原创 2024-01-09 22:46:08 · 995 阅读 · 0 评论 -
Spring多个条件注解不同但BeanId相同的冲突
这个问题实际上出现不是很频繁,但是如果不经意就会出现我们不可预知的问题,尤其是初始化的情况,不同条件初始化绝对不一样,出现这种问题,我们很难知道根源,因为异常被吞了,启动也OK。当然解决问题是不使用id相同的Bean创建方式,因为如果异常,只要其中一个Bean创建成功即可成功,没异常我们发现不了问题;如果没有异常,相同的Bean id会被后创建的Bean替代,但是在相同id的时候是都会尝试创建,@ConditionOnXxx就不会执行,这个会跟我们需要的情况相违背。原创 2023-12-03 22:08:28 · 1169 阅读 · 0 评论 -
grpc Java demo与Springboot改造支持grpc通信
最近调研grpc的情况,发现grpc实际上还是HTTP2协议,实际上就是http2+proto传输。那么是否可以在现有的server支持呢,试了下,还真可以,但是笔者在返回数据时有个问题一直没有思路。原创 2022-11-13 11:50:36 · 1121 阅读 · 0 评论 -
容器环境注入Spring属性不一致却能生效
最近使用容器部署应用,Spring应用,会注入一些环境变量,然而这些环境变量的大小写和真实的取值差异很大,而且也不是xxx.xxx,而是xxx_xxx,非常奇怪,代码里也没发现原因。通过分析Spring源码发现,原理就是Spring的特殊处理,以及Spring的设计。原创 2022-09-19 22:03:38 · 256 阅读 · 0 评论 -
intellij idea在macOS下卡顿的问题解决方法
不知道从什么时候开始intellij idea的run和debug Springboot项目时非常卡,经常要卡顿很久才能启动,笔者只以为是idea的优化不太好,但是通过搜索,发现很多提问卡顿的,有说退回2018版本就不卡了。也有说配置jvm的堆大小的,但是笔者配置堆大小没用。...原创 2022-08-26 22:34:49 · 3170 阅读 · 0 评论 -
YAML格式文件实践
前言yaml格式现在已经很通用了,yaml有简介已读的格式,在容器环境或者微服务被大量使用,只是使用的过程还是properties的key的方式存储使用,可能跟Spring的发展历程有关,Spring使用PropertySource存储配置数据,而原生的yaml使用还有很多不便利的地方。1. yaml yml properties实际上yaml yml都是一种格式,Spring仅定义了Yaml的类,properties是HashTable包装。在Spring的存储中是用PropertySou原创 2022-03-17 11:01:15 · 1459 阅读 · 0 评论 -
Spring 事件源的用途
前言Spring已经非常熟悉,Spring容器状态事件也是日常使用的功能,经常用于解耦,但是有时候事件却会重复的监听,此时就需要处理了,source也是有特殊用途的。1. demo构造一个Spring boot应用,写一个监听器。@SpringBootApplicationpublic class EventMain { public static void main(String[] args) { ConfigurableApplicationContext原创 2021-11-01 21:21:53 · 686 阅读 · 0 评论 -
restTemplate文件上传与下载
前言上一章写了个文件上传的form表单解析器,但是有时候需要文件上传透传,当然也可以使用分布式文件系统解决这个问题,只是很多时候文件上传只是一个小功能,但是又不可或缺。其实文件上传下载可以通过restTemplate来实现,可以通过文件流的方式或者临时文件转发,推荐文件流,避免写文件清理的过程。1. restTemplaterestTemplate实际上是使用execute方法,随意看一个方法,最终调用execute方法,其他类似跟踪execute方法,doExecute prot原创 2021-07-18 18:54:11 · 7246 阅读 · 0 评论 -
Java应用启动mainclass与Spring boot启动的原理
前言最近把旧项目的框架更换为Spring boot,打包方式更为jar启动,其实以前也不是war部署,而是通过main方式启动的,这里看看原理。1. main方式启动的原理java 命令启动可以-jar也可以直接带main class,那么直接启动带main方法的类即可启动应用 <!-- Assembly plugin --> <plugin> <groupId>org.apa原创 2021-05-30 21:26:28 · 5296 阅读 · 2 评论 -
Spring boot 2.1 RequestMappingHandlerMapping url信息
前言最近做项目,业务升级Spring boot的高一点的版本,发现以前mapping信息在日志不打印了,这就很难受了,毕竟看日志是一个基本日常,突然发现不能一眼看出HTTP的URL mapping了。都不知道是否成功,另外不知道那些URL是否成功提供HTTP能力,可能是为了安全考虑,Spring 5.1开始居然看不见requestmapping信息了。1. demo随意一个Spring boot,官方脚手架去下载即可,IDEA自动生成即可。1.1 如何打印mapping信息其实Sprin原创 2021-05-19 22:53:05 · 780 阅读 · 2 评论 -
Spring boot BeanPostProcessor优先级
前言其实是一个老项目,项目中有aop,有BeanPostProcessor注入Spring bean的属性。当orader一样时,那么加载顺序就很重要。如何保证绝对的加载逻辑就与Spring的原理相关了。源码简单分析即可明白Spring的设计。1. demo构造1.1 demopom<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" .原创 2021-05-16 19:26:20 · 772 阅读 · 1 评论 -
Spring boot 自定义Banner
前言最近看到各类框架每次加载都会打印各类各式各样的banner,发现打印banner其实很简单,想着Spring boot其实也可以定义banner,从源码的角度发现banner其实很简单。1. Spring boot banner源码解析1.1 demo构建一个Spring boot demo <dependencies> <dependency> <groupId>org.springframewor原创 2020-11-30 22:31:33 · 290 阅读 · 0 评论 -
Spring boot admin 日志
前言以前写过Spring Boot Admin的使用教程,还配置了各种路径参数。最近有留言说client的log怎么查看,其实log这个没写是因为,不能满足性能与管理的需要,ELK技术很成熟,搜索也是,备份管理都有现成的,但是估计有些小公司不需要这样的技术,只需要可以快速查看的日志入口就可以了。下面来试试。1. SBA log示例此次使用consul + admin + client1. 1 consul启动由于我的电脑是macos,只需要./consul agent -dev即可,wi原创 2020-10-28 21:56:14 · 6038 阅读 · 15 评论 -
Java 单元测试(2)mock
单元测试mock前言1. mock1.1 什么情况需要mock1.2 mock的分类1.3 有哪些mock2. mockito2.1 mock引入2.2 demo模拟2.3 mock2.4 InjectMocks2.5 spy2.6 打桩2.6.1 方法打桩2.6.2 异常打桩2.6.3 参数、返回值打桩verify灵魂powermock前言上一章讲解了 Java单元测试 标准模式。但实际情况是,往往我们工作中很多时候需要依赖第三方服务或者中间件才能执行单元测试,这时就需要一个关键工具mock。1.原创 2020-05-16 22:26:07 · 1704 阅读 · 0 评论 -
Spring Boot Filter 顺序源码分析
前言 笔者写的spring boot项目的filter,使用@WebFilter不能自定义顺序,使用Bean注入又不能定义拦截路径。一定要定义FilterRegistrationBean的Bean才能同时生效,本章从源码的角度分析为什么。1. 使用ServletComponentScan启动分析在SpringBoot启动后,会扫描jar的包可以看到扫描了Se...原创 2020-04-13 23:13:39 · 1368 阅读 · 0 评论 -
Spring Boot Filter 双返回值的问题源码分析
前言 笔者的项目出现双返回值的问题,然而返回String的返回值时却十分正常,引起了笔者的好奇心。这章源码分析一下,主要从filter的过滤计数、双返回值的执行过程、一次性filter的用法分析。1. filter执行过程 先简单说一下,每次执行请求,Tomcat等容器会创建责任链,filter的执行时,框架会计数,每个filter做一次dofilter操作,...原创 2020-03-30 22:22:07 · 818 阅读 · 0 评论 -
Spring Boot Filter 顺序与双返回值的问题
前言 最近做项目,以前有filter,需要移植到spring boot(filter是servlet时代的产物,不是Spring的)上去,发现一些坑。filter设置次序没用,以前web.xml文件配置的,另外还有多次dofilter的问题,导致某些情况下,返回2份数据。比如下面的{"name":"tom","age":18}{"name":"tom","age":18}...原创 2020-03-16 22:07:51 · 742 阅读 · 0 评论 -
Spring Boot Admin client配置 context-path与base-path 后 Spring Boot Admin 监控不到Spring Cloud信息
前言 上一章说了Spring Boot Admin(SBA)的client端自定义management.server.servlet.context-path、management.endpoints.web.base-path来解决一个Tomcat多个实例的问题。但是这个配置eureka instance是SBA Admin端通过eureka server获取的配置不能识别的,SB...原创 2020-02-14 23:25:05 · 4404 阅读 · 5 评论 -
Spring boot admin 2.2.1 (二) 管理单应用多实例、权限与邮件通知
前言 上一章说了spring boot admin管理spring boot应用,但是没有权限认证,邮件通知,什么情况一个应用多实例(不推荐这种做法),就技术而言一个应用多个boot实例是会冲突的,需要配置解决冲突。1. Securing Spring Boot Admin Server在spring boot admin server端加入pom依赖 ...原创 2020-02-14 09:34:47 · 3119 阅读 · 0 评论 -
Spring Boot Admin 2.2.1 (一) 使用
前言 最近做项目,需要对现有的spring boot项目做一个类似console界面,管理与监控boot应用,干脆就直接在spring boot admin定制了。先了解spring boot admin吧。对于spring boot admin,每个应用都是客户端,通过 HTTP 或者使用 Eureka 等注册中心注册到 admin server 中,前端展示。定制化一般而言,主...原创 2020-02-11 23:54:04 · 2355 阅读 · 6 评论 -
Spring Cloud(Greenwich.SR1) - 服务负载均衡feign
前言我们已经集成ribbon与hystrix,实现服务的负载均衡与熔断,在Spring Cloud中,使用feign已经集成这两种功能。新建一个module实现feign-service服务,pom依赖如下 <dependency> <groupId>org.springframework.cloud</groupId&...原创 2019-03-17 22:30:46 · 2374 阅读 · 0 评论 -
Spring Cloud(Greenwich.SR1) - 服务熔断Hystrix
前言hystrix是netflix开源的服务熔断组件,在Spring Cloud中整合进来,形成Spring Cloud的熔断降级体系。服务降级主要是为了服务雪崩,造成下游的服务不可用,可用性是分布式服务的必须要求。1. ribbon服务在上一章的ribbon服务,仅需添加netflix的组件,加入注解即可,下面来改造ribbon-consumer项目,熔断是服务调用方执行。pom...原创 2019-03-17 21:52:24 · 1164 阅读 · 0 评论 -
Spring Cloud(Greenwich.SR1) - 服务负载均衡ribbon
前言Spring Cloud的服务调用使用RESTFUL接口,Spring Cloud就是基于HTTP的restTemplate调用的,ribbon就是一个负载均衡,ribbon本意是轮训,意味着Spring Cloud的默认负载均衡是轮训策略。1. ribbon service provider要负载均衡需要服务提供方至少2个或以上的provider,所以我们要建2个提供方,建立ri...原创 2019-03-17 19:59:28 · 748 阅读 · 0 评论 -
Spring Cloud(Greenwich.SR1) - 服务注册,注册中心eureka ha与consul
前言上一章讲了Spring cloud的注册中心eureka server,现在说说如何实现eureka server的高可用,并尝试使用第三方注册中心consul,毕竟eureka server已经不在迭代维护。1. eureka server高可用的本质eureka server是使用相互注册实现高可用,数据相互写入实现数据的同步。eureka server自身也是一个eureka...原创 2019-03-17 16:52:28 · 1054 阅读 · 0 评论 -
Spring Cloud(Greenwich.SR1) - 服务注册,注册中心
前言现在很多公司都在推行目前流行的微服务(2014年)框架,Spring Cloud作为一个目前流行的微服务框架,基于Spring Boot开发而成,具有服务治理,负载均衡,熔断,网关,配置中心,监控,链路跟踪……Spring Cloud不是最完美的,但是一体系解决方案。Spring Cloud的架构设计是建立在Spring Boot的基础骨架之上的,所以一般的Spring Cloud的教...原创 2019-03-12 22:08:12 · 9076 阅读 · 3 评论 -
Spring事件发布监听,顺序监听,异步监听
前言最近在做公司的业务需要用到事件通知,比如启动成功打印日志,通知其他业务做相应的操作,就用到了Spring的事件通知机制。1. Spring的事件通知 Spring的事件通知本质上就是发布-订阅,即生产者-消费者;体现了观察者设计模式或者回调通知,那么Spring的事件是如何使用的?有3要素:发布者-->事件-->监听者2. Spring事件通知使用...原创 2019-03-09 21:24:06 · 7577 阅读 · 0 评论 -
spring boot项目启动源码解析new SpringApplication(primarySources)
前言 上一章讲述了快速构建spring boot项目,这一章讲述spring boot是什么。1. spring boot stater查看快速构建的项目pom文件 <!-- 依赖关系 --> <dependencies> <dependency> <groupId>org...原创 2018-12-31 12:21:10 · 820 阅读 · 0 评论 -
Spring Boot 2.1.3.RELEASE集成alibaba与apache的dubbo
前言最近在做项目中常用Spring Cloud框架,由于以前的框架使用RPC(dubbo)服务化,现在需要在spring boot集成dubbo。dubbo版本太旧2.4.几,顺便升级了2.6.6;另外由于dubbo交于Apache维护,尝试升级了Apache的dubbo。1. alibaba的dubbo集成spring boot的demo1.1 建立parent项目spring-bo...原创 2019-03-22 21:41:49 · 5376 阅读 · 0 评论 -
Spring FactoryBean的源码分析
前言Spring的基础能力BeanFactory与FactoryBean,beanFactory定义了Bean创建的工厂;factoryBean定义了Bean如何创建。最近做项目,发现部分自定义工厂bean,在spring容器中定义bean直接使用FactoryBean对象。虽然在实际使用的时候发现创建了实现FactoryBean的类的getObject方法的对象。1.demo分析...原创 2019-04-23 21:53:29 · 221 阅读 · 0 评论 -
Spring boot打war包
前言 最近在处理旧业务需要war部署,并准备升级框架spring boot,就需要Spring boot打一个war,发布到tomcat。1. 准备pom依赖spring boot,去除spring boot starter web内置的嵌入式tomcat,但程序依赖JavaEE的jar可以使用provided依赖。 <packaging>...原创 2019-05-07 21:24:32 · 685 阅读 · 1 评论 -
Spring Boot自定义starter
前言 我们经常封装自己写的框架代码,用于重复使用,通过jar依赖,代码触发来实现框架的插件的能力。在Spring-boot的框架中经常用到xxx-starter实现mybatis,mongodb,kafka等第三方中间件的服务,仅需在application等properties配置文件中写少量的配置即可实现。下面我来自行实现一个简单的starter。 start...原创 2019-05-25 18:53:32 · 616 阅读 · 0 评论 -
Spring boot异步任务原理分析
前言 我们经常在需要提升性能或者项目架构解耦的过程中,使用线程池异步执行任务,经常使用ThreadPoolExecutor创建线程池。那么Spring对异步任务是如何处理的呢?1. spring 异步任务 估计或多或少了解过一些,比如@EnableAsync可以开启异步任务,@Async用于注解说明当前方法是异步执行,下面使用demo看看Spring的异...原创 2019-06-10 22:02:40 · 27082 阅读 · 1 评论 -
Spring Boot排除自动加载数据源
前言 有些老项目使用Spring MVC里面有写好的数据库连接池,比如redis/mongodb/mybatis(mysql其他Oracle同理)。在这些项目迁入spring boot框架时,会报错。原因是我们业务写好了连接池,但spring boot在jar包存在的时候会主动加载spring boot的autoconfiguration创建连接池,但我们并未配置Spring Bo...原创 2019-07-07 21:04:11 · 18885 阅读 · 3 评论 -
嵌入式tomcat的不使用web.xml原理分析
前言 前面的章节讲了嵌入式tomcat使用web.xml启动,这章说说不使用web.xml启动tomcat。有了这个就明白Spring Boot是如何在没有web.xml的的情况下实现web能力的,以后的tomcat容器应用就可以实现jar运行,十分方便。1. servlet标准首先看Oracle的javaEE文档Interface ServletContainerInit...原创 2019-07-20 16:21:22 · 3737 阅读 · 3 评论 -
Spring Boot server.port配置原理
前言 我们经常配置server.port=xxx,但其实这是一个比较复杂的过程才生效的,这次讲讲生效的过程。1. autoConfigure本质来源于自动配置org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfigurationTomcatServletWe...原创 2019-07-27 14:33:24 · 17779 阅读 · 2 评论 -
Spring Boot 静态资源不重启刷新,自定义配置
前言 经常做Spring Boot开发,有很多时候不需要前后端分离,比如后管系统。开发的时候每次修改页面就需要重启,极度不方便。其实Spring Boot设计是不需要重启的,只是我们没注意用法而已。1. demopom & main<dependencies> <dependency> <g...原创 2019-07-27 13:58:59 · 8622 阅读 · 1 评论