玩转 Spring Boot 原理篇(自动装配源码剖析)

Posted 一猿小讲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转 Spring Boot 原理篇(自动装配源码剖析)相关的知识,希望对你有一定的参考价值。

* Return the AutoConfigurationEntry based on the AnnotationMetadata* of the importing Configuration * annotationMetadata the annotation metadata of the configuration class* the auto-configurations that should be imported*/AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) (!isEnabled(annotationMetadata)) EMPTY_ENTRY; AnnotationAttributes attributes = getAttributes(annotationMetadata); configurations = removeDuplicates(configurations); Set<String> exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = getConfigurationClassFilter().filter(configurations); fireAutoConfigurationImportEvents(configurations, exclusions); AutoConfigurationEntry(configurations, exclusions);

能够发现getCandidateConfigurations 方法中会通过 SpringFactoriesLoader 类来加载类路径中的 META-INF 目录下的 spring.factories 文件中针对 EnableAutoConfiguration 的注册配置类。

为了调试方便,在源码中的 process 方法上里加入了打印输出。


运行后,此时控制台输出如下。

  • AutoConfigurationImportSelector.AutoConfigurationGroup.process() , entries = org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.aop.AopAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.cache.CacheAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration=smoketest.simple.SampleSimpleApplicationorg.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration=smoketest.simple.SampleSimpleApplication

    2. 例行回顾

    本文采取 Debug 的方式跟了一下 Spring Boot 自动装配的源码,旨在感受一下自动装配的实现方式,其实这种自动装配的思想,在开发轮子时或许能够借鉴一下,会对轮子的扩展带来质的改变。


    为了方便记忆,把 Spring Boot 自动装配繁琐的流程抽象一下。


    另外 Spring Boot 自动装配源码 Debug 主线,感兴趣可以自行跟一下源码。

    一起聊技术、谈业务、喷架构,少走弯路,不踩大坑,会持续输出更多精彩分享,欢迎关注,敬请期待!

    参考资料:

    https://spring.io/

    https://start.spring.io/

    https://spring.io/projects/spring-boot

    https://github.com/spring-projects/spring-boot

    https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

    https://stackoverflow.com/questions/tagged/spring-boot

    《Spring Boot实战》《深入浅出Spring Boot 2.x》

    《一步一步学Spring Boot:微服务项目实战(第二版)》

    《Spring Boot揭秘:快速构建微服务体系》

    玩转 Spring Boot 原理篇(自动装配前凑之自定义Stater)

    的 pom 文件中可以看出,mybatis-spring-boot-starter 包会自动引入 mybatis-spring-boot-autoconfigure 以及 mybatis 相关依赖包。

    SqlSessionFactory Exception logger.debug( encoding= xmlns:xsi= xsi:schemaLocation= <modelVersion> <groupId>org.example</groupId> <artifactId>game-spring-boot-starter</artifactId> <version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version> </parent> <properties> <maven.compiler.source> <maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>* 猜数游戏Service**/ String number) gen = ( gen == number ? gen + : + gen + * 配置类**/ @ public GameService gameService() @ private GameService gameService; @ public String say(@RequestParam(name = com.example.demo_jpa;org.springframework.boot.SpringApplication;org.springframework.boot.autoconfigure.SpringBootApplication; SpringApplication.run(GameApplication.class, args);


    4. 玩一玩


    运行GameApplication,浏览器访问 http://localhost:8080/guess?number=300,效果如下


    至此,自定义 Spring Boot 启动依赖就完成了,其主要是 GameAutoConfiguration 配置类的立下的功劳。

    5. 例行回顾

    本文主要是一起探讨如何完成 Spring Boot 自定义 Starter,从代码层面先感受一下 Spring Boot 自动装配的能力。


    Spring Boot 如何实现自动装配的呢?通过本次自定义 Stater,脑海中有一些大胆的猜测,猜测跟 XxxAutoConfiguration 以及 spring.factories 文件有点关系,也大胆的构思的一张图,留了一些空白,相信通过后续的源码解读,会把空白填上。

    另外,本篇是 Spring Boot 自动装配的前凑篇,至于是如何实现的呢?下次将顺着主线往下捋,感兴趣的可以顺着我画的这个流程图先自己体会体会自动装配的思想。

    一起聊技术、谈业务、喷架构,少走弯路,不踩大坑,会持续输出更多精彩分享,欢迎关注,敬请期待!

    以上是关于玩转 Spring Boot 原理篇(自动装配源码剖析)的主要内容,如果未能解决你的问题,请参考以下文章

    玩转 Spring Boot 原理篇(源码环境搭建)

    从源码中理解Spring Boot自动装配原理

    玩转 Spring Boot 原理篇(内嵌Tomcat实现原理&优雅停机源码剖析)

    Eureka 系列(03)Spring Cloud 自动装配原理

    spring boot自动装配原理

    spring boot自动装配原理@EnableAutoConfiguration