spring源码
布道
专注但要有大局观(先大后小,思路为先,实验为辅)
展开
-
spring-core:内省之MethodIntrospector
关于java bean的内省模式与spring bean的关联在之前的章节已经讲过。接下来要分享下方法内省MethodIntrospector,自从spring 4.2.3中开始支持,如果有热剩饭的感觉那你完全可以跳读了。//源自package org.springframework.core;public final class MethodIntrospector { public ...原创 2020-04-30 18:37:49 · 1747 阅读 · 0 评论 -
spring5的那些事:@Indexed 解密
随着云原生的发展,很多技术会被重新掂量,重新定义,历来技术的发展也是遵循天时地利,以其势尽享其利。再云原生下,jdk的最大的问题在于笨重(几百mb),启动慢,而像Serverless架构,NodeJS技术栈可谓更完美。其实在jdk9中倡导模块化本质在于减少JVM的体积,不需要资源(Jar)不用再加载,而启动慢的问题其实也有解决方案GraalVM (一款类似于HotSpot VM),它的先进之处在于...原创 2020-02-29 18:27:58 · 5278 阅读 · 0 评论 -
spring core:@AliasFor的派生性
spring对Annotation的派生性应用可谓炉火纯青,在spring core:@Component的派生性讲过支持层次上派生性,而属性上派生的需求则借助了@AliasFor,它是从spring4.2中开始支持的。@AliasFor注解用于声明注解元素的别名,应用于方法上(别忘了注解本质是接口)。Spring框架在内部使用大量的使用这个注解,例如,@Bean,@ComponentScan...原创 2019-12-31 19:15:03 · 7661 阅读 · 1 评论 -
spring core:@Component的派生性
spring对注解的拓展,早已超越J2EE的规约。通过注解可以实现其派生性(Annotation Hierarchy)。自从spring2.5开始,每个大版本都对其进行了增强。何为派生?没错一般能想到的就是属性派生,直接上代码,其实Parent和Child看似是派生的关系,但实则并无关系!它们是两个毫无关联的接口(我在面试的时候会提问:注解和接口的关系),通过javap -v .\Ch...原创 2019-12-31 15:13:29 · 1658 阅读 · 2 评论 -
论spring事务下的消息发送
最近一直疲于重构canal consumer的客户端,近期也会陆续分享下一些开发同学常见的问题。其实很多时候发现问题并快速的解决问题并不难,难得时候是否有引起你的深度思考。谈起spring事务下发MQ消息,一般人都是直接撸面条式的硬代码,也有些高级的玩法会采用spring的ApplicationEvent来拓展实现,而spring中的@TransactionEventListener则是最高端的玩...原创 2019-11-17 20:53:41 · 1515 阅读 · 0 评论 -
spring boot中如何启动tomcat或jetty的
最近面试中会聊到这个话题,说实话之前已经做过大量spring boot源码级的分享,如果你在之前看过Spring Boot 容器启动原理揭秘,想必已经有了一个大概的认识。启动tomcat或jetty其实也跳不出这个套路,或者讲它仅仅是其中的一个环节,通过AbstractApplicationContext.onRefresh()完成的。知识回顾Spring Boot的一个及其吸引人的特性是...原创 2019-07-09 22:58:11 · 3701 阅读 · 0 评论 -
Spring Boot 访问安全之认证和鉴权
在web应用中有大量场景需要对用户进行安全校,一般人的做法就是硬编码的方式直接埋到到业务代码中,但可曾想过这样做法会导致代码不够简洁(大量重复代码)、有个性化时难维护(每个业务逻辑访问控制策略都不相同甚至差异很大)、容易发生安全泄露(有些业务可能不需要当前登录信息,但被访问的数据可能是敏感数据由于遗忘而没有受到保护)。为了更安全、更方便的进行访问安全控制,我们可以想到的就是使用springmvc的...原创 2019-07-04 10:26:17 · 17925 阅读 · 0 评论 -
Spring Cloud Feign和Ribbon源码系列汇总篇
Spring cloud 中服务之间通过restful方式调用。一种是RestTemplate+Ribbon,另一种是Spring cloud Feign默认集成Ribbon。原创 2019-05-05 15:01:25 · 45139 阅读 · 0 评论 -
Spring Cloud Hystrix:番外篇Sentinel
Hystrix是社区中非常活跃的限流降级神器,之前也花了几周的时间去研究分享源码,而Sentinel 是阿里中间件团队2018年开源的另一款面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。Sentinel 和之前常用的熔断降级库 Netflix Hystrix的异同点: Sentinel ...原创 2019-05-05 14:38:50 · 641 阅读 · 0 评论 -
Spring Cloud Hystrix 源码系列汇总篇
随着服务化的大规模演化,每个应用系统对这些依赖的稳定性与否对系统的影响非常大。而依赖有很多不可控问题:网络连接缓慢,资源繁忙,服务暂时不可用等。特别是高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险。Netflix 公司开发并成功使用Hystrix,它是社区中非常活跃的限流降级神器。Netflix 应用系统规模TheNetflixAPIprocesses10+b...原创 2019-05-05 14:28:43 · 3647 阅读 · 0 评论 -
Pandora Boot和spring Boot
在阿里集团内部,几乎所有的应用都用到了各式各样的中间件,比如HSF、TDDL、Diamond等等。本身中间件之间可能就有版本依赖的问题,比如你的应用HSF和Diamond分别依赖了同名jar包的不同版本,maven只会引入其中一个版本。同样的中间件和应用之间也存在同样的Jar包依赖的问题,出于要解决这些依赖冲突的问题,阿里就开发了Pandora ,中文名潘多拉,简单的来说就是一个类隔离容器。P...原创 2019-04-26 10:50:42 · 15051 阅读 · 5 评论 -
@Import注入之ImportSelector和ImportBeanDefinitionRegistrar
在spring-boot中随处可以见的就是@Import,它的作用就是通过导入的方式把实例注入到IOC中,本文主要介绍下@Import的用法。知识点回顾:给IOC容器中注册Bean的方式:包扫描+组件标注注解(@Controller/@Service/@Repository/@Component) @Bean @Import@Import源码可以发现@Import注解只能注解在...原创 2019-04-23 22:13:49 · 2043 阅读 · 0 评论 -
spring boot中Date时区错乱
由于系统中采用了spring-boot中jar方式(内嵌tomcat容器)运行,发现new Date()获取的时间与当前系统时间间隔了8个小时,初步断定是时区错乱导致。实际上系统的运行环境是在docker中,并且使用apollo作为配置中心。其实解决它并不复杂,通过添加命令行参数-Duser.timezone=GMT+08就可以解决它。然后很多时候,我们发现了这样的一个现象:告诉运维,某个...原创 2019-04-08 18:21:06 · 8071 阅读 · 0 评论 -
Spring4.1新特性 SmartInitializingSingleton在Ribbon中应用
SmartInitializingSingleton是spring 4.1中引入的新特效,与InitializingBean的功能类似,都是bean实例化后执行自定义初始化,都是属于spring bean生命周期的增强。但是,SmartInitializingSingleton的定义及触发方式方式上有些区别,它的定义不在当前的bean中(a bean's local construction ph...原创 2019-03-31 19:39:38 · 2328 阅读 · 0 评论 -
Springboot中HandlerInterceptor与HttpMessageConverter异常冲突
为何要讲HandlerInterceptor与HttpMessageConverter异常冲突呢?其实社区也有不少文章讲过(没有讲清楚),很多时候也存在滥用的情况,这里更多是从源码分析他们,并从中学习spring在请求处理这块优秀之处。目录示例代码HandlerInterceptor基础知识源码HttpMessageConverter基础知识:HandlerAdapte...原创 2019-03-30 19:46:08 · 2127 阅读 · 0 评论 -
Spring Cloud的 Feign和Ribbon重试机制的误区
在spring cloud项目中,因为用了feign肯定会用到ribbon,二者都提供了重试功能。引入的重试机制保证了高可用的同时,也会带来一些其它的问题,如幂等操作或一些没必要的重试。但很多人对其重试机制经常混淆,接下来将分析Feign和 Ribbon 重试机制的实现原理和区别。结论Feign和 Ribbon重试,其实二者的重试机制相互独立,并无联系。如果一个http请求,如果fe...原创 2019-03-28 19:16:01 · 4790 阅读 · 0 评论 -
spring cloud的Feign Hystrix Ribbon配置详解及原理
在之前的文章,分享了Feign、Hystrix、Ribbon的基本原理及源码实现,其中最让人头痛的就是配置,这也是很多开发者在使用spring-cloud-netflix组件最烦心的事(netflix的Archaius和相互交织),有时候感叹:见鬼了,我的配置怎么没生效,配置读取的好像不太对....诸如此类的问题!不过随着Spring Cloud Netflix项目进入维护模式,说实话Spring...原创 2019-03-27 23:14:13 · 10029 阅读 · 1 评论 -
Spring Cloud Ribbon源码解析
负载均衡就是用来帮助我们将众多的客户端请求合理的分配到各个服务器,以达到服务端资源的充分利用和更少的请求时间,它是日活亿级用户的网站架构中最重要的手段。而Ribbon实现正向代理的软负载均衡,Spring cloud Feign默认集成Ribbon,所以注解@FeignClient的类,默认实现了ribbon的功能,在之前的spring cloud-feign源码中已经提过LoadBalancer...原创 2019-03-24 22:12:10 · 5124 阅读 · 0 评论 -
Spring Cloud Hystrix 源码系列:熔断器
circuit-breaker,circuit表示电路,译为熔断器非常精准,而Hystrix属于自动恢复的智能熔断器,它保护的着你的系统,宿主在调用方的应用系统中,避免因为依赖系统的异常或宕机而引发一系列连锁反应。Hystrix原理也比较简单,在一个时间窗口下,通过不断收集依赖服务(第三方)请求指标信息(sucess、failure、timeout、rejection),当达到设定熔断条件时(...原创 2019-03-23 17:20:08 · 1054 阅读 · 0 评论 -
Spring Cloud Hystrix 源码系列:Metrics 收集
在 Hystrix Command 执行过程(开始执行、结束执行、异常、超时)时会不断发出各类事件,通过收集这些数据,提供给消费者。如断路器、Hystrix Dashboard可以统计分析这些数据,从而完成特定的功能。本文基于hystrix-core1.5.18(近年来几乎很少更新,建议升级)。目录1. rxjava1.2Observable.share1.3 Subject...原创 2019-03-21 21:40:40 · 1202 阅读 · 0 评论 -
spring boot中慎用@EnableWebMvc
什么情况?我为了自定义了一个HandlerInterceptor,非常普通的做法,先是继承了WebMvcConfigurerAdapter,再添加了@EnableWebMvc。注:本篇基于spring-webmvc 4.3.9版本。@EnableWebMvc@Configurationpublic class XXXAutoConfiguration extends WebMvcConf...原创 2019-03-21 20:53:11 · 8445 阅读 · 1 评论 -
Spring Cloud Hystrix 源码系列:HystrixCommandAspect 入口解析
在前面的文章已经基本上讲过Hystrix的由来,功能介绍及工作原理。本篇开始正式进入Hystrix 源码分析阶段,将带你深入简出的理解HystrixCommandAspect、HystrixCommand、HystrixObservableCommand的内部构建。本文基于hystrix-core1.5.18(近年来几乎很少更新,建议升级)。目录1. HystrixCommandAspe...原创 2019-03-21 17:49:46 · 2665 阅读 · 0 评论 -
spring cloud 系列之Netflix Archaius
在之前的系列讲过Hystrix的核心实现源码,多次提及到Archaius(Netflix公司开源项目之一),其实Netflix的所有组件都是通过它获取配置。Archaius主要用于多配置存储的动态获取,基于对apache common configuration类库的扩展。本文基于hystrix-core1.4.26(最新的1.5.18会有些差别)。//比如Hystrix有使用publi...原创 2019-03-17 16:32:49 · 1956 阅读 · 1 评论 -
微服务框架 spring-cloud 绝非你唯一的选择
Spring Cloud全家桶的构建是建立在Spring Boot基础上的,特别上容器化技术已经成熟,以快而著称,号称3秒内启动。其实企业级的docker容器一般内存低于4g(快),如何解决SpringBoot巨耗内存,构建慢,启动也很慢,这确实是每个架构师一个很值得思考的问题!当然,Spring Cloud的工艺水平有多优秀,更新速度之快,稳定性,成熟度,早已在很多大型的企业级的应用中得到验证。...原创 2019-03-14 22:22:46 · 1253 阅读 · 1 评论 -
spring boot @SpringBootApplication @EnableAutoConfiguration 的工作原理
在spring boot中@SpringBootApplication、@EnableAutoConfiguration是最常见Annotation,且最为重要,所以本文将展开对此的解读。@SpringBootApplication在spring框架中的处理尤为复杂,然后能将它的来龙去脉(加载机制)讲清楚的文章非常少。说实话你要完全理解及解读它,需要对spring3.x的源码有一定程度了解,主要...原创 2019-03-10 18:07:30 · 1479 阅读 · 0 评论 -
Spring Boot 容器启动原理揭秘
不得不讲SpringBoot 使用起来太方便了,它的外表轻巧简单,在企业级的应用系统中非常流行,已经成为java开发者必备技能。而它采用的one-jar的方案已经深入人心,其实one-jar技术早在2004年就已经被提出,除此之外spring boot的强大的自动配置类也是非常的受用,总之用过的童靴都会很感觉一个字“爽”。但是 SpringBoot它内部实现却非常的复杂,它常常把爱研究源码的读者绕...原创 2019-03-08 21:50:20 · 16140 阅读 · 0 评论 -
Spring boot 源码分析-Conditional
在Spring Boot中大量的应用到@Conditional条件注解,Condition接口是spring4.0增加的条件判断接口,用于判断条件满足情况,主要集中在Bean的定义和使用。当前文章基于spring boot1.5.4.RELEASE,spring-core4.3.9.RELEASE。目录1. 用法演示1.1 小结1.2 spring Condtion拓展集2...原创 2019-03-07 17:01:06 · 842 阅读 · 0 评论 -
Spring Cloud Hystrix 源码系列:HystrixRequestContext
在讲HystrixRequestContext之前,先了解下Hystrix 跨线程传递数据的知识,我们都知道ThreadLocal、InheritableThreadLocal跨父子线程传递数据。本文基于hystrix-core1.5.18(近年来几乎很少更新,建议升级)需求描述服务A 通过 Feign + Hystrix 调用服务B,服务间调用时需传递 JWT Token,希望在Fei...原创 2019-03-02 22:18:15 · 3694 阅读 · 0 评论 -
spring mvc的DataBinder、Validator、BeanWrapper、ConversionService、Formatter
很多人对spring mvc的请求处理流程都不陌生,今天我们要展开讲解的是请求体数据body的绑定、验证、格式化、类型转换,它是怎样实现的呢?其实就是大家熟悉的HandlerAdapter干的事情。为何要讲这个呢?其实和我最近的工作内容是分不开的,刚好在设计开发一个数据聚合组件(它主要是解决微服务化后vo 拆分之疼),当然后续会开源出来的。目录spring mvc知识回顾BeanW...原创 2019-03-02 16:57:28 · 3663 阅读 · 0 评论 -
Spring Cloud Hystrix 源码系列:隔离策略和请求缓存
隔离是一种常见的风险控制(保护)手段,Hystrix 也使用了隔离策略,称之为bulkhead pattern,翻译为:舱壁隔离模式(舱壁将船体内部空间划分成多个舱室,将舱与舱之间严密分开,在航行中,即使有舱破损进水,水也不会流到其他舱)。本文基于hystrix-core1.5.18(近年来几乎很少更新,建议升级)目录1. Hystrix 隔离1.1 Thread Pool1....原创 2019-02-27 21:45:20 · 7303 阅读 · 0 评论 -
Spring Cloud Hystrix 源码系列:工作原理
Hystrix 译为 "豪猪",豪猪的棘刺能保护自己不受天敌伤害,代表了强大的防御能力。Hystrix 基于 RxJava 进行实现,RxJava 是一种基于观察者模式的响应式编程框架。Spring Cloud Hystrix 基于 Netflix Hystrix 实现,具备服务降级、服务熔断、线程与信号隔离、请求缓存、请求合并以及服务监控等强大功能。本文基于hystrix-core1.5.18...原创 2019-02-27 20:13:10 · 1882 阅读 · 1 评论 -
Spring Cloud Netflix项目进入维护模式
这两年最热门的微服务化话题,Spring Cloud Netflix真可谓璀璨夺目。熟悉spring cloud的同学都知道下面张图,netflix公司的贡献非常大。不过最近2018-12-12日,Netflix宣布Spring Cloud Netflix系列技术栈进入维护模式(不再添加新特性),距离上次宣布Eureka 2.0闭源(Spring Cloud 还是在1.x 上面开发的,最新版本依赖...原创 2018-12-26 12:31:56 · 4516 阅读 · 0 评论 -
java冷知识:java bean内省模式与spring bean的关联
最近一直整理着搜索引擎相关的主题,后续也准备多分享一些spring相关的技术。正所谓温故而知新,java bean内省模式对spring bean的影响非常深,真可谓是青出于蓝而胜于蓝。目录1.JavaBeanIntrospector1.1BeanDescriptor1.2MethodDescriptor1.3PropertyDescriptor1.4Param...原创 2018-12-21 12:55:52 · 5244 阅读 · 1 评论 -
spring ObjectProvider 源码分析
在新spring框架(4.x系列)源码中经常可以看到ObjectProvider<T>的语法,而在度娘查找资料,你发现几乎找不到能讲清楚它来龙去脉的文章,下面将本着寻根溯源的态度去研究它。//源自org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration@Configuration@AutoCon...原创 2018-10-24 12:40:31 · 11422 阅读 · 7 评论 -
JPA之Spring Data JPA
JPA是Java Persistence API的简称,也称为Java持久层API,已成为目前比较流行的一种ORM技术之一,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。目录1.背景2.优势2.1 标准化2.2 对容器级特性的支持2.3 简单易用,集成方便2.4 可媲美JDBC的查询能力2.5 支持面向对象的高级特性...原创 2018-09-30 11:38:03 · 6137 阅读 · 1 评论 -
JPA之集成mongodb
JPA已成为ORM事实的标准,已经深入人心。不清楚的可以参阅《JPA之Spring Data JPA》目录1. 原生使用1.1 官方文档1.2 历史版本1.3 基本用法演示2. spring-data-mongodb2.1 官方文档2.2 环境要求2.3 历史版本2.4 基本用法演示2.5 spring-boot项目2.6 MongoTemplate...原创 2018-09-30 11:33:36 · 6774 阅读 · 0 评论 -
基于spring cloud-feign的异步支持
Netflix的Feign作为Http Client的话,我们就可以做到像Dubbo的声明式服务一样,服务的调用者直接调用接口方法调用远程服务,而不需要通过常规的Http Client构造请求再解析返回数据。目录1. 背景2.该如何入手?2.1什么是Feign3. spring-cloud-openfeign源码3.1 相关配置3.2EnableFeignClien...原创 2018-08-08 12:20:51 · 31003 阅读 · 2 评论 -
@Autowired、@Inject和@Resource的异同点
1.为何要讲这篇呢?其实这个非常基础,但我发现有些地方很多人不熟悉,比如:@Autowired,@Resource的区别无非就是后者是jsr规约,前者是按类型装配,后者是按名称装配仅此而已。2.基本用法1.@Autowired引自:org.springframework.bean.factory标准:无spring:通过AutowiredAnnotationBeanPostPr...原创 2018-01-02 14:54:00 · 1537 阅读 · 1 评论 -
spring-batch实践篇
上篇《spring-batch预研篇》有谈到大批量在线处理类job的需求场景时,有预研spring-batch,那本文主要是从实践上分享一些在遇到的坑。1. 启动问题(默认总是自动启动)?要设置spring.batch.job.enabled=false 2. Job parameter在spring-boot中传参问题?由于spring-batch的prameter采用了后绑...原创 2017-09-29 11:39:10 · 1995 阅读 · 2 评论 -
批处理之spring-batch预研篇
批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务。目录背景思路组件图部分时序图技术选型背景随着微服务化的系统越来越多,平台中有些耗时大批量的操作,比如:导入导出等问题暴露的越来越严重。老版本的解决方案(异步排队):这些功能和系统集成在一起,通过类似请求漏斗原理(线性...原创 2017-09-29 11:05:41 · 700 阅读 · 0 评论