![](https://img-blog.csdnimg.cn/fa1a9aec0e0b4707b5585b3c76a0b965.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
【spring系列】
文章平均质量分 57
spring、springboot及其生态下的技术研究
立小言先森
这个作者很懒,什么都没留下…
展开
-
Java module-info模块系统
模块中如果未定义module-info.java,那么我们在自己的项目中通过module-info.java定义依赖的时候是否可以使用?答案:是可以的,如依赖的包名为a-b-c-starter,则系统自动会解析成模块名为a.b.c.starter,此模块中的所有包都导出官方没有明确指定具体的命名规则,只要遵从通用准则一般不会有问题,如:唯一性、建议小写字母、点号分割、允许字母数字混合。原创 2024-06-22 11:39:01 · 1127 阅读 · 0 评论 -
解锁新技能《logback标记日志过滤器MarkerFilter》
*** 全局标记过滤器,接受指定标记的日志记录到文件中* @param context 上下文* @param marker marker标识* @return 标记过滤器,将会接受被标记的日志记录到文件中//过滤器名称 filter . setName(StrUtils . join("AcceptMarkerFilter-" , marker));//上下文 filter . setContext(context);原创 2023-07-22 09:11:10 · 894 阅读 · 0 评论 -
解锁新技能《spring如何将属性配置文件中的属性绑定到实体类中》
*** 前缀} }原创 2023-07-15 14:37:06 · 1055 阅读 · 0 评论 -
解锁新技能《springboot全局异常处理@ExceptionHandler如何获取控制器方法上的注解》
springboot全局异常处理通常都是用@RestControllerAdvice标注异常处理类,使用@ExceptionHandler标注在捕获具体异常的方法上,我们可以通过异常参数获取异常信息,那如果我想获取抛出异常的具体控制器及其上面标注的注解如何获取呢?原创 2023-07-05 23:45:00 · 1372 阅读 · 0 评论 -
解锁新技能《springboot基于表单multipart/form-data的文件上传》
springboot的文件上传有多种实现方案,个人比较推荐方案三通过实体类属性绑定的方式,这样可以方便文件及其关联的相关属性字段;开源依赖pom</</</</原创 2023-07-05 23:45:00 · 1114 阅读 · 0 评论 -
解锁新技能《springboot基于ResponseBodyAdvice的AOP切面返回值包装》
在项目开发过程中我们会对返回值进行统一的包装处理,对最外层加上status、message、data、spentTime等统一个是的包装;当前SDK支持两种方案,一种基于适配器模式实现,一种基于AOP切面实现,本文只对AOP模式讲解,适配器方案参考源码;原创 2023-07-05 23:45:00 · 546 阅读 · 0 评论 -
解锁新技能《AnnotationConfigApplicationContext@7a8414ea has been closed already》
}原创 2023-06-26 19:08:41 · 872 阅读 · 0 评论 -
Druid数据库配置密码加密openssl生成和代码生成两种方案
【代码】Druid数据库配置openssl生成秘钥并加密密码。原创 2023-05-26 21:00:00 · 1159 阅读 · 0 评论 -
解锁新技能《Spring Plugin插件系统》
平时工作过程中很少使用Spring Plugin插件,最近因为在学习springfox源码的过程中发现有大量用到,先来学习下插件的使用方法。截止20230426日,GitHub的Star为403,fork数为107.官方说Spring Plugin是世界上最小规模的插件系统,果然名不虚产,用户数够小。Spring Plugin通过提供扩展核心系统功能的插件实现核心的灵活性,可以满足我们对模块化可扩展程序的需要。原创 2023-04-26 19:33:17 · 1342 阅读 · 0 评论 -
mybatis-typehandlers-jsr310对Java日期对象和JDBC日期对象转换器过期
最近看到公司很多项目中都引入了这个依赖,但是都说不清楚到底有什么用,只知道是mybatis用来对日期做转换的,所以就研究一下到底做什么的;原创 2023-02-15 19:30:48 · 1410 阅读 · 0 评论 -
Druid1.2.12版本发布,新增连接池默认配置connectTimeout和socketTimeout详解
高级别的timeout依赖于低级别的timeout,只有当低级别的timeout无误时,高级别的timeout才能确保正常;如:当socket timeout出问题时,高级别statement timeout和transaction timeout都将失效。statement timeout无法处理网络连接失败时的超时,它能做的仅仅是限制statement的操作时间,网络连接失败时的timeout必须交由JDBC来处理,JDBC的socket timeout会受到操作系统socket timeout设置的影原创 2022-09-17 09:22:34 · 14760 阅读 · 5 评论 -
解锁《RedisTemplate和StringRedisTemplate的区别是什么?》
- StringRedisTemplate是RedisTemplate的子类,RedisTemplate是一个泛型类型,而StringRedisTemplate则不是。- 两者的序列化策略不同,StringRedisTemplate采用String的序列化策略,key和value都是采用此种策略;RedisTemplate则采用JDK的序列化策略;- 两者的数据不共通,原因就是上述所说的序列化策略不同的原因;原创 2022-09-03 14:36:45 · 290 阅读 · 0 评论 -
jackson将JSON字符串转换成复杂的数据类型
private static ObjectMapper objectMapper = new ObjectMapper(); /** * 示例1: * List<Map<Integer, String>> list = Lists.newArrayList(); * Map<Integer, ...原创 2019-09-28 08:58:53 · 2109 阅读 · 1 评论 -
jackson序列化和反序列化@JsonProperty、@JsonGetter、@JsonSetter、@JsonFormat
1.@JsonProperty将传递过来的属性值序列化为指定的属性名package com.yaomy.control.test.po;import com.fasterxml.jackson.annotation.JsonProperty;public class People { @JsonProperty("USERNAME") private String username; public String getUsername() { retur原创 2020-05-12 09:48:48 · 10958 阅读 · 0 评论 -
死磕源码系列【springboot之OnClassCondition、OnBeanCondition、OnWebApplicationCondition条件注解源码解析】
在spring-boot-autoconfigurejar包中的spring.factories配置文件中有一个org.springframework.boot.autoconfigure.AutoConfigurationImportFilter自动化配置import过滤器,配置如下:# Auto Configuration Import Filtersorg.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\org.原创 2020-12-03 19:29:48 · 2693 阅读 · 0 评论 -
死磕源码系列【@EnableConfigurationProperties注解及EnableConfigurationPropertiesRegistrar注册器类源码解析】
@EnableConfigurationProperties注解通常和@ConfigurationProperties注解一起使用,将标记了@ConfigurationProperties的bean绑定配置文件中的属性并将其注册到IOC容器之中。首先看下@EnableConfigurationProperties注解的源码@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(EnableCo.原创 2020-11-05 19:50:13 · 1529 阅读 · 0 评论 -
死磕源码系列【consul配置中心监视器类ConfigWatch动态刷新配置】
consul作为配置中心时可以开启动态刷新配置的功能,其实现类是通过ConfigWatch来实现;监视器类相关属性配置spring: cloud: consul: config: watch: # 是否开启配置中心配置变动,默认:true enabled: true # 监控的固定延迟值,即一次执行完成到下一次执行开始之间的间隔,默认:1000毫秒 delay: 1000 .原创 2021-01-15 18:23:51 · 1802 阅读 · 1 评论 -
java中ThreadLocal、InheritableThreadLocal详解
一、ThreadLocal介绍 在多线程环境下访问同一个线程的时候会出现并发问题,特别是多个线程同时对一个变量进行写入操作时,为了保证线程的安全,通常会进行加锁来保证线程的安全,但是加锁又会造成效率的降低;ThreadLocal是jdk提供的除了加锁之外保证线程安全的方法,其实现原理是在Thread类中定义了两个ThreadLocalMap类型变量threadLocals、inheritableThreadLocals用来存储当前操作的ThreadLocal的引用及变量对象,这样就可以把当前线程的变原创 2021-11-11 19:49:29 · 4285 阅读 · 0 评论 -
druid数据库连接池保活机制源码
druid连接池未设置保活机制时如何对连接有效性保护?如果连接发生了致命性异常,则会加入保活连接数组,接下来校验有效性;如果设置了物理连接超时时间,并且连接的空闲时间大于设置的物理连接超时时间,则会加入驱逐连接数组;如果连接的空闲时间小于最小驱逐空闲时间,并且小于保活检查间隔时间,则继续等待下一轮检查;如果连接的空闲时间大于最小驱逐空闲时间,并且轮询索引小于合并计数器,则将该连接放入驱逐连接数组;如果连接的空闲时间大于最大驱逐空闲时间,则将连接放入驱逐连接数组;未启用保活机制剔除后连接池中原创 2022-02-21 19:39:23 · 3034 阅读 · 0 评论 -
死磕源码系列【SpringFactoriesLoader定位加载spring.factories文件中的配置】
META-INF/spring.factories文件对我们来说应该是最熟悉的了,如springboot开发自动化配置starter的时候配置类是要配置到这个文件后才能够实现自动的加载类到IOC容器之中;但是文件中的配置类是如何被定位、加载、初始化的呢?今天我们就来聊聊spring.factories文件定位、加载、实例化。1.首先看下spring.factories文件中的配置示例先看下spring-boot-autoconfigure中的部分配置:# Initializersorg.spri.原创 2020-09-19 15:27:19 · 1206 阅读 · 0 评论 -
死磕源码系列【JavaConfig配置bean别名AliasRegistry详解】
AliasRegistry用于管理别名的公共接口,作为BeanDefinitionRegistry的超级接口(主要用作JavaConfig配置bean别名的注册、删除、判定、获取)AliasRegistry接口源码:public interface AliasRegistry { /** * 给定一个名称,给它注册一个别名 * @param 规范的命名 * @param 要注册的别名 * @throws IllegalStateException if the alias is .原创 2020-10-22 19:24:27 · 769 阅读 · 0 评论 -
死磕源码系列【springboot之内部类解析processMemberClasses源码分析】
在将配置类解析为ConfigurationClass配置类时经常会遇到内部配置类的情况,遇到这种情况是如何解析的呢?本文对这一块进行一一解释;ConfigurationClassParser#processMemberClasses方法解析内部类//注册配置类成员嵌套类private void processMemberClasses(ConfigurationClass configClass, SourceClass sourceClass, Predicate<String>原创 2020-12-08 18:21:08 · 911 阅读 · 0 评论 -
死磕源码系列【ConfigFileApplicationListener监听器源码解析】
ConfigFileApplicationListener监听器主要用来处理环境配置相关业务,其加载是在springboot启动时通过SPI方式获取(之前的文章已经将结果);ConfigFileApplicationListener监听器类继承SmartApplicationListener接口实现了supportsEventType方法,判定监听器实际上支持的时间类型: @Override public boolean supportsEventType(Class<? extends A.原创 2020-10-24 15:12:21 · 1520 阅读 · 1 评论 -
springcloud值ribbon打印WARN日志You already have RibbonLoadBalancerClient on your classpath. It will be us
在使用springcloud ribbon做客户端负载均衡的时候控制台打印如下日志:You already have RibbonLoadBalancerClient on your classpath. It will be used by default. As Spring Cloud Ribbon is in maintenance mode. We recommend switching to BlockingLoadBalancerClient instead. In order to use原创 2020-11-28 13:17:27 · 9934 阅读 · 0 评论 -
springboot Redis 多数据源组件
由于系统需要同一个项目需要配置多个redis数据源,并且很多项目都是同样的需求;在网上查了一波,大家的做法都是在每个需要配置多个数据源的地方添加多个配置类,需要引入几个数据源就需要写几个配置类,如果有N个项目就需要在N个项目中重复N遍相同的代码;所以就想到了自己动手对springboot提供的redis模块进行封装,使其可以无需任何多余的代码编写只需引入提前写好的组件就可以完成任意多个redis数据源的配置。组件支持哪些功能基于springboot自动化配置,实现开箱即用完全基于springbo.原创 2021-11-06 13:49:17 · 2059 阅读 · 0 评论 -
druid数据库连接池泄漏removeAbandoned|connectedTimeNano属性配置
当程序存在缺陷时,申请的连接忘记关闭,这时候就存在连接泄漏了,druid提供了removeAbandanded相关配置,用来关闭长时间不适用的连接,removeAbandanded功能不建议再生产环境中使用,仅用于连接蟹柳检测诊断;配置:#连接池泄漏监测,当程序存在缺陷时,申请的连接忘记关闭,这时就存在连接泄漏了,开启后对性能有影响,建议生产关闭,默认:falsespring.emily.datasource.config.mysql.remove-abandoned=false#默认:300*.原创 2022-02-26 09:59:19 · 7065 阅读 · 0 评论 -
druid数据源检测数据库连接有效性testOnBorrow、testOnReturn、testWhileIdle属性原理分析
druid多数据源建立连接后,可以通过配置对连接的有效性进行检查,想要更好的运用好数据库连接检查配置就应该了解源码,了解控制原理。druid多数据源检测数据库连接的有效性属性配置如下:#mysql默认使用ping模式,可以通过设置系统属性System.getProperties().setProperty("druid.mysql.usePingMethod", "false")更改为sql模式#用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQ.原创 2022-02-21 19:40:33 · 10029 阅读 · 0 评论 -
死磕源码系列【DelegatingApplicationContextInitializer源码分析】
DelegatingApplicationContextInitializer初始化器实现类是ApplicationContextInitializer接口的一个代理实现类,提供了一个属性key(context.initializer.classes)在配置文件中配置自定义的初始化器实现类;当然,也可以使用SPI方式在spring.factories配置文件配置org.springframework.context.ApplicationContextInitializer作为key来配置,两种方式都可以.原创 2020-10-29 18:25:27 · 590 阅读 · 0 评论 -
死磕源码系列【springcloud之@EnableDiscoveryClient More than one implementation及加不加@EnableDiscoveryClient注解都可
最近做consul作为注册中心主方法main上添加与不添加@EnableDiscoveryClient启用服务发现注解都可以正常的使用服务发现及注册功能,这点上有些疑惑,所以就扒拉扒拉源码,看看实现原理到底是什么;1.看下注解@EnableDiscoveryClient源码@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import(EnableDiscoveryClientImp原创 2020-12-08 18:22:38 · 2143 阅读 · 2 评论 -
CircuitBreaker断路器
一、CircuitBreaker断路器介绍CircuitBreaker断路器通过具有三种正常状态的有限状态机实现:CLOSED、OPEN、HALF_OPEN和两种特殊的状态DISABLED和FORCED_OPEN;CircuitBreaker断路器使用滑动窗口存储和汇总调用结果,你可以在基于时间(time-based)的滑动窗口和基于计数(count-based)的滑动窗口之间做选择。基于计数的滑动窗口会汇总最后N次调用的结果,基于时间的滑动窗口会汇总最后N秒的调用结果。二、基于数量(count-b原创 2022-05-07 17:35:32 · 2874 阅读 · 0 评论 -
死磕源码系列【springboot主配置源类加载the primary source to load】
通常使用springboot开发是会有一个主方法main方法入口:import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class QuartzBootStrap { public static void main(String[] args) {原创 2020-10-13 18:08:28 · 1547 阅读 · 1 评论 -
死磕源码系列【AutoConfigurationImportFilter自动化配置过滤器详解】
/** * Filter that can be registered in {@code spring.factories} to limit the * auto-configuration classes considered. This interface is designed to allow fast removal * of auto-configuration classes before their bytecode is even read. * <p> * An原创 2020-10-01 09:34:30 · 1873 阅读 · 0 评论 -
死磕源码系列【springboot初始化值InitializingBean、DisposableBean、init-method和@PostConstruct源码解析】
Spring容器中的Bean是有生命周期的,spring允许在bean的初始化完成之后以及Bean的销毁执行之前执行特定的操作,常用的设定方式有以下三种:通过实现InitializingBean和DisposableBean接口来定制初始化之后及销毁之前的操作方法;通过在@Bean注解或元素上的initMethod、destroyMethod属性指定初始化之后及销毁之前调用的操作方法;在指定的方法上加@PostConstruct、@PreDestroy注解来指定该方法在初始化之前及初始化之后调用原创 2020-11-28 13:15:45 · 898 阅读 · 0 评论 -
spring.factories将被弃用,做好Get新技能的准备了吗
作为springboot的忠实用户,最近springboot升级到了2.7.0版本,其中有一项是改变原来的自动化配置注册方式;如果你之前写过相关starter类或者研究过自动化配置的源码知道,配置自动化配置类需要在META-INF/spring.factories文件中配置配置类,而最新版本是配置META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中配置,不过目前是兼容两种配置模式共存。新老.原创 2022-05-26 11:10:07 · 6298 阅读 · 0 评论 -
Connection prematurely closed BEFORE response reactor.netty.http.client.PrematureCloseException: Co
一、最近在开发网关系统,就在感觉万事大吉可以上线的时候发现了如下的错误(这个是我在配置rabbitmq访问多个服务时发现的) Connection prematurely closed BEFORE responsereactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE responsereactor.core.publisher.FluxOnAssembly$OnAssemblyE原创 2021-03-03 19:24:11 · 16660 阅读 · 14 评论 -
druid数据库连接池物理连接超时时间phyTimeoutMills及物理最大连接数phyMaxUseCount
配置:#物理超时时间,默认:-1spring.emily.datasource.config.mysql.phy-timeout-millis=-1#物理最大连接数,默认:-1(不建议配置)spring.emily.datasource.config.mysql.phy-max-use-count=-1phy-timeout-millis是指连接的最大物理连接时长,超过则会被强制回收,phy-max-use-count则是最大的物理连接数,超过则会被强制回收,这两个连接都要慎用;phy-t原创 2022-02-26 10:32:44 · 8293 阅读 · 0 评论 -
死磕源码系列【springboot之ConditionEvaluationReport记录报告和日志条件评估详情源码解析】
ConditionEvaluationReport用来记录自动化配置过程中条件匹配的详细信息及日志信息;1.ConditionOutcome类输出条件匹配及日志信息public class ConditionOutcome { //是否匹配 private final boolean match; //日志信息 private final ConditionMessage message; }2.Condition函数是接口定义一个class必须匹配给定的条件后才可以定义为BeanDe.原创 2020-12-03 19:28:32 · 1826 阅读 · 0 评论 -
死磕源码系列【springboot之ServletContextInitializerBeans如何将Filter、Servlet、EventListener注册到ServletContext中源码解
ServletContextInitializerBeans类表示从ListableBeanFactory容器中获取到的ServletContextInitializer实例集合,包括所有的ServletContextInitializer beans,并且也包含Servlet、Filter、EventListener beans集合。这些beans会被排序,按照Servlet->Filter->EventListener->ServletContextInitializer的顺序排列。原创 2020-12-12 13:06:52 · 895 阅读 · 1 评论 -
死磕源码系列【ContextIdApplicationContextInitializer源码解析】
ContextIdApplicationContextInitializer类是ApplicationContextInitializer初始化器接口实现类,会在应用程序启动的时候初始化应用程序的唯一ID。ContextIdApplicationContextInitializer设置Spring ApplicationContext上下文ID,如果spring.application.name属性存在,则将其作为ID,否则使用application默认值作为ID,源码如下:public class.原创 2020-10-29 18:24:40 · 590 阅读 · 0 评论 -
springboot+mybatis如何将操作数据库sql记录到日志文件中
springboot+mybatis如何将操作数据库sql记录到日志文件中通常我们可以通过如下配置将操作数据库的sql语句打印到控制台上,但是如何将这些sql语句记录到日志文件中方便我们查询问题呢?mybatis: # 标注待解析的mapper的xml文件位置 mapper-locations: classpath:mapper/*.xml configuration: # org.apache.ibatis.logging.slf4j.Slf4jImpl log-imp原创 2021-08-24 19:53:25 · 3024 阅读 · 0 评论