SpringBoot自动装配原理@EnableAutoConfiguration

1.SpringBoot的自动装配

SpringBoot的方便之处在于简化了十分繁琐的XML配置文件和繁琐的POM依赖管理。SpringBoot要开启某一些功能,只需要在启动类上加上@Enablexxxxxxx这样的类似注解就能开启,例如事务管理器的功能、异步注解功能等等。Enable的功能就是基于SpringBoot的自动装配功能实现的,既然是自动,说明SpringBoot提供了一定的规则,只要按照这个规则进行开发,就能利用自动装配实现自己的逻辑封装。

2.@EnableAutoConfiguration核心原理

@SpringBootAppolication注解是启动类上加的SpringBoot项目标识注解,这个注解由3个子注解完成:

  - `@SpringBootConfiguration`:SpringBoot的标识配置类,底层包含`@Configuration`注解,标识这个类也是容器的一个组件可以被当做配置类使用。
  - `@EnableAutoConfigration`:自动装配的原理就是它实现的,SpringBoot就会自动去加载一定规则的类当做一个Bean放到IOC容器中。
  - `@ComponentScan`:包扫描功能的支持,如果没有指定路径,默认就是扫描当前配置类所在的包及其子包。

2.1 @EnableAutoConfiguration注解

这个注解由2个元注解组成:

     - `@AutoConfigurationPackage`:用于表示当前配置类所在包的信息保存成一个Bean,供后续SpringBoot使用。
     - `@Import(EnableAutoConfigurationImportSelector.class)`:自动装配的核心原理就在这里,import注解会让参数里面的class成为一个bean,不过需要判断这个class是否是一个importSelector,如果是,则这个类的实现方法会返回一个类的全限定名数组,用来生成bean。

2.2 DeferredImportSelector

刚才的EnableAutoConfigurationImportSelector.class实现了一个接口叫DeferredImportSelector,这个接口同样继承自ImportSelector,不过这个接口比较特殊,这个DeferredImportSelector返回的类全限定名列表会在最后进行实例化(延时加载)和分组排序的功能。

2.3 META-INF/spring.factories文件

在这个importSelector中会进行对工程目录下所有的META-INF/spring.factories文件进行扫描,解析里面的key-value结构(value就是类的全限定名),将EnableAutoConfiguration为key的value全部找出来并缓存到内存里以供后续使用。这些value的类都会被加载,然后检查是否符装载的要求,例如是否被过滤了,是否满足@Conditional系列注解。

3.自定义starter大致步骤

     1. 命名规范问题,官方的starter一般命名风格是`spring-boot-starter-xxx`,我们自定义的一般换一个写法更好容易区分。
     1. POM中引入spring-boot-configuration-processor,以便提供配置文件处理功能提示。
     1. 编写自己satrter的service逻辑等。
     1. 在配置类上添加`@ConfigurationProperties`、`@EnableConfigurationProperties`来支持,最后在自己资源目录下面新建`META-INF/spring.factories文件`,将key就是EnableAutoConfiguration,value就是这个配置类的全限定名。
     1. 新的工程POM引入这个starter包以后,有2种方式来开启刚才starter的新功能:
        1. 使用@Import注解来将starter的核心配置类导入,即便完成。
        1. 使用@Enablexxxx的形式来开启(前提是starter提供了这个注解,其实这种注解底层也就是@Import)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Minor王智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值