欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: 晴枫

1 SpringBoot运作道理

上一章中我们提到主措施类的注解 @SpringBootApplication 注解,它其实是个组合注解,源码如下:

@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 {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};
}

最主要的照旧三个设置 @SpringBootConfiguration、@EnableAutoConfigration、@ComponentScan 三个注解,下面我们来一一阐明。

1.1 @SpringBootConfiguration

查察@SpringBootConfiguration源码,其实它也就是@Configuration注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

对付 @Configuration,我们并不生疏,它就是 JavaConfig 形式的 SpringIOC 容器的设置类,也是 SpringBoot 推荐利用设置形式,所以主措施类标注了 @SpringBootConfiguration 注解,其自己也就是一个设置类。更多有关 JavaConfig 形式的设置以及有关它和 XML 形式的设置的区别与接洽,请参考后续有关 Spring 注解版相关文章。

1.2 @ComponentScan

@ComponentScan 注解在 Spring 的注解中也起到到相当重要的浸染,它可以自界说 Spring 扫描的包,也就是它默认会扫描标注了 @Controller、@Service、@Component 以及 @Repository 注解的类,并实例化这些组件到 SpringIOC 容器中,它有个设置属性: basePackages,也就是指定扫描的包,假如不知道,它会默认扫描设置了该注解的类的包地址的路径(包罗子包)。我们看 @SpringBootConfiguration 注解的源码中有段代码:

@AliasFor(
  annotation = ComponentScan.class,
  attribute = "basePackages"
)
String[] scanBasePackages() default {};

scanBasePackages 属性,指定到了 @ComponentScan 注解的 basePackages 属性,所有在 SpringBoot 中,我们同样可以通过 scanBasePackages 属性指定包扫描的路径(如部指定,会默认扫描主措施类地址的包路径以及子包下的类):

@SpringBootApplication(scanBasePackages = "com.seagetech.springbootdemo")

1.3 @EnableAutoConfigration

关于 SpringBoot 的运作道理,它的焦点成果照旧由 @EnableAutoConfigration 注解提供,所有把它放到最厥后讲,我们来看下它的源码:

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

1.3.1 @AutoConfigurationPackage

这个注解的主要成果自动设置包,它会获取主措施类地址的包路径,并将包路径(包罗子包)下的所有组件注册到 SpringIOC 容器中。

1.3.2 @Import({AutoConfigurationImportSelector.class})

@EnableAutoConfiguration 的要害成果也是这个 @Import 导入的设置成果,利用 SpringFactoriesLoader.loadFactoryNames 要领来扫描具有 META-INF/spring.factories 文件的jar包,我们看看在 spring-boot-autoconfigure-2.10.RELEASE.jar 包的 META-INF 下正好有个 spring.factories 文件:

 classes = {Type  <a href=劳务调派打点系统 ExcludeFilter.class} )" class="aligncenter size-full wp-image-30600" title="springboot-2-1" src="/uploads/allimg/c181122/1542S0Sc9350-130Q.png" />

打开 spring.factories 文件,找到 org.springframework.boot.autoconfigure.EnableAutoConfiguration 指定的自动设置类:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

......
......

org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\

每一个 xxxAutoConfiguration 类都是容器中的一个组件,都插手到容器中,用它们来做自动设置。

2 自动设置阐明