@SpringBootApplication 注解及源码 详解

@SpringBootApplication(scanBasePackages = {"com.XXX"}) 标注 启动类注解。

内含源码注解
@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}
)}
)

前面四个不用说,是定义一个注解所必须的。

关键就在于后面三个注解:

@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。

也就是说我们如果不用 @SpringBootApplication 这个复合注解,而是直接使用最下面这三个注解,也能启动一个 SpringBoot 应用。

@SpringBootConfiguration

内含源码注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration

实际上就是一个 @Configuration 注解。

@Configuration 内含源码注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component

@Configuration注解本质上是一个@Component注解,所以,被@Configuration注解标注的配置类本身也会被注册到IOC容器中。同时,@Configuration注解也会被@ComponentScan注解扫描到。

当某个类被@Configuration注解标注时,说明这个类是配置类,可以在这个类中使用@Bean注解向IOC容器中注入Bean对象,也可以使用@Autowired、@Inject和@Resource等注解来注入所需的Bean对象。

@ComponentScan

内含源码注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)

用于定义 Spring 的扫描路径,等价于在 xml 文件中配置 context:component-scan,假如不配置扫描路径,那么 Spring 就会默认扫描当前类所在的包及其子包中的所有标注了 @Component,@Service,@Controller 等注解的类。

@EnableAutoConfiguration(SpringBoot自动配置的核心)

内含源码注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

由 @AutoConfigurationPackage 和 @Import 注解组成的复合注解

1.@Import 注解其实就是为了去导入一个类AutoConfigurationImportSelector

2.当我们启动 SpringBoot 项目的时候,SpringBoot 会扫描所有 jar 包下面的 META-INF/spring.factories 文件。 Spring 默认就会去读取这些文件中的类并将这些类实例化注册成容器的 Bean。

/**
 * 获取候选自动配置类列表。
 * 首先从 META-INF/spring.factories 文件中加载自动配置类。
 * 然后从 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中加载自动配置类。
 * 最后返回合并后的自动配置类列表。
 */
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;

3.@AutoConfigurationPackage是将添加该注解的类所在的package作为自动配置package进行管理。也就是说当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package。

@AutoConfigurationPackage

内含源码注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})

4.@AutoConfigurationPackage导入了一个 AutoConfigurationPackages 的内部类 Registrar, 而这个类其实作用就是读取到我们在最外层的 @SpringBootApplication 注解中配置的扫描路径(没有配置则默认当前包下),然后把扫描路径下面的类都加到数组中返回

相关推荐

  1. @SpringBootApplication 注解 详解

    2024-07-20 05:42:05       19 阅读
  2. @SpringBootApplication 注解

    2024-07-20 05:42:05       23 阅读
  3. @SpringBootApplication 详解

    2024-07-20 05:42:05       26 阅读
  4. @SpringBootApplication 注解(版本2.7.10)

    2024-07-20 05:42:05       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 05:42:05       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 05:42:05       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 05:42:05       45 阅读
  4. Python语言-面向对象

    2024-07-20 05:42:05       55 阅读

热门阅读

  1. HRCSA作业

    2024-07-20 05:42:05       15 阅读
  2. VB6打印技术-VB6单位缇转毫米,毫米转缇

    2024-07-20 05:42:05       13 阅读
  3. mysql的备份和恢复和日志管理

    2024-07-20 05:42:05       14 阅读
  4. 形状之美:WebKit中CSS形状的实现与创新

    2024-07-20 05:42:05       18 阅读
  5. 掌控视界:WebKit与CSS视口单位的卓越支持

    2024-07-20 05:42:05       16 阅读
  6. 视觉探秘:sklearn中聚类标签的可视化之道

    2024-07-20 05:42:05       17 阅读
  7. DPKG(Debian / Ubuntu包管理工具)的深入探索与使用

    2024-07-20 05:42:05       14 阅读
  8. 机器学习概貌了解

    2024-07-20 05:42:05       17 阅读
  9. HadoopHa自动安装脚本

    2024-07-20 05:42:05       15 阅读