SpringBoot:自动化装配功能(@SpringBootApplication注解详解)

SpringBoot:自动化装配功能(@SpringBootApplication注解详解)
一、@SpringBootApplication实际是@SpringBootConfiguration,@EnableAutoConfiguration以及@ComponentScan的组合。

1.1、@SpringBootConfiguration而@Configuration有相同的作用,加上这个注解就是为了让当前类作为一个配置类交由 Spring 的 IOC 容器进行管理。
1.2、@ComponentScan注解完成的是自动扫描的功能,相当于Spring XML配置文件中的<context:component-scan >。如果不设置的话默认扫描@ComponentScan注解所在类的同级类和同级目录下的所有类,所以对于一个Spring Boot项目,一般会把入口类放在顶层目录中,这样就能够保证源码目录下的所有类都能够被扫描到。

1.3、@EnableAutoConfiguration(核心)。

1.3.1、@AutoConfigurationPackage

AutoConfigurationPackage注解的作用是将添加该注解的类所在的package作为自动配置package进行管理。

@AutoConfigurationPackage里面主要的配置@Import({AutoConfigurationPackages.Registrar.class}),跟进Registrar.class。

   static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        Registrar() {
        }

        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (String[])(new PackageImports(metadata)).getPackageNames().toArray(new String[0]));
        }

        public Set<Object> determineImports(AnnotationMetadata metadata) {
            return Collections.singleton(new PackageImports(metadata));
        }
    }

从注释中可以看出,它的功能简单说就是将应用的 package给注册到Spring容器中。

1.3.2、@Import({AutoConfigurationImportSelector.class}),跟进到以下:

    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            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 AutoConfigurationEntry(configurations, exclusions);
        }
    }
  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;
    }
 protected Class<?> getSpringFactoriesLoaderFactoryClass() {
        return EnableAutoConfiguration.class;
    }
@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 {};
}

loadFactoryNames 方法会去 META-INF/spring.factories 文件中根据 EnableAutoConfiguration 的全限定类名获取到我们需要导入的类,而 EnableAutoConfiguration 类的全限定类名为org.springframework.boot.autoconfigure.EnableAutoConfiguration。当我们启动 SpringBoot 项目的时候,SpringBoot 会扫描所有 jar 包下面的 META-INF/spring.factories 文件,并根据 key 值进行读取,最后在经过去重等一些列操作得到了需要自动装配的类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
通过 `@SpringBootApplication` 注解来解释 Spring Boot 的自动装配原理可以更具体和详细地说明。`@SpringBootApplication` 注解是一个组合注解,包含了以下三个核心注解功能: 1. `@Configuration`: 表明该类是一个配置类,用于定义应用程序的配置。 2. `@EnableAutoConfiguration`: 开启自动配置功能,根据项目的依赖自动配置 Spring Bean。 3. `@ComponentScan`: 扫描并加载项目中的组件,如控制器、服务等。 首先,`@Configuration` 注解用于标识一个类是配置类,它可以包含一个或多个 `@Bean` 注解的方法,用于定义应用程序中的 Bean。这些 Bean 可以是自定义的或者是由 Spring Boot 自动配置生成的。 其次,`@EnableAutoConfiguration` 注解是 Spring Boot 自动配置的核心。它通过在类路径上查找并加载 `META-INF/spring.factories` 文件中的自动配置类,来实现自动装配。这些自动配置类使用条件注解来判断是否需要进行自动配置。 最后,`@ComponentScan` 注解用于扫描指定包及其子包下的组件,并将它们注册到 Spring 容器中。这样,Spring Boot 就可以自动发现和装配这些组件,无需手动配置。 综上所述,通过 `@SpringBootApplication` 注解,Spring Boot 可以自动扫描项目中的依赖关系,根据依赖关系自动配置相应的 Bean,并将这些组件注册到 Spring 容器中,从而实现了自动装配功能。这样,开发者只需要关注业务逻辑的实现,而无需手动配置和管理大量的 Spring Bean。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚尘世中迷途小书童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值