SpringBoot获取启动类Application所在包路径
1、 @SpringBootApplication 注解中引用了@EnableAutoConfiguration 注解。
2、查看 @EnableAutoConfiguration 注解,发现引用了 @AutoConfigurationPackage 注解。
3、查看 @AutoConfigurationPackage 注解,引入了 Registrar.class 类,代码如下:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({Registrar.class}) public @interface AutoConfigurationPackage { String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; }
4、查看Registrar 类,发现Spring是通过 AutoConfigurationPackages.PackageImports 来封装需要扫描的包路径,继续查看这个类的源码,代码如下:
private static final class PackageImports { private final List<String> packageNames; PackageImports(AnnotationMetadata metadata) { AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false)); List<String> packageNames = new ArrayList(Arrays.asList(attributes.getStringArray("basePackages"))); Class[] var4 = attributes.getClassArray("basePackageClasses"); int var5 = var4.length; for(int var6 = 0; var6 < var5; ++var6) { Class<?> basePackageClass = var4[var6]; packageNames.add(basePackageClass.getPackage().getName()); } if (packageNames.isEmpty()) { packageNames.add(ClassUtils.getPackageName(metadata.getClassName())); } this.packageNames = Collections.unmodifiableList(packageNames); } List<String> getPackageNames() { return this.packageNames; } public boolean equals(Object obj) { return obj != null && this.getClass() == obj.getClass() ? this.packageNames.equals(((AutoConfigurationPackages.PackageImports)obj).packageNames) : false; } public int hashCode() { return this.packageNames.hashCode(); } public String toString() { return "Package Imports " + this.packageNames; } }
5、通过阅读上面的源码可以发现,如果我们没有指定SpringBoot需要扫描的包路径,默认通过 ClassUtils.getPackageName(metadata.getClassName()) 来获取启动类所在的包路径,所以我们也可以通过Spring提供好的方法来获取启动类Application所在包的路径了。
分类:
springboot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~