Spring/Spring Boot
文章平均质量分 54
程铭程铭你快成名
这个作者很懒,什么都没留下…
展开
-
深度解析@Async引起的循环依赖
啊,昨晚发版又出现了让有头大的循环依赖问题,按理说Spring会为我们解决循环依赖,但是为什么还会出现这个问题呢?为什么在本地、UAT以及PRE环境都没有出现这个问题,但是到了PROD环境就出现了这个问题呢?本文将从事故时间线、及时止损、复盘分析等几个方面为大家带来详细的分析,干货满满!事故时间线本着"先止损、后复盘分析"的原则,我们来看一下这次发版事故的时间线。2021年11月16日晚23点00分00秒开始发版,此时集团的devops有点慢2021年11月16日晚23点03分01秒,收到发版失败原创 2021-11-17 18:12:19 · 5045 阅读 · 4 评论 -
延时消息推送的正确姿势你get到了吗?
延时消息推送的应用场景想必大家都不陌生:自动收货订单10分钟后自动取消废话不多说,直接上代码。在 RabbitMQ 3.6.x 开始,RabbitMQ官方提供了延迟队列的插件,可以下载放置到RabbitMQ 根目录下的 plugins 下。延迟队列插件下载地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchangemaven依赖如下application.properties如下MQ的配置如下我们在 Exchange原创 2021-10-13 11:39:03 · 2413 阅读 · 0 评论 -
超详细的SpringBoot+MySQL读写分离方案
在互联网应用中,大部分都是读多写少的场景,设置两个库,主库和读库,主库的职能是负责写,从库主要是负责读,可以建立读库集群,通过读写职能在数据源上的隔离达到减少读写冲突、释压数据库负载、保护数据库的目的。主从数据源的配置通过@ConfigurationProperties注解,可以将配置文件(一般命名为:application.yml)里的属性映射到具体的类属性上,从而读取到写入的值注入到具体的代码配置中,按照习惯大于约定的原则,主库我们都是注为master,从库注为slave,接着需要配置sessio原创 2021-02-26 11:54:49 · 4322 阅读 · 3 评论 -
原来Spring是这样解决循环依赖的
什么是循环依赖通常来说,Spring循环依赖的场景一般是单例Bean。几个Bean之间的循环依赖@Componentpublic class A { @Autowired private B b;}@Componentpublic class B { @Autowired private C c;}@Componentpublic class C { @Autowired private A a;}自己依赖自己@Com原创 2020-08-07 11:53:17 · 7961 阅读 · 0 评论 -
Spring中涉及的设计模式总结
原文地址:https://blog.csdn.net/caoxiaohong1005/article/details/800396561.简单工厂实现方式:BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。实质:由一个工厂类根据传入...转载 2020-03-16 15:09:44 · 10385 阅读 · 0 评论 -
微服务中如何处理全局异常
微服务中,全局异常处理是一个必须解决的客观课题,如果这些异常处理不好的话,就会给用户看到一些不友好的错误信息,比如客户看到了空指针异常,SQL执行错误等异常,客户肯定是看不懂的,从而大大降低用户体验。全局异常处理的常见解决方案定义一个处理异常的类,需要处理异常的Controller直接继承这个类,从而获取到异常处理的方法。虽然这种方式可以解决问题,但是极其不灵活,因为动用了继承机制就只为获取...原创 2020-03-04 17:38:31 · 3169 阅读 · 0 评论 -
Spring/Spring Boot重点知识整理
Why Spring非侵入式:支持基于POJO的编程模式,不强制性的要求实现Spring框架中的接口或继承Spring框架中的类,这些功能赋予了将其与其他技术结合使用的灵活性。例如,我们可以使用@Inject不是基于Spring的注解的注解来注入依赖项。IOC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码...原创 2020-02-18 18:18:46 · 10786 阅读 · 6 评论 -
Spring中两种动态代理:JDK动态代理和CGLib动态代理
基本概念自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方。JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler。其中,InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横...原创 2020-02-17 15:33:58 · 1715 阅读 · 0 评论 -
枚举策略代替项目中大片的if-else
之前看过很多用策略模式代替if-else的文章,看过之后受到启发,于是我也在项目中应用了策略模式,但是我用的是枚举策略替换掉了项目中大片的if-else。并且在Effective Java 第二版的第30条中推荐使用枚举策略模式,所以用一个小demo记录一下枚举策略模式。不使用策略模式如果不使用策略模式,那么代码就会像如下一样,看起来很臃肿。 public String handle(Ord...原创 2019-11-07 11:03:56 · 3063 阅读 · 0 评论 -
在微服务中使用Spring-Retry
Spring-Retry为Spring应用程序提供声明式重试机制。在微服务架构中,服务之间的调用会依赖网络,或者在调用第三方接口或者使用mq时,会出现网络抖动,连接超时等网络异常,所以需要重试。Spring-Boot项目使用Spring-Retry非常简单,在配置类加上@EnableRetry注解启用spring-retry,然后在需要失败重试的方法加@Retryable注解即可,Spring...原创 2019-10-31 16:31:59 · 1755 阅读 · 0 评论 -
微服务中使用AOP实现防止接口二次提交
无论在微服务还是单体程序中,防止接口二次提交都是必须要解决方法,现在已经有成熟的解决方案,比如采用点击一次后让按钮置灰,等请求结束后再可以点击。当然后端也要解决这个问题。采用AOP的方式防止接口二次提交思路以唯一标识为key,任意值为value,存入redis(本地缓存也可以),并设置一个合理的过期时间。将注解用在新增、修改等接口上。每次调用时根据key判断,缓存是否存在,存在则抛出...原创 2019-10-20 17:49:43 · 3395 阅读 · 0 评论 -
在微服务中使用线程变量(ThreadLocal)
背景在微服务开发中,经常涉及到多线程需要共享变量的时候,传统的解决方案就是就是使用互斥锁,使得在每个时刻只能有一个线程访问该变量,好处就是便于编码(直接使用 synchronized 关键字进行同步访问),但是缺点也明显,这种方法增加了线程间的竞争,降低了效率。本文将以另一种思路去解决这个问题,也就是使用ThreadLocal。ThreadLocal介绍ThreadLocal作为JD...原创 2019-10-17 11:15:39 · 5453 阅读 · 0 评论 -
在微服务中整合MapStruct
背景在SpringBoot项目中,我们通常会使用BeanUtils.copyProperties来实现对象属性拷贝。但是BeanUtils.copyProperties的缺点很明显,如果对象中的字段发生了变化,就会导致拷贝失败,就会在项目中留下潜在的bug。MapStruct介绍GitHub地址官方文档MapStruct 是用于生成类型安全,高性能和无依赖 bean映射代码的注...原创 2019-10-16 17:34:07 · 2323 阅读 · 0 评论 -
使用Spring AOP快速定位线上项目性能问题
前提这篇文章以Spring AOP为例,介绍如何快速定位执行效率较低的方法,从而解决服务运行较慢的问题。如果不是很了解Spring AOP的小伙伴,可以先看一下我的这篇文章:Spring学习之AOP,然后再回来继续看这篇文章。背景最近线上项目总是收到客户发来的邮件,吐槽有一些动作要等好几十秒才能有反应,问我们是不是项目出什么问题了。看到邮件的第一反应就想到可能有一些方法执行的时间太长了,导致...原创 2019-08-01 16:29:39 · 6268 阅读 · 0 评论 -
Idea远程调试Spring Boot项目
背景公司有个Spring Boot的单体项目最近出了点问题,因为生产环境部署在国外,本地不能再现现象,而且单纯的看log也看不出什么问题,所以尝试远程debug项目。配置remote打开Idea的Edit Configurations新增一个remote之后会出现配置框,填写服务器ip,调试的端口等信息以上就配置好了,点击Apply或者OK关于debug模式解释(默认是Att...原创 2019-08-01 11:26:00 · 4020 阅读 · 0 评论 -
Spring Boot集成rabbitMQ实现消息推送
简介Spring Boot集成rabbitMQ实现消息推送,rabbitMQ为异步消息处理提出了一个很好的解决方案,它是一个非常好用的消息中间件。主要解决当生产者大量产生数据时,消费者无法快速消费的问题。这个时候需要一个中间层,保存这个数据,rabbitMQ是一个很好的解决方案。Spring Boot为rabbitMQ提供了支持, Spring Boot为rabbitMQ准备了spring-...原创 2019-09-17 15:59:36 · 5346 阅读 · 3 评论 -
一文搞懂Spring中的事务管理
什么是事务?有一个最典型的例子用来描述事务:在银行里,一个人A给另一个人B转账100元,那么银行会有以下两个操作:给A的账户扣100元给B的账户增加100元但如果在转账的过程中银行系统出了问题,可能会有以下情况:A的账户扣了钱,B的账户没有增加钱A的账户没扣钱,B的账户增加了钱上述两种情况都是不符合期望的,但故障总是可能会发生的,那怎么解决这个问题呢?就是用事务。事务是一系...原创 2019-07-17 17:29:30 · 4944 阅读 · 0 评论 -
Spring Boot2.x 使用多线程
关于Spring Boot多线程Spring是通过任务执行器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor来创建一个基于线城池的TaskExecutor。在使用线程池的大多数情况下都是异步非阻塞的。我们配置注解@EnableAsync可以开启异步任务。然后在实际执行的方法上配置注解@Async上声明是异步任务。配置类代码如下利用Ena...原创 2019-04-29 17:00:05 · 3641 阅读 · 0 评论 -
Spring Validation验证框架在实际项目中的应用
在介绍Spring Validation验证框架之前,先看一下我们常用的校验注解都有哪些限制说明@Null限制只能为null@NotNull限制必须不为null@AssertFalse限制必须为false@AssertTrue限制必须为true@DecimalMax(value)限制必须为一个不大于指定值的数字@DecimalMin(va...原创 2019-08-29 14:54:35 · 4405 阅读 · 0 评论 -
Spring Boot 2.0版本 全局配置跨域请求支持
Spring Boot 2.0以前全局配置跨域主要是继承WebMvcConfigurerAdapter@Configurationpublic class CorsConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { ...原创 2018-09-20 09:43:42 · 4484 阅读 · 0 评论 -
Spring MVC参数的传递与接收
SpringMVC主要做的就两方面的操作。在Controller接收从jsp传递过来的数据把Controller的数据传递到jsp页面将Controller里边的数据传到jsp其返回值有三种类型 * ModelAndView * void * String@Control...转载 2018-06-04 21:19:11 · 1782 阅读 · 0 评论 -
Spring事务管理
什么是事务可以理解为每次与数据库交互的过程就是一个事务。事务是将若干的数据库操作作为一个整体控制,一起成功或一起失败。事务的四大特性原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。一致性:指事务前后数据的完整性必须保持一致。隔离性:指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。持久性:指一个事...原创 2018-04-19 15:42:52 · 1256 阅读 · 0 评论 -
SpringBoot中常见的注释以及使用场景
@Configuration 通常作用在主类上,是启动类。@SpringBootApplication 作为SpringBoot中的一个重要配置,用于快捷配置启动类。@SpringBootApplication注解等价于以默认属性使用 @Configuration ,@EnableAutoConfiguration和@ComponentScan 。@EnableTransactionM...原创 2018-06-06 16:09:11 · 3585 阅读 · 0 评论 -
Spring Security无法登陆,报错:There is no PasswordEncoder mapped for the id "null"
今天在使用Spring Security进行登录验证的时候,发现报了如下错误:Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.Sun Jul 15 20:17:20 CST 2018There was an u...原创 2018-07-15 20:23:47 · 2518 阅读 · 0 评论 -
Spring学习之AOP
什么是AOPAOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。通俗来讲,在我们的应用中,诸如常见的日志、安全、异常处理和事物等逻辑...原创 2018-07-30 14:01:20 · 1838 阅读 · 0 评论 -
Spring学习之IOC和DI
首先我想明确它们之间的关系:IOC:控制反转,把创建对象的过程交给Spring去管理,自己不做任何关注。DI:依赖注入,向Bean里的属性进行设值。DI是不可以自己独立进行工作的,必须要在IOC的基础上完成工作,也可以理解为DI是IOC的一种实现。什么是IOC?首先我想谈一下我自己的想法IOC全名是Inverse Of Control,意思是控制反转,那么这个控制反转到...原创 2018-07-27 11:27:55 · 1820 阅读 · 0 评论