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”,所以,对于以下原始代码:

完全可以优化为:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值