设为首页 加入收藏

TOP

@EnableAutoConfiguration自动配置原理分析(二)
2019-09-01 23:16:19 】 浏览:20
Tags:@EnableAutoConfiguration 自动 配置 原理 分析
return result; } catch (IOException ex) { throw new IllegalArgumentException("Unable to load factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex); } }

最后返回的result实际上就是META-INF/spring.factories对应的Map数据结构。在这个Map中实际上保存了整个Spring中的各个配置类的全类名,包括一些Listener、Filter等等。加载一个类的第一步,就是要获取到对应类的全类名,而之后具体的加载过程实际上是由SpringApplication具体完成的,这里不做先仔细介绍,我们回到我们的重点上,如何自动加载配置。在刚刚的spring.factories中,我们来看下边的内容:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
...

在这里我们可以看到非常多熟悉的名称,Aop,Rabbit等等非常多,看来自动加载的配置远远不止我们使用到的简单配置,SpringBoot会加载全部可能用到的配置类。这里我们先来打开一个熟悉的RabbitAutoConfiguration看一看。

@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {

这个类上边添加了很多注解,我们一个个来看。

  1. @Configuration: 这个注解我们非常熟悉,标明这就是一个配置类;
  2. @ConditionalOnClass():这个注解是可以输入几个class,相当于给这个配置类添加了一个开关,当检测存在输入的类时候,该配置类生效,否则将不被实例化。也就是说,如果你的项目存在对应的依赖,将自动开启配置类,这个是非常实用的一个注解。
  3. @EnableConfigurationProperties(): 启用一个@ConfigurationProperties注解
  4. @Import(RabbitAnnotationDrivenConfiguration.class): 导入了一个基于注解的配置类

在上边的注解中你可能很疑惑@ConfigurationProperties的作用,这里我们看看与之对应的RabbitProperties的具体实现。

@ConfigurationProperties(prefix = "spring.rabbitmq")
public class RabbitProperties {

    /**
     * RabbitMQ host.
     */
    private String host = "localhost";

    /**
     * RabbitMQ port.
     */
    private int port = 5672;

    /**
     * Login user to authenticate to the broker.
     */
    private String username = "guest";
    ...

整体上看,RabbitProperies整体上大概就是一个POJO的类,其中包含了RabbitMQ的各项参数,其中有一些已经设置了初始值,但是直接在类中配置初始值的方式很难让我们自定义修改这些配置参数,所以在这个类上使用了@ConfigurationProperties()注解。

@ConfigurationProperties(perfix = "spring.rabbitmq")作用是从spring的配置中加载指定前缀的配置,并自动设置到对应的成员变量上。也正是通过这种方式,真正实现了配置的自动注入。

小结

到这里,我们实际上已经从@EnableAutoConfiguration这个注解入手,分析了整个自动配置的流程。简单再复述下上边的流程:

@EnableAutoConfiguration->AutoConfigurationImportSelector->spring.factories->EnableAutoConfiguration->RabbitAutoConfiguration(具体的配置类)->@EnableConfigurationProperties->RabbitProperties(具体的配置类)->@ConfigurationProperties(prefix = "spring.rabbitmq")

通过上边的层层加载,我们很容易就可以实现配置的自动注入。这个过程也并不复杂,下一篇将尝试按照上面的流程,自己实现一个starter类。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇方法的形式参数是类名的时候如何.. 下一篇开启spring boot学习之旅

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目