目录
此时tokenService的类上还是有@Component注解的
总结:将security模块当成第三模块引用,结合spi机制就可以理解。
1. springboot 2.7之前
2.7之前大家都是了解的springboot的自动装配原理,是到MENT-INF/spring.factories中扫描,但是可能也不理解为什么去MENT-INF/spring.factories 这里,怎么不去其他地方?又是怎么加载的呢?这就需要看些SPI机制,原文链接SPI机制是什么?_会飞的IT蜗牛的博客-CSDN博客
1.1 spi机制
所以我们一点也不陌生,以前在学习jdbc连接数据库的时候就发现Class.forName("com.mysql.cj.jdbc.driver")写不写都行,那为什么呢?就是因为我们在引入jdbc的jar包时,打开依赖就会发现里面已经给你写好了配置类(自己去看,要动手)。
总结就是:
(1)在引用第三方jar包(mysql)时,会自动加载配置类,至于怎么加载可以去看上面的链接很详细。
(2)这就是为什么springboot引用依赖后,会自动配置
(3) 不理解可以再看看hutool依赖如下图 (引用这个依赖就可以用他的一些配置类,就是使用的spi机制加载的,springboot也一样)
2 springboot2.7 之后
2.1 配置类的位置发生变化
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = new ArrayList<>(
SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
+ "are using a custom packaging, make sure that file is correct.");
return config