一文学会Springboot的自动装配机制


前言

何谓Springboot的自动装配,简要概括就是:引入第三方组件的starter包后能够自动将第三方组件的bean加载到IOC容器中供用户使用。

自动装配的机制是Springboot提供的,因此第三方组件的starter包在编写的时候,就需要根据Springboot的自动装配的规则来编写starter包,那么这里的规则概括如下。

  1. starter包需要在/META-INF/目录下提供spring.factories文件;
  2. spring.factories文件中以Key-Values的形式来提供需要Springboot去加载的类的全限定名。这里的Key就是Springboot中各种扩展点的全限定名,比如org.springframework.boot.autoconfigure.EnableAutoConfiguration,然后Values就是starter包中提供的扩展点的所有类的全限定名,以逗号隔开。

只要第三方组件的starter包按照上述规则来编写,那么Springboot就能够将starter包提供的各种扩展点的类进行加载,例如下面的这个spring.factories文件。

org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
复制代码

啥意思呢,其实就是第三方组件的starter包在告诉Springboot:嘿,亲爱的Springboot,我提供了一个监听器,它的全限定名是org.springframework.boot.autoconfigure.BackgroundPreinitializer,拜托你去加载它;嘿,亲爱的Springboot,我提供了多个自动配置类,它们的全限定名是org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfigurationorg.springframework.boot.autoconfigure.aop.AopAutoConfigurationorg.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,拜托你去加载它们。

Springboot的自动装配机制解释起来很简单,使用起来也巨方便,关于自动装配的具体使用,将在后续的自定义starter包一文中进行演示。

本文的重点是Springboot的自动装配机制的底层原理,废话不多说,开造。

Springboot版本:2.4.1

正文

一. 认识@SpringBootApplication注解

我们新建一个Springboot应用,都需要一个启动类,然后在启动类上添加@SpringBootApplication注解,那么来看一下@SpringBootApplication注解的组成。

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {}
复制代码

也就是说@SpringBootApplication是由@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan组成的复合注解,下面是对这三个注解的说明。

  • @SpringBootConfiguration表明Springboot启动类是一个配置类;
  • @ComponentScan注解会将指定路径下的被特定注解修饰的类加载为Spring中的bean,这些特定注解为@Component,@Controller,@Service,@Repository和@Configuration注解;
  • @EnableAutoConfiguration注解用于开启Springboot的自动装配。

也就是说,相当于我们在Springboot应用的启动类上添加了一个叫做@EnableAutoConfiguration的注解,从而开启了自动装配功能。

那么再看一下@EnableAutoConfiguration注解的组成。

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
复制代码

@EnableAutoConfiguration注解也是一个复合注解,主要功能由@AutoConfigurationPackage注解和@Import注解实现,那么肯定的,自动装配,就是这两个注解实现的。

二. @AutoConfigurationPackage注解

先给出结论。

@AutoConfigurationPackage注解作用在Springboot启动类上,会向Spring容器注册一个类型为AutoConfigurationPackages.BasePackagesbean,这个bean中保存了Springboot启动类的包路径,后续Springboot就会扫描这个包路径下由@Component,@Controller,@Service,@Repository和@Configuration注解修饰的类。

下面开始分析原理。

@AutoConfigurationPackage注解的功能由@Import(AutoConfigurationPackages.Registrar.class) 实现,所以看一下AutoConfigurationPackages.Registrar的类图,如下所示。

所以AutoConfigurationPackages.Registrar实际是一个ImportBeanDefinitionRegistrar,那么在Spring容器启动过程中,会调用到AutoConfigurationPackages.RegistrarregisterBeanDefinitions() 方法向注册表注册一个BeanDefinitionregisterBeanDefinitions() 方法如下所示。

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
复制代码

registerBeanDefinitions() 方法中调用了AutoConfigurationPackagesregister() 方法,register() 方法的第二个参数是通过new PackageImports(metadata).getPackageNam

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值