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

相关推荐
mjhcsp1 小时前
C++ Manacher 算法:原理、实现与应用全解析
java·c++·算法·manacher 算法
Coder_Boy_1 小时前
基于SpringAI的在线考试系统-企业级软件研发工程应用规范案例
java·运维·spring boot·软件工程·devops
indexsunny1 小时前
互联网大厂Java面试实战:微服务、Spring Boot与Kafka在电商场景中的应用
java·spring boot·微服务·面试·kafka·电商
SUDO-12 小时前
Spring Boot + Vue 2 的企业级 SaaS 多租户招聘管理系统
java·spring boot·求职招聘·sass
sheji34162 小时前
【开题答辩全过程】以 基于spring boot的停车管理系统为例,包含答辩的问题和答案
java·spring boot·后端
重生之后端学习2 小时前
21. 合并两个有序链表
java·算法·leetcode·链表·职场和发展
源代码•宸2 小时前
Leetcode—1266. 访问所有点的最小时间【简单】
开发语言·后端·算法·leetcode·职场和发展·golang
南屿欣风2 小时前
Sentinel 熔断规则 - 异常比例(order & product 示例)笔记
java·开发语言
u0104058362 小时前
使用Java实现高性能的异步编程:CompletableFuture与Reactive Streams
java·开发语言
专注VB编程开发20年2 小时前
c#Type数组转成字符串的名称
java·开发语言