@SpringBootApplication //主启动类的注解 public class ShiroSpringbootApplication { public static void main(String[] args) { SpringApplication.run(ShiroSpringbootApplication.class, args); } }
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
点进去之后会发现,作为SpringBoot配置的三个核心注解
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
追进去是咋们的@Configuration注解, 代表当前是一个核心配置类
这是指定我们要扫描哪些,Spring注解
点进去之后会发现除了其他基本注解外,主要核心就是以下两个
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class})
自动配置包,点进去之后会发现@Import这个组件
@Import({Registrar.class}) 相当于给容器中导入一个这个组件
当我我追踪这个Registrar.class会发现这个类重写了两个方法
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()); } public Set<Object> determineImports(AnnotationMetadata metadata) { return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata)); }
Registrar.class里面的registry方法:
Registrar作用:把某一个包下的组件注册进去
通过registry给容器中导入一系列组件
new AutoConfigurationPackages.PackageImport(metadata)).getPackageName(),通过通过包导入的方法,获取到元数据对应的包名,而这个包名正好对应我们项目的包名,然后讲我们包下的组件封装到我们的register里面去,通过register()这个方法批量注册进去。
换句话说就是register()这个方法把某一个包的组件注册到容器中,而这个包就是我们Main主启动类对应的包
!
这个注解相当于给容器中导入一些组件
点进去后,会发现这个方法
.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
获取所有所有配置的集合
我们通过debug发现,候选配置有很多个
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
this.getCandidateConfigurations(annotationMetadata, attributes);这个方法会进入到我们
对于里面的一些配置会通过我们spring工厂的加载器,进行一个加载操作
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
.loadFactoryNames(),点进去会有 SpringFactoriesLoader.class.getClassLoader();
SpringFactoriesLoader这个方法里面
最终通过这个方法加载得到一个Map<String,List
而在此之后classLoader.getResources()方法会获取我们的资源文件
有个META-INF/spring.factories
路径
这个方法会默认扫描在我们当前系统所有META-INF/spring.factories位置的文件
而最核心的就是这个spring-boot-autoconfigure-2.6.3.jar这个包
我们打开当前的spring.factories,可以看到我们springboot全场景的自动配置都导进来了
可以说文件写死了spring-boot-启动就要给容器中加载所有配置;
虽然我们127个场景的所有自动配置在启动时候默认是是全部加载,但是它会通过按需开启自动导入配置项
即我们每个场景中的以后缀名为AutoConfiguration配置文件中的@Conditional(条件装配注解),以这个为参照,最终会按需装配
若我们有使用其中的个别场景
我们进入这个场景的AutoConfiguration配置文件,若想更改配置,我们可以通过在yml中,并!!根据该配置文件绑定的对应Properties文件中定义的内容来修改
而这些属性或通过
利用该注解定义的前缀进行封装,我们可以通过对应的Properties文件中对应的属性进行修改
大体流程:
xxxxxxxxAutoConfiguration---> 组件 --->xxxxProperties里面的属性 --->application.properties
springboot的一个设计模式
springboot会在底层配好所有的组件,但是如果用户自己配置了以用户的优先,从@ConditionOnMissBean这个注解可以看出
在这个方法下的内容就就是,去除一些不要的,排斥的,或者重复的配置,最后返回configurations
@EnableAutoConfiguration总结