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