当前位置:   article > 正文

Springboot自动配置原理

springboot自动配置原理

目录

一.Springboot自动配置简介

1.简介

2.使用

二.Springboot自动配置源码分析

1.@SpringBootApplication

2.@SpringBootConfiguration(位于@SpringBootApplication上)

3.@EnableAutoConfiguration(位于@SpringBootApplication上)

4.@ComponentScan(位于@SpringBootApplication上)

5.@AutoConfigurationPackage(位于@EnableAutoConfiguration注解上)

 6.@Import({AutoConfigurationImportSelector.class})(位于@EnableAutoConfiguration注解上)


一.Springboot自动配置简介

1.简介

        SpringBoot的自动配置就是当spring容器启动后,一些自动配置类(只是自动配置类,并不是当前组件配置到IOC容器当中,自动配置类通过@Conditional注解来按需配置)就自动装配的IOC容器中,不需要我们手动去注入,从而简化了开发,省去了繁琐的配置。

2.使用

        根据我们添加的jar包依赖,会自动将一些配置类的bean注册进ioc容器,我们可以需要的地
方使用@Autowired或者@Resource等注解来使用它。

二.Springboot自动配置源码分析

1.@SpringBootApplication

我们从SpringBoot应用启动入口@SpringBootApplication注解标注类中的main()方法开始,点进SpringBootApplication注解如下

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Inherited
  5. @SpringBootConfiguration
  6. @EnableAutoConfiguration
  7. @ComponentScan(
  8. excludeFilters = {@Filter(
  9. type = FilterType.CUSTOM,
  10. classes = {TypeExcludeFilter.class}
  11. ), @Filter(
  12. type = FilterType.CUSTOM,
  13. classes = {AutoConfigurationExcludeFilter.class}
  14. )}
  15. )
  16. public @interface SpringBootApplication {
  17. // 根据class来排除特定的类,使其不能加入spring容器,传入参数value类型是class类型。
  18. @AliasFor(annotation = EnableAutoConfiguration.class)
  19. Class<?>[] exclude() default {};
  20. // 根据classname 来排除特定的类,使其不能加入spring容器,传入参数value类型是class的全类名字符串数组。
  21. @AliasFor(annotation = EnableAutoConfiguration.class)
  22. String[] excludeName() default {};
  23. // 指定扫描包,参数是包名的字符串数组。
  24. @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
  25. String[] scanBasePackages() default {};
  26. // 扫描特定的包,参数类似是Class类型数组。
  27. @AliasFor(annotation = ComponentScan.class, attribute ="basePackageClasses")
  28. Class<?>[] scanBasePackageClasses() default {};
  29. }

2.@SpringBootConfiguration(位于@SpringBootApplication上)

标注了SpringBootConfiguration注解的类表明这是springboot的一个配置类,点进此注解源码如下,说明主程序类也是一个配置类。

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Configuration
  5. public @interface SpringBootConfiguration {
  6. @AliasFor(
  7. annotation = Configuration.class
  8. )
  9. boolean proxyBeanMethods() default true;
  10. }

3.@EnableAutoConfiguration(位于@SpringBootApplication上)

EnableAutoConfiguration中注解作用如下注释,

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Inherited
  5. // 自动配置包
  6. @AutoConfigurationPackage
  7. // Spring的底层注解@Import,给容器中导入一个组件;
  8. // 导入的组件是AutoConfigurationPackages.Registrar.class
  9. @Import({AutoConfigurationImportSelector.class})
  10. // 告诉SpringBoot开启自动配置功能,这样自动配置才能生效。
  11. public @interface EnableAutoConfiguration {
  12. String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
  13. // 返回不会被导入到 Spring 容器中的类
  14. Class<?>[] exclude() default {};
  15. // 返回不会被导入到 Spring 容器中的类名
  16. String[] excludeName() default {};
  17. }

4.@ComponentScan(位于@SpringBootApplication上)

指定扫描哪些组件,默认是扫描主程序所在的包以及其子包。

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.TYPE})
  3. @Documented
  4. @Repeatable(ComponentScans.class)
  5. public @interface ComponentScan {
  6. ...
  7. }

5.@AutoConfigurationPackage(位于@EnableAutoConfiguration注解上)

自动配置包(将指定的一个包下的所有组件导入到容器当中)

@AutoConfigurationPackage 注解中存在一个 @Import({Registrar.class}) 注解,自动配置包就是通过这个 Registrar 类的方法来完成的。

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Inherited
  5. @Import({Registrar.class})
  6. public @interface AutoConfigurationPackage {
  7. }

 6.@Import({AutoConfigurationImportSelector.class})(位于@EnableAutoConfiguration注解上)

将 spring-boot-autoconfigure-x.x.x.jar包中 META-INF/spring.factories文件中的内容加到IOC容器

spring.factories中一共有 133个自动配置类。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/165683
推荐阅读
相关标签
  

闽ICP备14008679号