zoukankan      html  css  js  c++  java
  • Spring Boot 揭秘与实战 源码分析

    文章目录

    1. 1. EnableAutoConfiguration 帮助我们做了什么
    2. 2. 配置参数类 – FreeMarkerProperties
    3. 3. 自动配置类 – FreeMarkerAutoConfiguration4. 扩展阅读
      1. 3.1. 核心注解
      2. 3.2. 注入 Bean

    结合《Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机》一文,我们再来深入的理解 Spring Boot 的工作原理。

    在《Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机》一文,我们了解到 Spring Boot 提供了很多开箱即用的依赖模块,开发者只要在 Maven 的 pom 文件中添加相关依赖后,Spring Boot 就会针对这个应用自动创建和注入需要的 Spring Bean 到上下文中。

    这篇,我们以 FreeMarker 的自动配置为例,重点讲解工作原理与加载过程。因为 FreeMarker 相对而言比较简单,Spring Boot 源码中只有三个类,所以作为案例相对而言比较好理解。

    EnableAutoConfiguration 帮助我们做了什么

    你还记得 @EnableAutoConfiguration 注解么?

    我们先来回顾下。

    1. @RestController
    2. @EnableAutoConfiguration
    3. @ComponentScan(basePackages = { "com.lianggzone.springboot" })
    4. public class WebMain {
    5. public static void main(String[] args) throws Exception {
    6. SpringApplication.run(WebMain.class, args);
    7. }
    8. }

    那么,现在我们剖析下 @EnableAutoConfiguration 的源码。

    这里,关键在于 @Import 注解导入的 EnableAutoConfigurationImportSelector 类中最为关键的是 getCandidateConfigurations 方法中通过 SpringFactoriesLoader.loadFactoryNames 扫描 spring.factories 文件。

    现在,我们在来看下 SpringFactoriesLoader 源码。

    突然,你是不是发现 spring.factories 文件是相当重要呢?对的,Spring Boot 通过扫描这个文件中的内容,判断有哪些自动配置。以 FreeMarker 为例,我们来看下它是如何配置的。

    所以,Spring Boot 通过扫描 spring.factories 文件中的 EnableAutoConfiguration 参数中有哪些自动配置并进行加载。

    配置参数类 – FreeMarkerProperties

    这里的配置参数,可以通过application.properties 中直接设置。我们发现,它的前缀必须是 spring.freemarker。

    自动配置类 – FreeMarkerAutoConfiguration

    核心注解

    在《Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机》一文,有提到 @ConditionalOnClass 参数中对应的类在 classpath 目录下存在时,才会去解析对应的配置类,否则不解析该注解修饰的配置类。

    Spring Boot 内部提供了很多自动化配置的类,例如,RedisAutoConfiguration 、MongoRepositoriesAutoConfiguration 、ElasticsearchAutoConfiguration , 这些自动化配置的类会判断 classpath 中是否存在自己需要的那个类,如果存在则会自动配置相关的配置,否则就不会自动配置,因此,开发者在 Maven 的 pom 文件中添加相关依赖后,这些依赖就会下载很多 jar 包到 classpath 中,有了这些 lib 就会触发自动化配置,所以,我们就能很便捷地使用对于的模块功能了。

    此外,还有一个主要的注解是 @EnableConfigurationProperties ,主要用来加载我们上面提到的配置参数类。

    注入 Bean

    这个源码非常好理解,我主要想讲2个注解。

    第一注解是,@ConditionalOnMissingBean(name = “freeMarkerViewResolver”),指定当容器没有指定Bean的情况下的处理。

    第二注解是,@ConditionalOnProperty,指定的属性是否有指定的值的处理,换句话说,如果在application.properties 没有配置,默认为 true,即条件符合。

    扩展阅读

    (完)

    微信公众号
  • 相关阅读:
    读书笔记7
    读书笔记5
    读书笔记6
    读书笔记4
    读书笔记2
    读书笔记3
    读书笔记1
    嵌入式linux的调试技术
    硬件抽象层:HAL
    蜂鸣器驱动
  • 原文地址:https://www.cnblogs.com/cnblog-long/p/7248701.html
Copyright © 2011-2022 走看看