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周瑜,有更多技术干货。

相关推荐
QC班长5 小时前
Maven公司私库配置踩坑点
java·服务器·maven·intellij-idea
Makoto_Kimur5 小时前
java开发面试-AI Coding速成
java·开发语言
wuqingshun3141595 小时前
说说mybatis的缓存机制
java·缓存·mybatis
小兵张健6 小时前
一场大概率没拿到 offer 的面试,让我更坚定去做喜欢的事
人工智能·面试·程序员
空中海6 小时前
Kubernetes 生产实践、可观测性与扩展入门
java·贪心算法·kubernetes
Devin~Y6 小时前
大厂Java面试实录:Spring Boot/Cloud、Kafka、Redis、K8s 与 Spring AI(RAG/Agent)三轮连环问
java·spring boot·redis·mysql·spring cloud·kafka·kubernetes
bLEd RING6 小时前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
小松加哲6 小时前
Spring MVC 核心原理全解析
java·spring·mvc
GetcharZp6 小时前
比 Zap 还要快?Go 社区高性能日志神器 Zerolog 落地实践指南
后端
Ulyanov7 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真