阅读 131

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 packageNames;

        PackageImports(AnnotationMetadata metadata) {
            AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));
            List 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 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所在包的路径了。

原文:https://www.cnblogs.com/changxy-codest/p/15039355.html

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐