
深入浅出Spring源码及原理实战
文章平均质量分 94
主要基于SpringFramework的基础技术生态技术和相关的技术定位方面,不包含其他子服务项目,主要就集中于spring的基础生态技术及特性。
码界西柚
优酷资深工程师 | INTJ | 狮子座 | 高洞察力理性自律小i人,
著作《深入浅出Java虚拟机—JVM原理与实战》,
10年以上开发经验,参与设计过多个大型互联网项目,定期分享技术干货和项目经验,
希望大家可以多多支持我,点赞关注一下
展开
-
【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲
Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器,红帽公司(RedHat)的开源产品,且是 WildFly8(JBoss)默认的 Web 服务器.;译文: Undertow是一个用java编写的灵活的高性能Web服务器,提供基于NIO的阻塞和非阻塞API。Undertow非常轻量级,Undertow核心jar包在1Mb以下。它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间。原创 2024-01-21 12:40:37 · 1581 阅读 · 1 评论 -
【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之Spring定义Jackson转换Null的方法和实现案例
自定义的,它是一个继承自的序列化器,用于处理值为null的情况。在serialize方法中,我们将使用自定义的对象来替代值为null的字段进行序列化。因此,我们可以通过自定义ObjectMapper和注册自定义的序列化器来在转换过程中添加我们需要的控制逻辑。上述的示例代码展示了如何在WebConfig配置类中实现这一点,通过注册自定义的序列化器实现对特定字段null值的转换为默认值。在类中,我们定义了一个包含一个名为def的列表字段,用于存储默认值。原创 2024-01-06 18:05:14 · 1303 阅读 · 2 评论 -
【Spring技术专题】「实战开发系列」保姆级教你SpringBoot整合Mybatis框架实现多数据源的静态数据源和动态数据源配置落地
接下来,我们需要配置Mybatis。我们需要为每个数据源创建一个SqlSessionFactory。// application.properteis中对应属性的前缀// application.properteis中对应属性的前缀/*** 默认数据源*/// 设置数据源名// 获取数据源名// 清除数据源名。原创 2023-12-16 11:25:52 · 1007 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring配置开发实战详解
在@ComponentScan注解中使用@ComponentScan.Filter指定type为FilterType.CUSTOM,并将CustomFilter类作为参数传入,这样在扫描时会应用我们定义的自定义过滤器来进行过滤。上面案例已经介绍了对应的type=ANNOTATION的案例,当使用FilterType.CUSTOM来进行过滤时,你需要自定义一个类来实现TypeFilter接口,然后根据自己的规则进行过滤。默认单实例:在Spring中,默认情况下,被注解为Bean的对象是单例的。原创 2023-11-09 14:30:30 · 250 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringEL的开发实战指南(解析上下文—EvaluationContext)
SpEL表达式可以与基于XML或注解的配置元数据一起使用,用于定义BeanDefinition。无论是在XML配置还是注解配置中,定义表达式的语法形式都是#{}。原创 2023-08-03 15:30:14 · 627 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache管理器的实战开发指南(修正篇)
Spring Cache是基于方法级别的,其核心思想是将调用带有缓存的方法时的参数和返回结果作为键值对存储在缓存中。当下次调用相同参数的方法时,直接从缓存中获取结果,而不再执行该方法。因此,在使用Spring Cache时,需要确保被缓存的方法对于相同的参数具有相同的返回结果。声明需要使用缓存的方法。配置Spring对Cache的支持。与Spring对事务管理的支持类似,Spring对Cache的支持有两种方式:基于注解和基于XML配置。下面我们先来看看基于注解的方式。原创 2023-07-28 11:45:15 · 225 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringEL的开发实战指南(序章)
Spring 表达式语言(SpEL)是一种功能强大的表达式语言,用于在运行时查询和操作对象图。它的语法与 Unified EL 相似,但提供了更多功能,其中最主要的是方法调用和基本的字符串模板功能。作为最后一个介绍性示例,我们将使用之前的示例中的Inventor对象来演示如何使用布尔运算符。原创 2023-07-24 19:01:58 · 132 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)
Spring 5.x中常见的注解包括@Controller、@Service、@Repository。当我们研究Spring Boot源码时,会发现实际上提供了更多的注解。了解这些注解对于我们非常重要,尽管目前可能还用不到它们。原创 2023-07-16 18:53:50 · 417 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)
Spring Web MVC是一种基于Java的轻量级Web框架,它实现了Web MVC设计模式,使用VC架构模式的思想将web层进行职责解耦。这种请求驱动类型的框架使用请求-响应模型,旨在简化Web开发过程。使用Spring Web MVC,我们可以更加高效地开发Web应用程序,而不必为了每个接口编写一个Servlet而感到烦恼。相比于传统的Jsp/Servlet技术体系,Spring Web MVC能够帮助我们有效地简化这一步骤。原创 2023-06-04 02:15:00 · 365 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache抽象详解的核心原理探索
在Java中,我们通常会对方法调用进行缓存控制,例如对于方法 “getValueByKey(String key)”,我们应该首先从缓存中查找是否有对应的数据,如果没有再调用该方法从数据库中加载用户数据,并将其添加到缓存中。自Spring 3.1起,提供了Cache支持,且提供了Cache抽象,在此之前一般通过AOP实现,使用Spring Cache的好处:提供基本的Cache抽象,方便切换各种底层Cache;缓存的工作机制是先从缓存中读取数据,如果没有再从慢速设备上读取实际数据,并将数据存入缓存中。原创 2023-05-27 16:00:46 · 1005 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
Spring3引入了Spring表达式语言(SpEL),作为一种强大而简洁的Bean装配方式。它可以通过运行时执行的表达式将值动态地注入到我们的属性或构造函数中,并且支持调用JDK提供的静态常量以及获取外部Properties文件中的配置。让我们深入了解SpEL的魔法!K中提供的静态常量,获取外部Properties文件中的的配置。原创 2023-05-16 22:30:00 · 856 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
**super();} /*** 指定使用哪一种缓存* @returnreturn rcm;} /*** 指定默认的key生成方式* @return} };} /*** redis 序列化策略 ,通常情况下key值采用String序列化策略* StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。原创 2023-04-30 20:04:28 · 807 阅读 · 2 评论 -
【深入浅出Spring原理及实战】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理
执行**@RequestMapping方法抛出异常后,Spring框架try-catch的方法捕获异常, 正常逻辑发不发生异常都会走processDispatchResult**流程 ,区别在于异常的参数是否为null .try {//根据请求查找handlerMapping找到controller mappedHandler = getHandler(request);原创 2023-04-09 16:51:23 · 4615 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「Web请求读取系列」如何构建一个可重复读取的Request的流机制
在调用request.getReader之后重置HttpRequest:有时候我们的请求是post,但我们又要对参数签名,这个时候我们需要获取到body的信息,但是当我们使用HttpServletRequest的getReader()和getInputStream()获取参数后,后面不管是框架还是自己想再次获取body已经没办法获取。当然也有一些其他的场景,可能需要多次获取的情况。log . info("请求参数:{}" , JSON . toJSONString(parameterMap));原创 2023-01-03 16:23:48 · 1076 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「技术原理」为大家介绍一下Spring中的Ant路径匹配工具组件AntPathMatcher
AntPathMatcher如名使用的ant 的匹配规则,我们先看看吧.?匹配1个字符匹配0个或多个字符** 匹配路径中的0个或多个目录{spring:[a-z]+} 将正则表达式[a-z]+匹配到的值,赋值给名为spring的路径变量。必须是完全匹配才行,在SpringMVC中只有完全匹配才会进入controller层的方法。原创 2022-12-29 21:45:07 · 1617 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「开发指南」夯实实战基础功底之解读logback-spring.xml文件的详解实现
过滤掉ERROR级别以下的日志不输出到文件中。原创 2022-12-21 22:56:01 · 832 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「源码调试分析」结合DataSourceRegister深入分析ImportBeanDefinitionRegistrar的源码运作流程
接着往下走,进入refreshContext中会调用一系列的refresh方法,最终进入AbstractApplicationContext中,主要将SpringBoot的容器对象数据和原本基础的Spring Framework的框架对象进行加载到容器中。继承的EnvironmentAware接口,没有真正意义上去用它的用途,本身可以通过这个setEnvironment方法,进行注入Environment对象,从而可以读取其他的配置信息,目前主要用作一个hook方法。以上两个方法中标红的就是关键点。原创 2023-01-15 17:56:50 · 750 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常
综上所述,其实这三条异常消息的根本原因只有一个,就是当一个上下文对象创建后没有调用refresh()方法。在Spring中ApplicationContext实现类有很多,有些实现类在创建的过程中自动调用了refresh()方法,而有些又没有,如果没有则需要自己手动调用refresh()方法。一般说来实现WebApplicationContext接口的实现类以及使用默认构造方法创建上下文对象时不会自动refresh()方法,其它情况则会自动调用。原创 2023-04-23 20:19:17 · 354 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」OAuth2的技术体系架构和开发概览
主要实现 OAuth2的三种授权模式:密码模式、客户端模式和授权码模式,包括展示授权服务器、资源服务器、客户端等几种角色的交互,以及JWT的整合。并且每个实例都提供两个代码版本:一个是基于旧的 Spring Security OAuth2 组件;一个是基于新的 Spring Authorization Server 组件。原创 2022-12-24 20:59:03 · 884 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity技术实战之通过注解表达式控制方法权限
} }在上面的代码中我们定义了只有拥有角色ROLE_ADMIN的用户才能访问adduser()方法,而访问find()方法需要有ROLE_USER角色或ROLE_ADMIN角色。使用表达式时我们还可以在表达式中使用方法参数。原创 2022-12-23 16:49:36 · 1237 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity与JWT实现权限管控以及登录认证指南
SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面,相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊。实际开发中还是要根据业务和项目的需求来决定使用哪一种.// 获取表单输入中返回的用户名 String userName =(String) authentication . getPrincipal();原创 2022-12-23 16:45:29 · 1003 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity原理以及实战认证分析开发指南
承接上一篇文章,相信大家应该已经对SpringSecurity的原理有了一定的认识,而本篇文章给大家带来的则是在实际业务开发中的技术指南,希望对你有所帮助。所谓知彼知己方能百战百胜,用Spring Security来满足我们的需求最好了解其原理,这样才能随意拓展。原创 2022-12-23 16:44:37 · 1192 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「技术原理」Spring Security的核心功能和加载运行流程的原理分析
Spring Security对认证、授权和常见漏洞保护提供了全方位支持。使用的版本为:Spring Security 5.5.2。注册标准Filter:首先,Spring 会自动注入一个DelegatingFilterProxy到 Servlet 的FilterChain中。原创 2022-12-23 16:40:31 · 4704 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」分析探究RedisTemplate的序列化和反序列化+泛型机制
【【深入浅出Spring原理及实战】「开发实战系列」采用protostuff和kryo高性能序列化框架实现RedisTemplate的序列化组件】介绍了一下Java实现序列化的众多手段和优秀框架,现在我们针对于序列化和反序列化结合这些优秀的框架进行实现。JdkSerializationRedisSerializer虽然在redis中保存的数据是不可读的,但是操作起来很方便,可直接指定返回值的类型,免去了再次转换之繁琐。其实现原理是在redis中存储的数据里包含着数据类型。原创 2022-12-23 16:30:01 · 1428 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」Aspectj和LoadTimeWeaving的动态代理技术实现指南
当我们聊到Spring框架的项目实际开发中,用的强大的功能之一就是(面向切面编程)的这门AOP技术。如果使用得当,它的最大的作用就是侵入性比较少并且简化我们的工作任务(节省大量的重复性编码),最为重要的一点是,它可以让我们在不改变原有代码的情况下,织入我们的逻辑,尤其是在我们没有源代码的时候,而且当我们恢复之前的逻辑的时候,只需要去掉代理就可以了。原创 2022-12-23 16:26:35 · 1100 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」采用protostuff和kryo高性能序列化框架实现RedisTemplate的序列化组件
*** 序列化对象** @returntry {} /*** 反序列化对象** @returntry {} /*** 序列化列表** @returntry {try {if(bos!= null) {} /*** 反序列化列表** @returntry {} }原创 2022-12-19 19:13:13 · 855 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「开发实战系列」手把手教你将@Schedule任务调度升级为分布式调度@DistributeSchedule
很多小伙伴们都跟我留言说过一个类似的问题,就是针对于任务调度框架而言的选取,很多公司都会采用任务调度框架的鼻祖Quartz,那么我们来梳理以下Java领域的任务调度框架吧。我才用了加入前缀Distribute用来区分和原来的任务调度。只需要找原来的样子调整成为return new DistributeScheduledMethodRunnable(target, invocableMethod,redisDistributionLock);即可。/**}亲测有效!原创 2022-12-13 11:56:14 · 816 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「开发实战系列」Spring-Cache扩展自定义(注解失效时间+主动刷新缓存)
想这样配置过期时间,焦点在value的格式上Product#5#2,详情下面会详细说明。上面两种各有利弊,并不是说哪一种一定要比另外一种强,根据自己项目的实际情况选择。原创 2022-12-13 11:48:19 · 987 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「开发实战系列」重新回顾一下异常重试框架Spring Retry的功能指南和实战
重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务是否存活。重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1,timeout=500调用失败只重试1次,超过500ms调用仍未返回则调用失败。原创 2022-12-12 13:26:47 · 673 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「原理分析专题」从零开始教你SpringEL表达式使用和功能分析讲解指南(上篇)
任何的表达式其组成之中一定会包含相应的边界形式,例如:在jsp中的el里面使用${表达式},在spring里面,如果用户有需要也可以定义我们的边界.首先观察解析表达式的操作类:Expressionparser。原创 2022-12-12 13:23:58 · 1199 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「开发实战系列」带你看看那些可能你还不知道的Spring特殊技巧和想不到的招数
本文主要介绍相关Spring框架的一些新特性问题机制,包含了一些特定注解方面的认识。ResolvableType . forClassWithGenerics(List . class , String . class) 相当于创建一个 List < String > 类型;:相当于创建一个 List < String > [ ] 数组;resolvableType9 . getComponentType() . getGeneric(0) . resolve() :得到相应的泛型信息;原创 2022-12-09 13:05:57 · 898 阅读 · 0 评论 -
精华推荐 |【深入浅出Spring原理及实战】「原理分析专题」从源码和架构设计角度深入剖析BeanPostProcessor的原理和运作机制
Spring中BeanPostProcessor的子接口或实现类有很多种,例如。、、DestructionAwareBeanPostProcessor等等。这些接口分别处在Spring Bean生命周期的不同阶段,而他们的功能与BeanPostProcessor都类似,都是为了给Spring Bean各个声明周期提供扩展点。原创 2022-12-09 12:56:44 · 4909 阅读 · 0 评论 -
精华推荐 |【深入浅出Spring原理及实战】「工作实战专题」叫你如何使用另类操作去实现Spring容器注入Bean对象
接触到了一个新的概念,BeanDefinition,可以简单理解为bean的定义(bean的元数据),也是需要放在IOC容器中进行管理的,先有bean的元数据,applicationContext再根据bean的元数据去创建Bean。其实在@Import注解的源码中,说的已经很清楚了,感兴趣的可以看下,我们实现一个ImportSelector的接口,然后实现其中的方法,进行导入。关于@Import注解的使用方式,大概就以上三种,当然它还可以搭配@Configuration注解使用,用于导入一个配置类。原创 2022-12-09 12:52:55 · 4484 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「IOC容器初始化」彻底让你明白和理解运行原理和源码流程
学习源码的过程当中,有几点建议:一定要学会抓重点,归纳核心类、核心方法、核心步骤;分析源码我们不需要太过于纠结细节,不然,这个源码最起码得分析月才能分析完;主要的目的是分析整个容器初始化过程,怎么初始化bean,怎么设置动态代理;我们主要学习的是他们的思想,以及代码中运用到的设计模式;BeanFactory:用于访问容器中bean的接口,使用的是工厂模式,重点注意DefaultListableBeanFactory,是贯穿的整个容器的基本工厂类。BeanDefinition:BeanDefinition是b原创 2022-12-05 18:48:06 · 742 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「原理分析专题」全方面解析SpringFramework的Bean对象的深入分析和挖掘指南
Bean定义包含一个叫做配置元数据的信息,容器需要知道以下内容:class:此属性是必需的,它指定用于创建Bean的Bean类。name:此属性唯一地指定Bean标识符。在基于XML的配置元数据中,可以使用id和/或name属性来指定Bean标识符。scope:此属性指定从特定bean定义创建的对象的范围constructor-arg:这用于注入依赖关系properties:这用于注入依赖关系autowiring mode:这用于注入依赖关系lazy-initialization mode:延迟初始化的be原创 2022-12-05 18:44:49 · 561 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「原理分析专题」重新回顾一下Spring框架的异步执行调用的原理和实战
Spring为任务调度与异步方法执行提供了注解支持。通过在方法或类上设置 @Async 注解,可使得方法被异步调用。调用者会在调用时立即返回,而被调用方法的实际执行是交给 Spring 的 TaskExecutor 来完成的。所以被注解的方法被调用的时候,会在新的线程中执行,而调用它的方法会在原线程中执行,这样可以避免阻塞,以及保证任务的实时性。@EnableAsync添加配置类异步调用,通过开启新的线程调用的方法,不影响主线程。异步方法实际的执行交给了 Spring 的 TaskExecutor 来原创 2022-12-05 18:41:44 · 704 阅读 · 1 评论 -
【深入浅出Spring原理及实战】「原理分析专题」不看源码就带你剖析IOC容器核心流程以及运作原理
针对于每一个Java的爱好者而言,无论是从事面向于微服务架构技术的领域(SpringCloud、SpringCloud-Alibaba等),还是面向于传统互联网行业(SpringBoot)以及软件系统(Spring\SpringBatch)领域,掌握好Spring框架技术原理和源码对排查问题以及未来的面试技术有着非常重要的帮助和影响,而接下来,笔者会针对于Spring的技术框架的核心源码流程点进行相关的分析和认识,相信阅读完本篇文章,一定会对Spring的源码和执行原理有着很大的帮助和提升。原创 2022-11-28 12:44:06 · 559 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「原理分析专题」不看源码就带你剖析MVC容器核心流程以及运作原理
之前已经写了很多问斩针对于SpringMVC的的执行原理和核心流程,在此再进行冗余介绍就没有任何意义了,所以我们主要考虑的就是针对于SpringMVC还没但大框架有介绍的相关内容解析分析和说明,那么接下来就让我们来接入Spring框架在核心的三大框架之一。原创 2022-11-28 12:49:29 · 519 阅读 · 0 评论 -
【深入浅出Spring原理及实战】「原理分析专题」不看源码就带你剖析AOP容器核心流程以及运作原理
前一篇文章主要介绍了spring核心特性机制的IOC容器机制和核心运作原理,接下来我们去介绍另外一个较为核心的功能,那就是AOP容器机制,主要负责承接前一篇代理模式机制中动态代理:JDKProxy和CglibProxy的功能机制之后,我们开始研究一下如何实现一下相关的AOP容器代理机制的。原创 2022-11-28 12:45:30 · 561 阅读 · 0 评论