1.原理初探
1.1.依赖(pom.xml)
1.1.1.spring-boot-dependencies
①.核心依赖,它是spring-boot-starter-parent父项目的父项目!
②.在该依赖中声明了后期可能要在springboot项目中使用的组件的版本号,所以后期引入这些组件依赖的时候就不需要再指定对应的版本号了!
1.1.2.启动器Starter
①.即SpringBoot的启动场景,可以帮我们自动导入使用某个组件所需要的依赖;
-
spring-boot-starter:spring-boot场景启动器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
-
例如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖;
②.SpringBoot的核心就是SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter启动器,那么相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器;
1.2.主程序类/启动类/主配置类
@SpringBootApplication //该注解标注这个类是一个springboot应用
public class SpringbootApp {
public static void main(String[] args) {
//将springboot应用启动,通过反射机制加载当前类的对象
SpringApplication.run(SpringbootApp.class);
}
}
1.2.1.@SpringBootApplication注解
①.说明
SpringBoot应用中标注在某个类上说明这个类是SpringBoot的主配置类/启动类,SpringBoot就可以运行这个类的main方法来启动SpringBoot应用;
②.代码实现
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration //SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类;
@EnableAutoConfiguration //开启自动配置功能;当我们需要配置的属性,SpringBoot会帮我们自动配置;@EnableAutoConfiguration注解告诉SpringBoot开启自动配置功能,这样自动配置才能生效;
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) //扫描当前主启动类同级的包下面的组件
public @interface SpringBootApplication {
//省略...
}
③.@SpringBootConfiguration注解
-
@SpringBootConfiguration注解代码实现
@Target({ ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration //配置类上来标注这个注解 public @interface SpringBootConfiguration { }
-
@Configuration注解代码实现
@Target({ ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component //配置类--配置文件;配置类也是容器中的一个组件; public @interface Configuration { @AliasFor( annotation = Component.class ) String value() default ""; }
④.@EnableAutoConfiguration注解
-
@EnableAutoConfiguration注解代码实现
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage //自动配置包 @Import(AutoConfigurationImportSelector.class) //给容器中导入组件,AutoConfigurationImportSelector是导入组件的选择器;将所有需要导入的组件以全类名的方式返回,之后这些组件就会被添加到容器中;最终会给容器中导入非常多的自动配置类(xxxAutoConfiguration),也就是给容器中导入这个场景需要的所有组件,并配置好这些组件; public @interface EnableAutoConfiguration { //省略... }
-
@AutoConfigurationPackage注解注解代码实现
@Import(AutoConfigurationPackages.Registrar.class) //Spring的底层注解@Import,给容器中导入一个组件,导入的组件有AutoConfigurationPackages.Registrar.class,将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件注册到Spring容器中; public @interface AutoConfigurationPackage { //省略... }
-
AutoConfigurationImportSelector#selectImports()
@Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); }
protected AutoConfigurationEnt