Java知名开源项目,5行代码,竟然有4个“bug”

这个世界是由草台班子构成的,只要你想,你也能成为别人眼中的那个技术大佬。

我为什么这么说?请大家先看看以下代码,是某个知名开源项目的代码,大家可以看看这段代码写的怎么样,其中有几处可以优化的地方?

我找到了4个,接下来我依次来进行分析并优化,并解释其底层原理。

先来看第一个"bug"。

@SpringBootApplication@ComponentScan是重复的,@SpringBootApplication本身是一个复合注解:

它包含了以下三个注解:

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan

相当于一个@SpringBootApplication注解同时拥有以上三个注解的功能,因此也就拥有了@ComponentScan注解的功能,也就是Bean扫描,@SpringBootApplication注解中的scanBasePackages属性就是用来设置扫描路径的:

因此,如果你想自定义扫描路径,那么可以直接这么写,完全可以不用@ComponentScan注解:

这是第一个"bug"。

再来看第二"bug"。

在SpringBoot中,如果你没有自定义设置扫描路径,那么SpringBoot默认会取传递给run()方法的配置类(通常就是启动类)所在的包路径,来作为Bean的扫描路径,回到以上代码,很明显,@ComponentScan注解设置的扫描路径,其实就是OpenManusSpringBootApplication这个类所在的包路径,既然是一样的,那么就完全没必要重复设置了,直接这样就可以了:

再结合第一个"bug",把@ComponentScan注解去掉,就变成了:

以上代码,照样会扫描"com.alibaba.cloud.ai.manus"路径,和优化之前效果是一样的,这是第二个"bug"。

再来看第三个"bug"和第四个"bug",这两个"bug"是类似的,所以可以一起分析,也就是它俩:

因为它们设置的扫描路径等于SpringBoot的Bean扫描路径,所以其实这两个注解都可以去掉,因为JPA的自动配置类默认就会用SpringBoot中Bean的扫描路径来扫描Repositories和Entity,我依次来分析。

先来看Repositories的扫描,在JpaRepositoriesAutoConfiguration这个自动配置类中,会先导入JpaRepositoriesImportSelector

然后JpaRepositoriesImportSelector又会导入JpaRepositoriesRegistrar

JpaRepositoriesRegistrar的类名就知道,它就是用来注册Repositories的,它是一ImportBeanDefinitionRegistrar,它里面有一个registerBeanDefinitions()方法,就是核心用来注册Bean的:

而在delegate.registerRepositoriesIn()中

最终会调用这个方法来获取Repositories的扫描路径:

而这个get()方法是这么实现的:

其实就是去拿一个BasePackages类型的Bean,这个Bean是SpringBoot在启动时注册到Spring容器中去的,就是把SpringBoot的Bean扫描路径封装成BasePackages对象注册到Spring容器中,关于SpringBoot启动过程我打算详细一篇文章来分享,可以先关注我,公众号:IT周瑜。

所以,如果你的Repositories扫描路径本身就是Bean的扫描路径,那么就完全可以不写@EnableJpaRepositories注解,因为默认Repositories扫描路径就是Bean的扫描路径。

另外,@EntityScan也是一样的,在HibernateJpaAutoConfiguration自动配置类中,会导入HibernateJpaConfiguration类,它的父类是JpaBaseConfiguration,在JpaBaseConfiguration中会使用以下代码获取扫描路径:

会先判断是不是自定义了扫描路径,如果没有,则获取Bean的扫描路径来作为Entity的扫描路径。

以上就是我分析的4个"bug",所以,对于以下原始代码:

完全可以优化为:

在我看来,这可舒服多了,不过不过不过,你真的会这么优化吗,哈哈,是不是感觉优化完,心里没底?

记得点赞、关注、分享 ,关注我的公众号:IT周瑜,有更多技术干货。

相关推荐
Lightpwd8 小时前
Spring Boot 多数据源落地:AbstractRoutingDataSource + 注解切面(附源码)
数据库·后端
乱码三千8 小时前
使用ComfyUI+MinMax-H3音视频模型生成视频
前端·后端·github
Shinomiya8 小时前
最近在学进程调度和环境变量,记点心得
后端
分支预测失败8 小时前
RISC-V 核间中断 IPI 实战:从 MSIP 寄存器到 IMSIC 消息投递
linux·后端
shehuiyuelaiyuehao9 小时前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法
用户850869276159 小时前
Rust系统编程在任务调度中的踩坑与优化之路
后端
小刘在重生~9 小时前
Java常用类|String类详解 + BigDecimal精准计算(含面试题)
java·开发语言·python
随遇而安zx9 小时前
【多线程】---JMM 与 volatile 深度解析
java·多线程
邪修king9 小时前
Re:Linux系统篇(十九):进程篇(八): 进程等待详解:wait/waitpid,僵尸进程到底该如何回收
java·开发语言