zoukankan      html  css  js  c++  java
  • Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

      该篇为Sping Boot入门到实战系列入门篇的第四篇。介绍Spring Boot自动化配置的基本原理与实现。
     
      Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性。开发者需要使用某项功能,只需要引入对应的starter依赖包(Spring Boot官方提供了大量starter包),Spring Boot就能自动帮你准备好使用该项功能的条件。比如需要访问Redis, 只需要pom.xml中引入spring-boot-starter-redis依赖,Spring Boot将自动为你创建RedisTemplate 等bean,并默认以localhost作为redis连接地址。
     
      理解Spring Boot自动化配置实现原理,需要了解如下几个方面:
    1. @EnableAutoConfiguration注解
    2. SpringApplication类
    3. spring-boot-autoconfigure jar包
    4. spring.factories文件
     
      1. @EnableAutoConfiguration注解
      这个注解的作用是告诉Spring Boot基于添加的jar依赖来自动配置Spring,比如如果添加了spring-boot-starter-web依赖,则Spring Boot认为你在开发一个web应用,就会自动做好web相应配置。这个注解一般放在主类上。在前面的示例项目中, 我们在主类上都是使用@SpringBootApplication, 查看源码可以知道: @SpringBootApplication 这个注解实际上等效于 @SpringBootConfiguration(等效于@Configuration), @EnableAutoConfiguration, @ComponentScan 三者的组合。如果去掉@EnableAutoConfiguration注解,则Spring Boot将不会自动配置Spring(如实例化必要的Bean),将可能导致应用启动失败。
     
      2. SpringApplication类
      在应用主类中,我们是通过SpringApplication的run方法来启动应用的,如:
     
    @SpringBootApplication
    public class MyFirstSpringbootApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyFirstSpringbootApplication.class, args);
        }
    }
    

      查看源码,SpringApplication的静态run方法,实际也是通过创建SpringApplication实例,调用实例方法执行,在SpringApplication构造器方法中,调用了getSpringFactoriesInstances 方法, 如下图

    追溯下去,最终会调用到SpringFactoriesLoader的loadSpringFactories方法,如下图

      在该方法中,会从所有的META-INF目录下加载spring.factories文件里配置的所有工厂类名称(包括初始化器,监听器,自动配置类等)。然后上层方法中通过反射机制实例化这些工厂类,从而完成相应Bean的自动化配置与注入。

     
      3. spring-boot-autoconfigure jar包
      官方提供的starter,如spring-boot-starter-web, 都依赖了spring-boot-starter, 而spring-boot-starter又依赖了spring-boot-autoconfigure。 在spring-boot-autoconfigure中提供了大量官方提供的自动配置类,并且包含META-INFO/spring.factories文件,如下图

    spring.factories文件内容如下图所示

    红色框所标识部分的就是Spring Boot提供的大量自动配置类。

     
      Spring Boot通过这种自动化配置机制,以starter依赖包的方式,使开发者非常方便地使用项目开发中的许多常用功能,如数据库访问、缓存、队列等。同时,用户也可以根据自身需求,自定义自己的starter(这部分将在实战篇介绍)。
     
      Spring Boot自动化配置包含了许多条件类注解及顺序类注解,这些注解可方便地让自动化配置按照某种条件或者顺序进行配置。
      其中条件类注解包括:
    • 类级别条件注解
      • @ConditionalOnClass: 类路径中存在指定的类才进行该配置 
      • @ConditionalOnMissingClass: 类路径中不存在指定的类才进行该配置 
    • 实例级别条件注解
      • @ConditionalOnBean:只有在当前上下文中存在指定Bean时,才进行该配置
      • @ConditionalOnMissingBean: 只有在当前上下文不存在指定Bean时,才进行该配置
    • 属性级别条件注解
      • @ConditionalOnProperty:当存在某个指定属性,且值为指定值时,才进行该配置
    • 资源级别条件注解
      • @ConditionalOnResource:在类路径下存在指定的Resource时,才进行配置
    • Web应用条件注解
      • @ConditionalOnWebApplication:该应用为Web应用时进行该配置
      • @ConditionalOnNotWebApplication: 该应用不为Web应用时进行该配置
    • SpEL( Spring Expression Language)表达式注解
      • @ConditionalOnExpression: 计算SpEL表达式值,值为true时才进行该配置
     
      顺序类注解包括:
    • @AutoConfigureAfter: 在指定的配置类初始化后再加载
    • @AutoConfigureBefore: 在指定的配置类初始化前加载
    • @AutoConfigureOrder: 数值越小越先初始化
     
      注意:自动配置类不应该位于组件扫描路径(@ComponentScan注解指定的扫描路径)下,否则上述条件注解与顺序注解可能不会生效。建议只在自动配置的类上注解@ConditionalOnBean and @ConditionalOnMissingBean,因为这可以保证在用户定义bean已经添加到ApplicationContext之后才会加载。这两个注解放在class上,则相当于class里面每一个@Bean标注的方法都加上了。
     
     
     
     
     
     
  • 相关阅读:
    python实现RSA加密解密方法
    信息安全-2:python之hill密码算法[原创]
    信息安全-4:公钥密码体制之背包算法[原创]
    python之import子目录文件
    python之路径导入
    python之局部变量引用赋值前的结果
    python之socket-ssh实例
    python之面向对象与构造函数
    git搜索--grep
    git日志--log
  • 原文地址:https://www.cnblogs.com/spec-dog/p/8507921.html
Copyright © 2011-2022 走看看