Spring Bean的自动装配(SPI机制)(一)

638 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

学任何一个技术都要有一个清晰的思路,为什么要学,该组件技术为什么会存在?

何为自动装配

比如你在SpringBoot集成Redis的时候

加了依赖

就可以通过@AutowiredIOC容器中

但是我们并没有通过@Configuration@Bean注入RedisTemplate

这就是自动装配

自动装配原理

image-20220929201710139

约定大于配置SpringBoot是爷,都要听它的)

image-20220929201920130

(不止Redis,其他的组件也会这样)

约定是:

image-20220929202145879

Redis自动配置类:

image-20220929202317764

点击可以发现

image-20220929202424916

OK,我们找到了它定义Bean的东西

什么是@import注解

那么这些Bean是怎么加进来的呢?import在哪?

image-20220929204652540

1、@SpringBootConfiguration继承的@Configuration

2、@ComponentScan

image-20220929205214177

3、@EnableAutoConfiguration

image-20220929204814665

@Import里面的AutoConfigurationImportSelector.class类就是自动寻找需要装配的类的类名(字符串数组)

一定是去META-INF/spring.factories里找,而这个找的过程就是SPI机制

到这里,我们需要了解什么事SPI机制才能往下

理解SPI机制

SPI机制:

Service Provider Interface,就是一种服务发现的机制

举个例子: 以前:我是甲方调用你乙方的接口,乙方给我接口,然后提供给我接口文档,我按照文档进行开发

现在有了SPI机制:甲方自己提供接口,我仅仅只是提供接口,不实现,我提供api,乙方根据我这个api,自己去实现,然后乙方把jar给甲方,甲方只要找到依赖就行

调用逻辑:

1,甲方提供接口

2,乙方依赖接口所在的包,并且创建实现类实现该接口

3,在乙方实现类所在的jar包里面你要告诉甲方,实现类到底在哪里

在META-INF目录下创建一个services目录,在services目录下以接口的全路径名作为文件名,然后在文件里面写上所有实现类的全路径名

4,甲方依赖你乙方的jar包之后要进行调用ServiceLoader.load(SPIService.class)

image-20220929215419153

image-20220929215523825

load底层是一个迭代器

image-20220929220218439

迭代:

image-20220929220235892

核心代码:

image-20220929220353154

这里就很明显了,这个PREFIX就是**META-INF/services/**

image-20220929220530663

再利用反射机制,再实例化一下

image-20220929220754690

何为spring.factories,研究完再写下一篇,欢迎关注! image-20220929221442004