当前位置: 代码网 > it编程>编程语言>Java > 使用springboot自动配置源码解读

使用springboot自动配置源码解读

2024年11月08日 Java 我要评论
什么是自动装配当我们程序依赖第三方功能组件时,不需要手动将这些组件类加载到ioc容器中。例如 当程序需要用到redis时,在pom.xml文件中引入依赖,然后使用依赖注入的方式直接从ioc容器中拿到相

什么是自动装配

当我们程序依赖第三方功能组件时,不需要手动将这些组件类加载到ioc容器中。

例如 当程序需要用到redis时,在pom.xml文件中引入依赖,然后使用依赖注入的方式直接从ioc容器中拿到相应redistemplate实例。

@springbootapplication 作用

  • @springbootconfiguration:主启动类可以当做配置类使用,比如注入bean等。
  • @componentscan:包扫描注解。
  • @enableautoconfiguration(重要):开启自动配置。

@enableautoconfiguration

  • @autoconfigurationpackage : 自动配置包注解,默认将主配置类(@springbootapplication)所在的包及其子包里面的所有组件扫描到ioc容器中。
  • @import : 引入相应的自动装配类,这里是导入了autoconfigurationimportselector类,从 所有的spring.factories 文件注入自动配置类到ioc容器。
@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@inherited
@autoconfigurationpackage
@import({autoconfigurationimportselector.class})
public @interface enableautoconfiguration {
    string enabled_override_property = "spring.boot.enableautoconfiguration";

    class<?>[] exclude() default {};

    string[] excludename() default {};
}

源码解读

@autoconfigurationpackage

@import 引入 registrar配置类

@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@inherited
@import({registrar.class})
public @interface autoconfigurationpackage {
    string[] basepackages() default {};

    class<?>[] basepackageclasses() default {};
}
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;
	// 获取basepackageclasses属性的属性值,并且对于的包名放入packagenames列表中
    for(int var6 = 0; var6 < var5; ++var6) {
        class<?> basepackageclass = var4[var6];
        packagenames.add(basepackageclass.getpackage().getname());
    }

    if (packagenames.isempty()) {
    // 如果packagenames为空,就将autoconfigurationpackage注解标注的类所在的包名作为packagenames
        packagenames.add(classutils.getpackagename(metadata.getclassname()));
    }

    this.packagenames = collections.unmodifiablelist(packagenames);
}

@import(autoconfigurationimportselector.class)

直接给到最终代码逻辑 getautoconfigurationentry 方法

// 判断是否开启自动配置
if (!this.isenabled(annotationmetadata)) {
    return empty_entry;
} else {
    // 获取注解属性
    annotationattributes attributes = this.getattributes(annotationmetadata);
    // 从 spring.factories 文件中获取自动配置类
    list<string> configurations = this.getcandidateconfigurations(annotationmetadata, attributes);
    // 去掉重复的自动配置类
    configurations = this.removeduplicates(configurations);
    // 根据注解配置 排除自动配置类
    set<string> exclusions = this.getexclusions(annotationmetadata, attributes);
    this.checkexcludedclasses(configurations, exclusions);
    configurations.removeall(exclusions);
    configurations = this.getconfigurationclassfilter().filter(configurations);
    this.fireautoconfigurationimportevents(configurations, exclusions);
    return new autoconfigurationimportselector.autoconfigurationentry(configurations, exclusions);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com