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

相关推荐
撩得Android一次心动1 分钟前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
组合缺一5 分钟前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
MSTcheng.10 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
一 乐13 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
KIKIiiiiiiii14 分钟前
微信个人号API二次开发中的解决经验
java·人工智能·python·微信
80530单词突击赢15 分钟前
SpringBoot整合SpringMVC全解析
java·spring boot·后端
vx1_Biye_Design25 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design26 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
hdsoft_huge31 分钟前
1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
vue.js·spring boot·后端
hay_lee1 小时前
Spring AI实现对话聊天-流式输出
java·人工智能·ollama·spring ai