分析上文Spring Boot快速入门


@SpringBootApplication
public class HelloWorldApplication {

    public static void main(String[] args) {
        //Spring应用启动起来
        SpringApplication.run(HelloWorldApplication.class,args);
    }
}

@SpringBootConfiguration:Spring Boot的配置类,我们点击进去查看

spring boot 启动 注解扫描 springboot怎么扫描注解_右键

我们看到28行的注解

@EnableAutoConfiguration:开启自动配置的功能

以前我们使用三大框架时,很多东西需要自己在xml中配置,但现在Spring Boot帮我们自动配置-》就是该注解实现的

我们ctrl+右键点击该注解查看

spring boot 启动 注解扫描 springboot怎么扫描注解_右键_02


@Import({AutoConfigurationImportSelector.class})

@Import:Spring的底层注解,向容器中导入一个组件

@AutoConfigurationPackage:添加该注解的类所在的package 作为 自动配置package 进行管理

点击@AutoConfigurationPackage注解进去查看源码

spring boot 启动 注解扫描 springboot怎么扫描注解_右键_03


点击21行的Registrar.class

spring boot 启动 注解扫描 springboot怎么扫描注解_spring boot 启动 注解扫描_04

在该处打上断点,在debug模式下进行源码追踪

选中(String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0])-》右键-》Evaluate expression-》Evaluate

spring boot 启动 注解扫描 springboot怎么扫描注解_右键_05


我们发现将@SpringBootApplication标注的类的所在包及其下面所有的子包的所有组件扫描到了Spring容器中所以我们必须将Controller、service、dao等放到主配置类所在包的子包中

spring boot 启动 注解扫描 springboot怎么扫描注解_spring_06


@Import({AutoConfigurationImportSelector.class})

AutoConfigurationImportSelector.:导入哪些组件的选择器,将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;

spring boot 启动 注解扫描 springboot怎么扫描注解_spring_07


断点追踪

spring boot 启动 注解扫描 springboot怎么扫描注解_查看源码_08

spring boot 启动 注解扫描 springboot怎么扫描注解_查看源码_09


有了上面的自动配置类,我们就不需要再手动编写;那么自动配置类是从哪里扫描到这些自动配置类呢

spring boot 启动 注解扫描 springboot怎么扫描注解_查看源码_10


SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader())我们点击loadFactoryNames查看进一步查看源码实现方式

spring boot 启动 注解扫描 springboot怎么扫描注解_spring boot 启动 注解扫描_11


springboot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就开始生效,帮我们进行配置工作

打开我们导入的包

spring boot 启动 注解扫描 springboot怎么扫描注解_右键_12


spring boot 启动 注解扫描 springboot怎么扫描注解_右键_13


查看web自动配置类点击查看源码

spring boot 启动 注解扫描 springboot怎么扫描注解_spring_14


spring boot 启动 注解扫描 springboot怎么扫描注解_spring_15


我们能够看到我们在SpringMVC中配置的很多功能,比如视图解析器(如上图所示)


J2EE的整体解决方案和自动配置都在spring-boot-autoconfigure-2.3.6.RELEASE.jar中

(比如我们熟悉的aop:事务,cache:缓存,dao:持久层 等等

spring boot 启动 注解扫描 springboot怎么扫描注解_右键_16

这就是约定大于配置