持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
学任何一个技术都要有一个清晰的思路,为什么要学,该组件技术为什么会存在?
何为自动装配
比如你在SpringBoot集成Redis的时候
加了依赖
就可以通过@Autowired从IOC容器中
但是我们并没有通过@Configuration和@Bean注入RedisTemplate
这就是自动装配
自动装配原理
约定大于配置(SpringBoot是爷,都要听它的)
(不止Redis,其他的组件也会这样)
约定是:
Redis自动配置类:
点击可以发现
OK,我们找到了它定义Bean的东西
什么是@import注解
那么这些Bean是怎么加进来的呢?import在哪?
1、@SpringBootConfiguration继承的@Configuration
2、@ComponentScan
3、@EnableAutoConfiguration
@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)
load底层是一个迭代器
迭代:
核心代码:
这里就很明显了,这个PREFIX就是**META-INF/services/**
再利用反射机制,再实例化一下
何为spring.factories,研究完再写下一篇,欢迎关注!