springboot启动类:
@springbootapplication
public class myspringbootapplication {
public static void main(string[] args) {
springapplication.run(myspringbootapplication.class, args);
}
}springboot的启动类上使用@springbootapplication注解标识,该注解试一个组合注解,包含多个其他注解。
@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@inherited
@springbootconfiguration
@enableautoconfiguration //开启自动配置功能
@componentscan(
excludefilters = {@filter(
type = filtertype.custom,
classes = {typeexcludefilter.class}
), @filter(
type = filtertype.custom,
classes = {autoconfigurationexcludefilter.class}
)}
)
public @interface springbootapplication {
@aliasfor(annotation = enableautoconfiguration.class )
class<?>[] exclude() default {}; //排除哪些自动配置类
@aliasfor(annotation = enableautoconfiguration.class )
string[] excludename() default {};
@aliasfor(annotation = componentscan.class, attribute = "basepackages" )
string[] scanbasepackages() default {};
@aliasfor(annotation = componentscan.class,attribute = "basepackageclasses")
class<?>[] scanbasepackageclasses() default {};
}@springbootapplication注解上标有三个注解@springbootconfiguration 、@enableautoconfiguration 、@componentscan。
@componentscan是spring中的注解,用来与配置类上,定义要扫描的组件。 其他两个注解则是springboot自定义的注解。
下面就来看看这两个注解的作用。
@springbootconfiguration
@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@configuration
public @interface springbootconfiguration {
}@springbootconfiguration注解中没有定义任何属性信息,而该注解上有一个注解@configuration,用于标识配置类。
所以@springbootconfiguration注解的功能和@configuration注解的功能相同,用于标识配置类。
@enableautoconfiguration
@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 {};
}@enableautoconfiguration注解上标注了两个注解,@autoconfigurationpackage、@import。
@import注解在springioc一些注解的源码中比较常见,主要用来给容器导入目标bean。
这里@import注解给容器导入的组件用于自动配置:
autoconfigurationimportselector ; 而@autoconfigurationpackage注解试spring自定义的注解,用于扫描启动类所在的包及其子包下的自定义类。
@autoconfigurationpackage
@target({elementtype.type})
@retention(retentionpolicy.runtime)
@documented
@inherited
@import({registrar.class})
public @interface autoconfigurationpackage {
}@autoconfigurationpackage注解上的@import注解,给容器导入了registrar组件
registrar:
static class registrar implements importbeandefinitionregistrar, determinableimports {
registrar() {
}
//拿到注解的全信息,注解所造包及其子包下的组件
public void registerbeandefinitions(annotationmetadata metadata, beandefinitionregistry registry) {
autoconfigurationpackages.register(registry, (new autoconfigurationpackages.packageimport(metadata)).getpackagename());
}
public set<object> determineimports(annotationmetadata metadata) {
return collections.singleton(new autoconfigurationpackages.packageimport(metadata));
}
}registrar是抽象类autoconfigurationpackages的内部静态类,registrar内的方法registerbeandefinitions负责将获取到的注解所在的包及其子包下的所有组件注册进容器。
这也是为什么springboot的启动类要在其他类的父包或在同一个包中。
autoconfigurationimportselector
public class autoconfigurationimportselector
implements deferredimportselector, beanclassloaderaware, resourceloaderaware,
beanfactoryaware, environmentaware, ordered {
.........
}autoconfigurationimportselector 类实现类很多aware接口,而aware接口的功能是使用一些spring内置的实例获取一些想要的信息,如容器信息、环境信息、容器中注册的bean信息等。
而autoconfigurationimportselector 类的作用是将spring中已经定义好的自动配置类注入容器中(但是的时候不发挥配置类的作用),而实现该功能的方法是selectimports方法:
selectimports:注册spring中定义好的配置类
public string[] selectimports(annotationmetadata annotationmetadata) {
if (!this.isenabled(annotationmetadata)) {
return no_imports;
} else {
autoconfigurationmetadata autoconfigurationmetadata = autoconfigurationmetadataloader.loadmetadata(this.beanclassloader);
autoconfigurationimportselector.autoconfigurationentry autoconfigurationentry = this.getautoconfigurationentry(autoconfigurationmetadata, annotationmetadata);
return stringutils.tostringarray(autoconfigurationentry.getconfigurations());
}
}导入的配置类:

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