• springboot自动配置原理


    一、@SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,该注解开启自动配置。

    1、@SpringBootApplication组合注解

    二、@EnableAutoConfiguration注解也是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。
    spring-boot-autoconfigure-x.x.x.x.jar里就有一个spring.factories文件。spring.factories文件由一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,
    这些类名以逗号分隔。

    1、spring-boot-autoconfigure-x.x.x.x.jar -> META-INF/spring.factories -> org.springframework.boot.autoconfigure.xxx.xxxAutoConfiguration 类列表将会被实例化到Spring容器。

    三、springboot项目启动时,@SpringBootApplication用在启动类在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

    四、以redis自动配置,解析spring自动配置原理

    1、将redis starter依赖加入

    <!--redis jar-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    2、org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration会被实例化到容器。该类为什么会被实例化? 因为它在META-INF/spring.factories的Auto Configure列表。

    3、org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration被实例化,然而redis也会被实例化即创建RedisTemplate在Spring容器。

    然而实例化redis对象是有条件的即@ConditionalOnClass({RedisOperations.class}),意思:当给定的类名在类路径上存在,则实例化当前Bean。

    也就是想Spring创建redis实例对象,必须需要将redis starter包:spring-boot-starter-data-redis依赖引入。有了redis starter依赖springboot自动配置就会检测到classpath路径下有相关的类,然后就可以实例化对应的类了,这就是自动配置的原理。

    知识点:类上有该注解@Configuration,类被实例化 时@bean会自动执行,生成对应的bean实例,放入Spring容器。

    4、org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration会导入JedisConnectionConfiguration.class

    @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})

    JedisConnectionConfiguration.class有注解:@ConditionalOnClass({GenericObjectPool.class, JedisConnection.class, Jedis.class}) 

    5、spring是怎样读取redis配置参数?

    a.关键是org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration的注解:@EnableConfigurationProperties({RedisProperties.class})

    知识点:@EnableConfigurationProperties会将配置文件的key-value映射成Java对象。

    b.redis配置类,如果没redis配置,使用本地的redis这需要本地安装redis服务,如果有redis配置就设置redis host、port等属性

     c.appliccation.yml redis配置。必须以spring.redis开头

  • 相关阅读:
    ★一名“标题党”自我修炼的10大技巧
    字符编码笔记:ASCII,Unicode和UTF-8
    字符编码笔记:ASCII,Unicode和UTF-8
    字符编码笔记:ASCII,Unicode和UTF-8
    ★漫画:优秀的程序员具备哪些属性?
    ★漫画:优秀的程序员具备哪些属性?
    Linux 标准目录结构
    hadoop多次格式化后,导致datanode启动不了
    Linux天天见
    我的ipad应用备份
  • 原文地址:https://www.cnblogs.com/chenweichu/p/12663798.html
Copyright © 2020-2023  润新知