拒绝白嫖,白嫖有罪,点个赞再走呗
自动配置
pom.xml
spring-boot-dependencies:核心依赖在父工程中!
我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就是因为有这些版本的仓库
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
启动器:简单的来说就是SpringBoot的启动场景;
比如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖!
springboot会将所有的工程场景,都封装成一个个的启动器,我们需要使用寿命功能,就只需要找到对应的启动器就可以了。
下面是spring官网的启动器的网址:
https://docs.spring.io/spring-boot/docs/2.4.4/reference/html/using-spring-boot.html#using-boot-starter
主程序
@SpringBootApplication
public class DemoApplication {
//将SpringBoot应用启动
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
注解
@SpringBootConfiguration //spting的配置
@Configuration //spring配置类
@Component //说明也是spring的一个组件
@EnableAutoConfiguration //自动导入包
@AutoConfigurationPackage //自动配置包
@AutoConfigurationPackage // 自动配置包注册
@Import({AutoConfigurationImportSelector.class}) // 自动导入选择器
AutoConfigurationImportSelector:自动导入选择器
getAutoConfigurationEntry()获得自动配置的实体
getCandidateConfigurations()获取候选的配置
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}标注了EnableAutoConfiguration注解的类
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
ClassLoader classLoaderToUse = classLoader;
if (classLoader == null) {
classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
}
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
}获取所有的加载配置
loadSpringFactories
classLoader.getResources("META-INF/spring.factories");获取资源
spring-boot-autoconfigure-2.2.0.RELEASE.jar
META-INF
spring.factories:所有的自动配置都在这里
这么多自动配置类为什么有的没有生效,需要导入对应的start才能生效
核心注解:@ConditionalOnXXX如果里面的条件都满足,才会生效
总结
springboot所有的自动配置都是在启动的时候启动并加载:所有的自动配置都在spring.factories,所有的自动配置类都在文件中,但是不一定生效,要满足条件才能加载,只要导入了对应的start,就有对应的启动器了,有了启动器,我们的自动装配就会生效,然后就自动配置完成了