什么是自动装配
当我们程序依赖第三方功能组件时,不需要手动将这些组件类加载到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);
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论