
spring、spring-mvc、spring-boot
文章平均质量分 70
埃泽漫笔
OceanBase开源项目ODC(OceanBase Developer Center)的核心贡献者,Github地址:https://github.com/oceanbase/odc,希望大家能赏脸支持下我们OceanBase公司的开源项目,点亮一颗小星星就行。
Maven中央仓库OceanBase开源组件 https://central.sonatype.com/artifact/com.oceanbase/db-browser 和 https://central.sonatype.com/artifact/com.oceanbase/ob-sql-parser 的核心贡献者。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring事务的隔离级别
Spring建议的是使用DEFAULT,就是数据库本身的隔离级别,配置好数据库本身的隔离级别,无论在哪个框架中读写数据都不用操心了。而且万一Spring没有把这几种隔离级别实现的很完善,出了问题就麻烦了。原创 2025-05-08 23:01:22 · 435 阅读 · 0 评论 -
Spring事务的传播行为
事务行为说明支持当前事务,假设当前没有事务。就新建一个事务支持当前事务,假设当前没有事务,就以非事务方式运行支持当前事务,假设当前没有事务,就抛出异常新建事务,假设当前存在事务。把当前事务挂起以非事务方式运行操作。假设当前存在事务,就把当前事务挂起以非事务方式运行,假设当前存在事务,则抛出异常如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。原创 2025-05-08 21:25:31 · 1037 阅读 · 0 评论 -
同时使用 @Transactional 与 @Async 时,事务会不会生效
通过以上三个 case 你会发现,如果在事务中,开启了新的线程,那么就会导致多个线程之间不在同一个事务中,会导致事务隔离。这是因为,@Transactional 的事务管理使用的是机制来存储事务上下文,而 ThreadLocal 变量是线程隔离的,即每个线程都有自己的事务上下文副本。因此,在多线程环境下,Spring 的声明式事务会“失效”,即新线程中的操作不会被包含在原有的事务中。原创 2025-01-26 20:58:12 · 359 阅读 · 0 评论 -
Spring 中注入 Bean 的方式
注入 Bean,就是说已经有一个 Bean 了,我想在其他的 Bean 中使用它,就要注入。比如场景的我们在 Service 中注入Dao。在 Spring 中,Bean 的注入也是非常常见的操作了,有以下几种形式。原创 2025-01-26 20:40:52 · 213 阅读 · 0 评论 -
Spring中Bean的创建方式
注解,这个其实是 RPC框架 Dubbo 提供的一个注解,他也能把一个类的实例创建出来,并且放到 Spring 的容器中作为一个 Bean,等待后续被远程调用。在 SpringBoot 的应用中,我们通常会见到通过@Bean 注解来定义 Bean 的代码,尤其是在我们自己需要封装 Starter 的时候。通过在类上使用 @Configuration 注解,然后类内部的方法上增加 @Bean 注解,来用该方法来定义一个 Bean。Spring 中提供了很多注解,可以直接把一个类的实例定义成 Bean。原创 2025-01-26 20:29:23 · 309 阅读 · 0 评论 -
@Scheduled的实现原理以及用法
ConcurrentTaskScheduler 是 TaskScheduler 接口的一个实现,可以并发调度多个任务,确保任务能够按时执行,它是借助。从上图可以看到,这里根据不同的任务类型,调用了 registrar 的不同的调度方法,这个registrar是啥呢?这里面是将任务给到taskScheduler进行调度执行了,这里的taskScheduler,默认是。是和这个定时任务调度有关的一个 bean 的后置处理器,这里面有着处理。的处理逻辑,并且在第27行,我们看到,他把找到的标注了。原创 2025-01-26 12:01:08 · 539 阅读 · 0 评论 -
Spring的@Autowired能用在集合上吗
在Spring框架中,@Autowired 注解不仅可以用于单个bean的注入,还可以用于注入复杂的集合类型,如List、Map、Set等。这种机制非常有用,尤其是当你需要注入同一类型的多个bean时。原创 2025-01-26 09:56:38 · 295 阅读 · 0 评论 -
如何根据配置动态生成Spring的Bean
在 Spring 应用中,根据运行时的配置(比如数据库配置、配置文件、配置中心等)动态生成 Spring Bean 是一种常见需求,特别是在面对多环境配置或者需要根据不同条件创建不同实例时。Spring 提供了几种方式来实现这一需求。原创 2025-01-25 20:40:11 · 363 阅读 · 0 评论 -
Spring的事务在多线程下生效吗?
即每个线程都有自己的事务上下文副本。因此,在多线程环境下,Spring 的声明式事务会“失效”,即新线程中的操作不会被包含在原有的事务中。这里面关键的一部就是第11行, resources.set(map);这个resources是啥呢?重点是上面的第47-49行代码,这里是把一个connection和当前线程进行绑定。Spring 的事务有多种实现,主要包括了声明式事务和编程式事务。其实就是可以定义一个名字的ThreadLocal而已。看到了吧,ThreadLocal!的实现中,如我们看一下。原创 2025-01-25 18:54:33 · 450 阅读 · 0 评论 -
为什么SpringBoot 3中移除了spring.factories
通过创建实现Processor接口的注解处理器,开发者可以在源代码编译阶段读取注解信息,并根据注解生成新的源代码或资源文件。在SpringBoot 2.7中,官方已经明确的说了,使用spring.factories这种自动配置的方式已经过时了,并且将在SpringBoot 3.0中彻底移除。这是因为Spring 2.7之后,不仅新增了这种配置方式,还提供了一个新的注解,就是这个。的方式,它允许在编译时检查、处理注解,并且可以生成新的源代码、资源文件或其他文件。我们知道,云原生时代中,最重要的是什么?原创 2025-01-25 18:47:28 · 1243 阅读 · 0 评论 -
如何自定义一个starter
在Spring Boot中,创建一个自定义starter可以简化特定功能或组件的配置过程,让其他项目能够轻松地重用这些功能。这里我们以自定义一个xxl-job的starter为例,介绍下如何简化配置。原创 2025-01-25 18:35:57 · 432 阅读 · 0 评论 -
Spring中如何实现多环境配置
这样,启动应用时,Spring 将根据激活的 Profile 加载相应的配置。在这个例子中,如果激活的是 prod Profile,将创建并使用 ProdConfig 中的 Bean。我们平常在开发的时候,会有多套环境,开发环境、测试环境、预发布环境以及生产环境,不同的环境中应用的配置可能不太一样。那么在如何利用Spring来管理这些配置呢?Spring 的 Profile 是一种通过在不同环境中使用不同配置的方式来实现条件化配置。Profile 允许你为不同的环境定义特定的配置。激活 Profile。原创 2025-01-25 18:27:15 · 122 阅读 · 0 评论 -
Spring 中的 Bean 作用域
所谓作用域,其实就是说这个东西哪个范围内可以被使用。如我们定义类的成员变量的时候使用的publicprivate等这些也是作用域的概念。Spring的Bean的作用域,描述的就是这个Bean在哪个范围内可以被使用。不同的作用域决定了 Bean 的创建、管理和销毁的方式。常见的作用域有这五种。我们在代码中,可以在定义一个Bean的时候,通过@Scope注解来指定他的作用域@Service单例(Singleton)默认作用域。原创 2025-01-25 18:21:35 · 682 阅读 · 0 评论 -
Spring 中的 Bean 是线程安全的吗?
但是需要注意,Prototype的bean,每次从容器中请求一个 Prototype Bean 时,都会创建一个新的实例。那如果一个Singleton的Bean中是无状态的,即没有成员变量,或者成员变量只读不写,那么他就是个线程安全的。但是对于Singleton的Bean,就可能存在线程安全问题了,但是也不绝对,要看这个Bean中是否有共享变量。对于Prototype这种作用域的Bean,他的Bean 实例不会被多个线程共享,所以不存在线程安全的问题。建议使用这种,既能保证线程安全,又有比较好的性能。原创 2025-01-25 18:07:57 · 386 阅读 · 0 评论 -
@Lazy解决构造器注入的循环依赖
在默认情况下,Spring容器会在启动时创建并初始化所有的单例bean。这意味着,即使某个bean直到很晚才被使用,或者可能根本不被使用,它也会在应用启动时被创建。在这里,即使SomeClass在容器启动时被创建,LazyBean也只会在SomeClass实际使用LazyBean时才被初始化。那么,这种循环依赖就束手无策了吗?在这种情况下,LazyBean 只有在首次被使用时才会被创建和初始化。其实并不是,这种循环依赖可以借助Spring的@Lazy来解决。的实例会在首次被实际使用时才创建,而不是在创建。原创 2025-01-25 18:02:49 · 359 阅读 · 0 评论 -
如何在Spring启动过程中做缓存预热
ApplicationReadyEvent 是 Spring Boot 框架中的一个事件类,它表示应用程序已经准备好接收请求,即应用程序已启动且上下文已刷新。这个事件是在 ApplicationContext 被初始化和刷新,并且应用程序已经准备好处理请求时触发的。CommandLineRunner 和 ApplicationRunner的调用,是在SpringApplication的run方法中。在应用程序启动时,可以通过监听应用启动事件,或者在应用的初始化阶段,将需要缓存的数据加载到缓存中。原创 2025-01-25 15:58:15 · 259 阅读 · 0 评论 -
Spring中@Service 、@Component、@Repository等注解区别是什么
在Spring框架中,有很多用来声明Spring管理的bean的常用注解。原创 2025-01-25 15:49:25 · 208 阅读 · 0 评论 -
SpringBoot如何优雅停机
当你发送POST请求到/actuator/shutdown时,应用将接收到关闭命令并开始进行优雅停机。在Web应用开发中,确保应用可以平稳可靠的关闭是至关重要的。在我们常用的Spring Boot中其实提供了内置功能来优雅地处理应用程序的关闭的能力。通过这个设置,当你停止服务器时,它将不再接受新的请求。与突然终止应用程序不同,优雅停机确保所有进程都得到优雅停止,以防止潜在的数据损坏或丢失。默认的等待时长是30秒,我们通过以上配置可以将这个等待时长延长直2分钟。先说一下啥是优雅停机,其实他指的是。原创 2025-01-25 15:45:56 · 242 阅读 · 0 评论 -
Spring的三级缓存
singletonObjects是一级缓存,存储的是完整创建好的单例bean对象。在创建一个单例bean时,会先从singletonObjects中尝试获取该bean的实例,如果能够获取到,则直接返回该实例,否则继续创建该bean。earlySingletonObjects是二级缓存,存储的是尚未完全创建好的单例bean对象。在创建单例bean时,如果发现该bean存在循环依赖,则会先创建该bean的"半成品"对象,并将"半成品"对象存储到earlySingletonObjects中。当循环依赖的bea原创 2025-01-25 15:41:27 · 798 阅读 · 0 评论 -
为什么不建议直接使用Spring的@Async
直接用默认的,代码如下/*** 案件中心内部事件监听器*/@Component@Async//执行发送欢迎短信的逻辑并且把他声明为@Configuration,然后也可以把Application.java中的放到这里。/*** 案件中心内部事件监听器*/@Component//执行发送欢迎短信的逻辑//这里注意要控制好并发,这个例子就不细说了在@Async中指定registerSuccessExecutor即可。这样在后续执行时,就会用到我们自定义的线程池了。原创 2025-01-25 14:26:53 · 263 阅读 · 0 评论 -
Spring中的事务事件
触发条件:事务事件在事务提交后触发,而普通事件在应用的生命周期中的任何时刻都可以触发。依赖性:事务事件依赖于事务的成功,而普通事件与事务无关。用途:事务事件适用于需要在事务完成时执行的操作,如数据验证、通知发送等;普通事件适用于应用启动、关闭或其他生命周期事件。注册方式:事务事件通常通过注解注册,而普通事件通过实现接口或使用注解注册。总之,事务事件和普通事件在Spring中的应用场景和触发机制上有所不同,开发者应根据具体需求选择合适的事件类型。原创 2025-01-25 11:02:16 · 963 阅读 · 0 评论 -
Spring Event做事件驱动
Spring Event是Spring框架中的一种事件机制,它允许不同组件之间通过事件的方式进行通信。Spring框架中的事件机制建立在观察者模式的基础上,允许应用程序中的组件注册监听器来监听特定类型的事件,并在事件发生时执行相应的操作。事件(Event):事件是一个普通的Java对象,用于封装关于事件发生的信息。通常,事件类会包含一些数据字段,以便监听器能够获取事件的相关信息。事件发布者(Event Publisher):事件发布者是负责触发事件并通知所有注册的监听器的组件。原创 2025-01-25 10:48:37 · 399 阅读 · 0 评论 -
SpringBoot和Spring的联系
Spring是一个非常强大的企业级Java开发框架(Java的腾飞他居功至伟),提供了一系列模块来支持不同的应用需求,如依赖注入、面向切面编程、事务管理、Web应用程序开发等。原创 2025-01-24 19:23:14 · 160 阅读 · 0 评论 -
Spring的AOP在失效场景
以上,都是因为在对象内部直接调用其他方法,就会用原始对象直接调用了,不会调用到代理对象,所以代理会失效。首先就是类内部的调用,比如一些私有方法调用,内部类调用,以及同一个类中方法的自调用等。什么情况下会不走代理对象的调用呢?3、final方法调用。原创 2025-01-24 19:13:49 · 181 阅读 · 0 评论 -
Spring中shutdownhook的作用
在Spring框架中,Shutdown Hook(关闭钩子)是一种机制,用于在应用程序关闭时执行一些清理操作。Spring会向JVM注册一个shutdown hook,在接收到关闭通知的时候,进行bean的销毁,容器的销毁处理等操作。在Spring框架中,可以使用AbstractApplicationContext类或其子类来注册Shutdown Hook。这些类提供了一个registerShutdownHook()方法,用于将Shutdown Hook与应用程序上下文关联起来。很多中间件的优雅原创 2025-01-24 19:06:13 · 197 阅读 · 0 评论 -
SpringBoot的启动流程
以下就是一个SpringBoot启动的入口,想要了解SpringBoot的启动过程,就从这里开始。这里我们直接看重点的方法。最终就是这部分代码了。那么接下来就需要分两方面介绍SpringBoot的启动过程。一个是的初始化过程,一个是的启动过程。原创 2025-01-24 18:58:12 · 628 阅读 · 0 评论 -
SpringBoot为什么能启动web项目
在Spring Boot中,通过SpringApplication类的静态方法run来启动Web项目。当我们在main方法中调用run方法时,Spring Boot使用一个,并将其配置为处理Web请求。当应用程序启动时,Spring Boot会自动扫描应用程序中所有的Spring组件,并使用默认的配置来启动。在默认情况下,Spring Boot会自动配置大部分的Web开发所需的配置,包括请求处理、视图解析、静态资源处理等。这样,在应用程序启动后,我们就可以通过Web浏览器访问应用程序了。原创 2025-01-24 15:43:42 · 298 阅读 · 0 评论 -
SpringBoot的自动配置
假设你希望一个或多个bean只有在某种特殊的情况下才需要被创建,比如,一个应用同时服务于中美用户,要在中美部署,有的服务在美国集群中需要提供,在中国集群中就不需要提供。在Spring 4之前,要实现这种级别的条件化配置是比较复杂的,但是,Spring 4引入了一个新的。的入口类,入口类中有一个main方法,这个方法其实就是一个标准的Java应用的入口方法。中的jar包、类,为jar包里的类自动配置,这样可以极大的减少配置的数量。看到上面的代码,终于找到了我们要找的东西——Spring 4的条件化配置。原创 2025-01-24 15:04:42 · 592 阅读 · 0 评论 -
利用AOP统计Bean中的方法调用次数demo
通过AOP即可实现,通过AOP对Bean进行代理,在每次执行方法前或者后进行几次计数统计。这个主要就是考虑好如何避免并发情况下不准,以及如何使用AOP实现代理。但是需要注意的是,这个统计结果只在内存中有效,如果应用发生重启,就会归零了。如果想要持久化保存,就需要考虑持久化存储了,如存在mysql或者redis中。另外,如果并发特别高,对统计结果要求没那么精确, 可以用LongAdder替代AtomicInteger。以上,当test方法被调用时,就会自动统计调用次数。原创 2025-01-24 12:16:01 · 145 阅读 · 0 评论 -
Spring Boot 如何控制bean 初始化顺序
Spring的Bean在初始化之前,会通过BeanFactoryPostProcessor#postProcessBeanFactory对工厂进行处理,我们可以依赖这个特性,在此刻提前初始化我们需要的bean。前两种方式只能对于特定的Bean生效,如果我们希望某个Bean在其他所有Bean加载之前就初始化,用前面两种方式显然是不合适的,我们这个时候,就需要从Spring容器的生命周期中去找方法。这样在读取的时候,beanList中,BeanA的顺序是先于BeanB的。,不能控制不同Bean的。原创 2025-01-24 12:03:44 · 342 阅读 · 0 评论 -
SpringMVC执行流程和路由设计
之间的映射,如果交给我们来设计的话,可能会用一个大的map将url和controller中对应的方法作为键值对存储起来,以此来达到路由的目的。中处理的时候,首先会解析http request中的数据,以此来拿到对应的。通过类图我们可以发现,SpringMVC有一个特别巧秒的地方,就是抽出一个。对于Spring MVC的流程中来说,当http请求进入tomcat并在。在计算机程序处理中,但凡涉及到路由,那包含到的数据结构一定是和。我们知道,对于Http请求来说,tomcat执行了。注解的方法和类封装成一个。原创 2025-01-24 11:52:21 · 608 阅读 · 0 评论 -
MVC和三层架构的联系
它将应用程序分为三个部分:模型、视图和控制器。这个模式的目的是将应用程序的表示(视图)与处理(控制器)分开,以及将应用程序的数据和业务逻辑(模型)与表示和处理分开。MVC 和三层架构并不是互斥的,可以结合使用。例如,在三层架构中使用MVC来处理用户界面的部分是很常见的。三层架构的主要目标是将不同的关注点分离,以便更容易管理和维护应用程序,同时提供更好的可扩展性和重用性。MVC是指Model-View-Controller,是一种。来,从而使得应用程序更加灵活、易于维护和扩展。原创 2025-01-24 11:35:35 · 431 阅读 · 0 评论 -
Spring事务失效的可能原因
Spring中比较容易失效的就是通过@Transactional 定义的声明式事务,他在以下几个场景中会导致事务失效,首先,就是Spring的@Transactional是基于Spring的AOP机制实现的,而AOP机制又是基于动态代理实现的。那么如果代理失效了,事务也就会失效。原创 2025-01-24 10:47:56 · 416 阅读 · 0 评论 -
Spring中的循环依赖问题
Spring无法解决构造函数的循环依赖,是因为在对象实例化过程中,构造函数是最先被调用的,而此时对象还未完成实例化,无法注入一个尚未完全创建的对象,因此Spring容器无法在构造函数注入中实现循环依赖的解决。因此,可以通过提前暴露半成品对象的方式来解决循环依赖的问题。但在构造函数注入中,对象的实例化是在构造函数中完成的,这样就无法使用类似的方式解决循环依赖问题了。解决循环依赖的问题,因为在后续的创建过程中,可能会涉及到不同的原型对象实例,无法像。构造器注入的循环依赖,可以通过一定的手段解决。原创 2025-01-24 10:37:01 · 255 阅读 · 0 评论 -
Spring中用到了哪些设计模式
Spring有着非常优雅的设计,很多地方都遵循SOLID原则,里面的设计模式更是数不胜数。原创 2025-01-24 10:26:29 · 856 阅读 · 0 评论 -
Spring如何开启事务
事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种。原创 2025-01-24 00:49:13 · 773 阅读 · 0 评论 -
Spring在业务中常见的使用方式
但是,我们在使用事务的时候,一定要注意,不能在事务中处理分布式缓存,RPC等操作,这样做有两个坏处,一个是RPC的RT很长,有可能引起长事务的问题,另一方面是如果事务执行失败进行回滚,RPC操作的调用时无法回滚的。抽象了下游不同DataSource的实现(如,JDBC,Mybatis,Hibernate等),让我们不用再关心下游的事务提供方究竟是谁,直接启动事务即可。大概的实现思路就是先定义一个注解,然后通过AOP去发现使用过该注解的类,对该类的方法进行代理处理,增加额外的逻辑,譬如。原创 2025-01-24 00:28:22 · 565 阅读 · 0 评论 -
BeanFactory和FactroyBean的关系
当在Spring配置文件中定义一个Bean时,如果这个Bean实现了FactoryBean接口,那么Spring容器不直接返回这个Bean实例,而是返回FactoryBean#getObject()方法所返回的对象。是不是还是听不懂?那我给你举个具体的例子你就知道了。Dubbo用过吧(没用过?那可能理解起来比较吃力,因为FactoryBean确实是在很多框架中用到的比较多,比如Kafka、dubbo等各种框架中都会用他来和Spring做集成)。原创 2025-01-23 23:52:39 · 711 阅读 · 0 评论 -
@Autowired和@Resource的关系
对于下面的代码来说,如果是Spring容器的话,两个注解的功能基本是等价的,他们都可以将bean注入到对应的field中。原创 2025-01-23 20:53:40 · 141 阅读 · 0 评论 -
Spring的事务传播机制
在复杂的业务场景中,多个事务方法之间的调用可能会导致事务的不一致,如出现数据丢失、重复提交等问题,使用事务传播机制可以避免这些问题的发生,保证事务的一致性和完整性。假设有两个业务方法A和B,方法A在方法B中被调用,需要在事务中保证它们的一致性,如果方法A或方法B中的任何一个方法发生异常,则需要回滚事务。,如果不存在事务则开启一个事务,如果存在事务则加入之前的事务,总是只有一个事务在执行。,如果之前有事务,则创建嵌套事务,嵌套事务回滚不影响父事务,反之父事务影响嵌套事务。,强制有事务,没有事务则报异常。原创 2025-01-23 20:01:14 · 373 阅读 · 0 评论