zoukankan      html  css  js  c++  java
  • 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所在包的路径了。

  • 相关阅读:
    安卓iOS软件免编程开发步骤
    我的站被收录了两次,被封掉两次,怎么办?
    百度算法调整 优化网站该从哪几方面着手?
    如何成为php编程高手
    百度等搜索引擎寻找各种数据库网站的方法
    【网站抓取】如何正确识别Baiduspider移动ua
    EditPlus 技巧大全:[1]怎么配置PHP编译环境
    如何本地搭建php环境用来测试PHP程序教程!
    用最简洁的代码构建MVC分层
    BMR计算器2——python第三课(字符串分割,格式化输出,异常处理)
  • 原文地址:https://www.cnblogs.com/changxy-codest/p/15039355.html
Copyright © 2011-2022 走看看