SpringBoot
文章平均质量分 71
SpringBoot开发中mybatis,redis,MQ的使用,过滤器,拦截器等配置使用
WannaRunning
这个作者很懒,什么都没留下…
展开
-
SpringMVC中的ResponseBodyAdvice
1.现有的http接口返回值结构各异,需要统一返回值的结构但是不想大量的更改现有的接口代码。2.对于现有的http接口返回值要做统一的加密处理,不想把加密逻辑入侵到每个接口代码中。上面两种情况可以用ResponseBodyAdvice来对返回值做处理。原创 2023-02-04 21:36:30 · 646 阅读 · 0 评论 -
DDD中引入的CQRS概念
在DDD设计中,增删改操作便于应用领域模型执行,而查询操作往往无法直接通过领域模型执行。。在基于CQRS的系统中,我们称增删改为命令型操作,把命令操作和查询 所使用的数据模型作区分。听起来可能像是两个微服务,但是在CQRS中,无论运行时架构是怎样的,命令模型和查询模型都属于同一逻辑领域。如果查询模型对命令模型一无所知,就无法发挥作用。这里的耦合是预期的,不同于微服务之间的解耦行为。原创 2023-01-11 20:55:39 · 370 阅读 · 0 评论 -
RestTemplate自定义配置连接池和超时参数
RestTemplate默认的ClientHttpRequestFactor为SimpleClientHttpRequestFactory,其中的createRequest方法意味着每次请求都会创建一个新的连接。再请求量大的时候不能满足复杂情况的使用需求, 所以可以自定义配置实现优化。RestTemplate配置连接池引入httpclient连接池依赖<dependency> <groupId>org.apache.httpcomponents</gr原创 2022-04-21 20:52:15 · 2134 阅读 · 0 评论 -
Spring中的BeanPostProcessor
背景:项目中使用了注解加切面实现某些数据接口的缓存,想把项目中使用了缓存的接口及信息可视化,便于管理查看。这个功能实现的话大概就是解析接口方法上的注解,加入统一管理的集合信息中。但是一般程序中只有访问到方法的时候才能主动做解析,而且多次访问会重复解析,所以考虑在项目启动时就遍历Bean解析这些注解的方法。为了实现上面这个功能,就使用了BeanPostProcessor接口。Spring中的BeanPostProcessor在实例化过程处于的位置分是前置处理和后置处理,对应的BeanPostPro原创 2021-12-18 18:02:01 · 737 阅读 · 0 评论 -
基于Callable或DeferredResult实现SpringMvc异步模式
SpringMVC的异步请求模式是Spring3.2就推出了,它是基于基Servlet3.0规范实现的,而此规范是2011年推出的,距现在已经有近10的历史了,可谓是非常非常成熟的一种技术规范了。SpringMVC的异步与同步的区别之前有写过关于对tomcat处理HTTP请求的理解的文章。提到tomcat中合理配置maxThreads参数(请求处理线程的最大数量)可以提高tomcat性能。但是当maxThreads参数因为CPU等条件限制到达最佳数值不能再增加时,提高单个线程的处理请求的速度又.原创 2021-09-15 20:51:01 · 170 阅读 · 0 评论 -
浅谈基于Redis存储的SpringSession方案的实现原理
很早之前写过关于分布式集群下session的管理实现,其中有关于spring-session的实现方式。其实使用了这种方式实际上是把httpsession交给spring管理,spring管理session的实现则是把session集成到了redis等中间件中去,从而实现分布式共享的目的。@EnableRedisHttpSession注解关键就在于这个注解,这个注解沿用了spring系列开关注解的思路,通过@Import注解导入了SpringSession的核心配置类RedisHttpSession原创 2021-08-12 20:57:45 · 1756 阅读 · 0 评论 -
@Aspect中AOP的通知类型
AOP的使用场景越来越多,例如之前的文章Spring中AOP应用——数据字段渲染,还有SpringBoot多数据源配置和使用都使用到了AOP,这里整理一下两篇文章技术实现中涉及到的AOP的通知类型:环绕通知和后置通知。@AfterReturning 后置通知方法无返回值 方法有参数,是目标方法执行的返回值,推荐参数类型定义为object类型, 参数名自定义但要与注解中的returning属性对应。@AfterReturning(value = "@annotation(com.fk.原创 2021-08-09 20:23:02 · 246 阅读 · 0 评论 -
Spring项目中基于Aspect的AOP实现数据字段渲染
业务场景:有一些表中的信息,例如门店名称,产品名称等数据存在变动的可能性,但是很多地方又要使用到这些信息。通常有两种方式使用这些信息保证数据实时性,在查询时对字段所在的表连表查询,但是仅仅为这种数据连表的成本太高了。 把字段冗余到各种表结构中,但是这种实现就无法保证字段数据的实时性了,一旦冗余就变成了快照信息。这篇文章要写的内容是第三种方式:基于注解动态渲染指定的数据字段。实现思路基于AOP的实现思想,在合适的时机对数据对象进行处理,处理逻辑通过特定注解字段的值做条件(对应连表查原创 2021-08-09 20:05:37 · 300 阅读 · 0 评论 -
浅谈Mybatis在Spring整合后的执行原理和一级缓存管理
Spring整合Mybatis的方式是通过SqlSessionTemplate创建sqlSession代理对象执行CRUD操作。MapperProxy类MapperProxy#invoke 这个方法是Mapper接口执行方法的入口。关键逻辑在最后一处代码,调用了MapperMethod类的execute方法public class MapperProxy<T> implements InvocationHandler, Serializable { private sta原创 2021-08-05 23:40:18 · 213 阅读 · 1 评论 -
RequestMappingHandlerMapping的工作原理
使用SpringMVC开发的人都知道最常用的定义接口的方式就是借助于@Controller和@RequestMapping等注解实现。而RequestMappingHandlerMapping类就是用于扫描注解和生成URL映射,处理请求时的URL映射匹配等关键功能的。请求时如何到达对应的方法的在DispatchServlet中,doDispatch方法会历各种HandlerMapping。当遍历到RequestMappingHandlerMapping时,RequestMappingHandlerM原创 2021-07-23 00:18:45 · 1206 阅读 · 0 评论 -
SpringBoot基于starter整合RocketMQ (附源码)
目录引入Starter依赖Yml配置发送消息全局的RocketMQTemplate发送事务消息@ExtRocketMQTemplateConfiguration@RocketMQTransactionListener消息消费@RocketMQMessageListenerApache官方提供了rocket-spring-starter用于SpringBoot项目中集成RocketMQ使用,其实是基于rocketmq-client的依赖进行封装的,而且starter有时原创 2021-03-28 14:47:23 · 464 阅读 · 0 评论 -
Springboot整合RabbitMQ使用
引入AMQP依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId></dependency>@EnableRabbit注解启动Rabbit相关配置@Configuration@SpringBootApplication@EnableRabb原创 2021-03-16 15:29:07 · 106 阅读 · 0 评论 -
SpringBoot文件上传
关于文件大小的设置参考上传文件大小限制配置基于SpringMVC实现文件上传接口import com.google.common.collect.Lists;import org.apache.commons.io.FilenameUtils;import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.ObjectUtils;import org.apache.commons.lang3.StringUtils;原创 2021-02-26 16:51:04 · 87 阅读 · 0 评论 -
SpringBoot文件上传相关的配置
做文件上传功能是可能会遇到 如下错误org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.SpringBoot内嵌tomcat默认所能上传的文件大小为1M,超过大小会报错,该问题可以通过下面两种方式解决。1.配置文件配置方式# Sprin原创 2021-02-26 16:03:55 · 766 阅读 · 2 评论 -
Spring中使用到的设计模式
简单工厂(非23种设计模式中的一种)BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象工厂方法FactoryBean接口。实现FactoryBean接口,重写getObject方法自定义Bean的实例类型;spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法。单例模式获取单例Bean的方法实现就是单例模式的实现,提供了全局唯一的获取Bean的方法入口,但原创 2021-02-18 10:06:49 · 247 阅读 · 0 评论 -
Mybatis整合Spring源码分析——Mapper接口的实现
对于一般的类都是通过Spring加载Bean的流程加载,但是Mybatis中的Mapper接口本身并不是类,接口是不能被直接实例化的,那么这些接口时如何被加载到Spring中的呢?简单概括一下就是通过JDK的动态代理创建代理类,然后通过注入BeanDefinition的方式被Spring加载的。MapperScannerConfigurer这个类实现了BeanDefinitionRegistryPostProcessor接口,可以猜到这个接口是用来注册BeanDefinition的,在Sprin原创 2021-02-05 17:48:57 · 234 阅读 · 0 评论 -
JDK和Spring中的SPI机制
SPI(Service Provider Interface)是一种服务提供发现机制,为框架提供良好扩展性的机制。这个机制最大的优点就是无须在代码里指定,进而避免了代码污染,实现了模块的可拔插。JDK的SPI机制在项目的classpath下的META-INF\services目录里创建一个以服务接口命名的文件,内容是实现类的全命名。例如数据库驱动jar包中,文件内容就是oracle.jdbc.OracleDriver这个驱动类Spring的SPI机制项目的classpath下的.原创 2021-01-29 15:56:29 · 241 阅读 · 0 评论 -
分析Spring单例Bean初始化和循环依赖解决方式
Spring IoC 容器会在运行时检测到构造函数注入循环引用,并抛出 BeanCurrentlyInCreationException。Spring 会自动解决基于 setter 注入的循环依赖,所以开发中可以通过使用 setter 注入替代构造函数注入的方式避免循环依赖的异常问题。但是通常我们都是都使用@Autowired注解来注入属性,@Autowired 是通过反射进行赋值的,分析一下看 Spring 是如何解决循环依赖的。单例Bean的创建Spring容器中默认Bean都是单例的,简单..原创 2021-01-27 18:19:44 · 257 阅读 · 0 评论 -
Redis使用之PipeLine
redis的处理速度是微秒级别,而网络传输的速度是毫秒级别,远远慢于redis的处理速度。所以在使用redis时,网络速度会成为redis的一个瓶颈,节省网络传输的时间得到的收益会远高于节省命令执行时间的收益。所以对于批量操作,redis总提供了mset,mget这样的命令。今天要写得是pipeline管道操作,可以把多个命令操作打包成一个pipeline一起发送执行,redis处理完后打包结果返回。mget和pipeline不同之处:M操作是原子性的,而pipeline不是原子性的,执行时会把命令原创 2020-12-28 15:02:46 · 1054 阅读 · 0 评论 -
RabbitMQ确保消息准确发送的实现方案——事务或Confirm机制
前面写了手动ack的方式保证消息准确消费。那么对于生产者来说怎么来保证消息准确的发送呢?在RabbitMQ中确认并且保证消息被送达有两种方式:事务和confirm确认。需要注意的是两者不能同时使用。官方文章中这样说:处于 transactional 模式的 channel 不能再被设置成 confirm 模式,反之亦然。事务事务方式的性能是比较差的,牺牲了性能换取准确性,或许正因为这样才有了第二种confirm机制。...原创 2020-12-24 15:40:41 · 426 阅读 · 0 评论 -
RabbitMQ使用手动ACK签收保证消息成功消费
RabbitMQ默认acknowledge-mode为auto即自动ack模式,只要有消费者接受消息,无论消费是否成功MQ都认为消费成功。网络原因和消费者自身程序原因都有可能导致这条消息没有被正确消费处理,手动Ack的方式就可以较为严格的保证消息终被成功消费。YML配置开启手动Ack模式spring: rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest listener原创 2020-12-24 10:58:48 · 2030 阅读 · 0 评论 -
SpringBoot+RabbitMQ基于死信队列模型实现延迟消息
DLX(Dead Letter Exchange),死信交换器。当队列中的消息被拒绝、或者过期会变成死信,死信可以被重新发布到另一个交换器,这个交换器就是DLX,与DLX绑定的队列称为死信队列。队列中的消息在以下三种情况下会变成死信 (1)消息被拒绝(basic.reject 或者 basic.nack),并且requeue=false; (2)消息的过期时间到期了; (3)队列长度限制超过了。 当队列中的消息成为死信以后,如果队列设置了DLX那么消息会被发送到DLX。通过x-dead-letter-e原创 2020-12-18 18:06:13 · 284 阅读 · 1 评论 -
Spring中@Enable功能开关注解的实现
目录@Import注解驱动实现(@Import+@Configuration)接口驱动实现(@Import+自定义ImportSelector接口实例)自定义功能开关注解经常会用到Spring项目中@EnableXXX这种注解,都是用来启用某种功能,这种注解类似于一种开关,加了这个注解,就能使用某些功能。例如@EnableAsync、@EnableScheduling 等注解。Srping实现Enable模块驱动的方法大致分为两类,一种是注解驱动实现配置,另一种是接口驱动实现配置..原创 2020-12-18 11:19:10 · 1929 阅读 · 0 评论 -
SpringBoot——Filter过滤器
过滤器的实现要实现javax.servlet包下的filter接口:配置方式分为注解方式和xml配置方式:Springboot中肯定是使用注解方式:@WebFilter注解1,@WebFilter()注解标注是一个filter2,value等同于xml配置的url-pattern,是过滤路径。dispatcherTypes 标识拦截的类型,默认为请求类型(REQUEST),此外还有...原创 2019-12-06 18:53:37 · 278 阅读 · 0 评论 -
TaskDecorator——异步多线程中传递上下文等变量
目录TaskDecorator定义TaskDecorator实例线程池使用TaskDecorator开发中很多数据如oauth2的认证信息,日志TracerId都是在请求线程中的,如果内部使用多线程处理就存在获取不到认证信息或TraceId的问题。这时候就需要处理子线程与主线程间数据传递的问题。TaskDecorator这个问题需要使用线程的ThreadLocal和TaskDecorator来处理。官方文档中描述意思是TaskDecorator是一个执行回调方法的装饰器,主要应用于传原创 2020-12-17 11:38:26 · 15859 阅读 · 9 评论 -
基于@EnableAsync使用线程池实现多线程
相对于传统编码的方式使用多线程,在SpringBoot中提供了基于注解的更简单的实现方式:基于@EnableAsync和@Async注解配置:项目使用@EnableAsync开启异步,使用@Async 注解在service内的方法上,这样在controller层直接调用service方法时,可以实现@Async注解的方法在单独线程内运行,实现controller层调用service后即时返回,service方法异步处理的效果。一般会在@Async上注明使用的线程池。@Async 注解的方法要么就原创 2020-12-16 18:17:45 · 1131 阅读 · 1 评论 -
SpringBoot动态数据源的使用
AbstractRoutingDataSourcespring中提供了一个抽象类AbstractRoutingDataSource类,通过这个类可以实现动态数据源切换,分析下这个类的代码片段。public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean { @Nullable private Map<Object, Object> targ原创 2020-12-15 17:09:53 · 462 阅读 · 0 评论 -
@AutoConfigureBefore和@AutoConfigureAfter踩坑
最近做管理系统要单独建一套新的token认证校验等实现,项目中引用的公共包封装了现有一套token认证校验的实现。由于新的认证实现要覆盖原有TokenStore的实现。所以打算使用@AutoConfigureBefore注解在不更改公共jar包的情况下使新的实现类bean配置早于jar包中的实现类初始化配置,这样就能在新项目中使用自定义的实现类了。但是加了注解后发现没有生效。原因:@AutoConfigureBefore和@AutoConfigureAfter这两个注解是针对使用spring.fac原创 2020-11-28 21:04:40 · 2035 阅读 · 0 评论 -
springboot启动流程
Spring Boot 程序的入口是 SpringApplication.run(Application.class, args) 方法。 public ConfigurableApplicationContext run(String... args) { // 1.创建并启动计时监控类 StopWatch stopWatch = new StopWatch(); stopWatch.start(); // 2.声明应用上下文对象和异常报告集合 Conf原创 2020-11-18 15:07:34 · 176 阅读 · 0 评论 -
Springboot入门
1.1.1.设置springboot的parent<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version&原创 2018-03-22 11:27:24 · 194 阅读 · 0 评论 -
Spring Boot Actuator 使用及配置
通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘、内存、CPU等信息,系统的线程、gc、运行状态等等。通常通过HTTP 和 JMX 来管理和监控应用,大多数情况使用 HTTP 的方式。springBoot项目集成Actuator添加Actuator的依赖<dependencies> <dependency> <groupId>org.springframework.boot</group原创 2020-11-13 18:07:33 · 3473 阅读 · 0 评论 -
@ConditionalOnProperty和@ConfigurationProperties的使用
有时候我们需要根据某些配置来控制配置类是否生效,例如生成Token的实现类我们有两种实现类的Bean,一种基于redis,一种基于JDBC,我们想根据配置决定项目启动后使用的是哪一种bean,这时候我们就可以使用@ConditionalOnProperty注解来控制@bean注解是否生效下面的代码理解为:当配置文件中security.oauth2.token.store前缀下的type属性为jdbc时,第一个@Bean生效;type属性为redis时,第二个@Bean生效@Configura.原创 2020-10-27 10:23:34 · 3104 阅读 · 0 评论 -
Redis的几种集群模式和工作原理
主从模式之前的文章:https://blog.csdn.net/qq_29569183/article/details/103101286主节点提供读写,从节点提供读服务,最简单的集群模式。优点:读写分离,提高性能缺点:master节点挂了以后,redis就不能对外提供写服务了,因为剩下的slave不能成为master哨兵模式基于主从模式的缺点,哨兵模式的优点之一就是高可用。介绍主从模式中,当master节点挂了以后,slave节点不能主动选举一个master节点出来,那么.原创 2020-10-10 16:19:03 · 288 阅读 · 0 评论 -
SpringBoot禁止配置数据源
boot中如果引入了数据源相关的依赖就会自动配置数据源,如果项目中不需要连接数据库,可以手动设置禁用数据源的配置。@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MybatisAutoConfiguration.class})这样启动的时候就不会配置数据源和mybatis相关的配置了。根据DataSourceAutoConfiguration 这个类的部分代码可以看到,只要不引入DataSource这个.原创 2020-07-14 11:37:57 · 2763 阅读 · 0 评论 -
基于@Retryable注解的spring重试机制
当有些方法调用因为网络原因调用失败时往往需要重试机制。1.通过while循环或者捕获异常后做处理。2.使用spring提供的重试机制,这种方式的好处是基于AOP实现,没有代码入侵。基于springBoot项目使用@Retryable注解实现重试1.添加依赖 <dependency> <groupId>org.springframework.retry</groupId> <artifactId&g原创 2020-07-07 17:33:13 · 2504 阅读 · 7 评论 -
springBoot中重写默认的消息转换器
当我们想对一些类型做转换的时候,就需要重写默认的消息转换器实现对所有自定类型数据格式的转换通过重写默认的消息转换器实现对Long类型的字段转换为String类型@Configurationpublic class WebConfig extends WebMvcConfigurationSupport { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> c原创 2020-07-02 14:11:51 · 1574 阅读 · 0 评论 -
SpringBoot整合PageHelper实现分页
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${page-helper.version}</version> </dependency>...原创 2020-06-18 21:07:10 · 356 阅读 · 0 评论 -
CommandLineRunner和ApplicationRunner实现项目启动时执行任务
实现在项目启动后执行的功能,SpringBoot提供的一种简单的实现方案就是添加一个Component组件,组件类实现CommandLineRunner接口,把项目启动后要执行的任务的代码放在run方法中如果有多个任务,可以使用@Order(value=1)注解决定任务执行的先后顺序@Slf4j@Componentpublic class CashValueTableCacheListener implements CommandLineRunner { @Autowired原创 2020-06-18 11:28:33 · 632 阅读 · 0 评论 -
SpringBoot——Interceptor过滤器
目录自定义拦截器的实现方式在SpringBoot中使用自定义拦截器:定义拦截器实现WebMvcConfigurer 接口重写addInterceptors()注册拦截器:自定义拦截器的实现方式要实现自定义拦截器就要实现HandlerInterceptor接口,重写接口的三个方法:preHandle:在controller方法执行之前执行。postHandle:...原创 2020-01-01 13:14:05 · 174 阅读 · 0 评论 -
SpringBoot切换不同环境的配置方式
SpringBoot中通过Profile属性配置实现对不同环境提供不同配置功能的支持。可以通过激活、指定参数等方式快速的切换环境1.分多个配置文件不同环境的配置文件使用application-{profile}.yml的格式例如:配置文件分为主配置文件application.yml 和 测试环境application-dev.yml ,生产环境application-prod.yml ...原创 2019-12-27 09:46:36 · 1213 阅读 · 0 评论