SpringBoot如何实现自动装配?

1 SpringBoot是如何自动装配的,怎么启动内置的Tomcat去运行的。

1.1 SpringBootApplication注解与组成

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

上面的代码调用SpringApplication的静态run方法,使用默认配置运行一个SpringApplication实例,并且返回一个运行的Spring上下文。其中,默认配置是通过@SpringBootApplication注解加载的,也就是说SpringBoot的自动装配是通过该注解来完成的。

@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 {

@SpringBootApplication是组合注解,用于快捷配置启动类。注解上有7个注解,其中前4个是元注解,用于修饰当前注解,无实际功能。还有三个重要的注解。

  • @ComponentScan:告诉Spring自动扫描包中使用@Service,@Component,@Repository,@Controller的类,并注册为bean。

  • @SpringBootConfiguration:由@Configuration标识,声明当前类是一个配置类,相当于Spring配置的xml文件。

  • @EnableAutoConfiguration:作用是开启自动装配,让Spring Boot会根据类路径中的jar包依赖为当前项目进行自动设置。例如添加了Spring-boot-starter-web依赖,则会自动添加Tomcat和SpringMVC依赖,启动时自动配置两者。

SpringBoot只会扫描@SpringBootApplication注解所在类的同级包及子包。

1.2 @EnableAutoConfiguration自动装配

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration

@EnableAutoConfiguration会导入AutoConfigurationImportSelector选择器的默认配置

// AutoConfigurationImportSelector
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
   }
   // 核心加载语句
   AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
   return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    }
    AnnotationAttributes attributes = getAttributes(annotationMetadata);
    List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
    ....
}

// 返回自动配置的类名
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                                                                         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;
}

通过代码追踪,我们可以了解到@EnableAutoConfiguration注解主要是加载了ETA-INF/spring.factories里面的自动配置类,在spring.factories中我们可以找到Tomcat、SpringMVC相关的类。

// 内置servlet/Reactive服务器的相关配置
// 如果使用到Tomcat,则会加载内联Tomcat配置(Jetty/Netty同理)
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
// 内部会加载Tomcat
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值