Springboot 的启动原理
你好! 这是我第一次使用 Markdown编辑器 所展示的欢迎页。如果你休闲, 可以大致阅读这篇文章,了解一下Springboot的一些基本知识。
mvn install 和 mvn package 的区别
package是把jar打到本项目的target下,而install时把target下的jar安装到本地仓库,供其他项目使用。 当其他项目需要依靠该项目
编译是,使用install
Springboot 的启动原理
我把改成debug模式 有匹配的,有不匹配的,里面有个注解@Condition
Condution 的用法 我把不匹配的满足它的触发条件我给它设置为真 满足我的条件 看它是否由不匹配变成匹配我发现ActiveMQ,退出是默认不匹配,最后由于我加了ActiveMQ jar包它变成匹配的了
然后把ActiveMQ 自动配置的源码解释一下 因为上面有个ConditioalOnClass
Mybatis的自动配置
如果发现这个,就会自动配置
mybatis jar 包里面 这里面记录的就是我们自动配置要执行的哪些类
springboot的入口函数
springboot的入口函数
package com.aaa.qy156;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.aaa.qy156.dao")
public class Springboot20221008Application {
public static void main(String[] args)
{
SpringApplication.run(Springboot20221008Application.class, args);
}
}
run方法必须传入一个类,这个类必须拥有注解springbootapplication
注解SpringBootApplication分析
SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就会运行这个类的main方法来启动SpringBoot项目。
这个类的main方法来启动SpringBoot项目。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//等同于configuration
@SpringBootConfiguration
//启用Spring应用程序上下文的自动配置,尝试猜测(满足condition)和配置您可能需要的bean
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
EnableAutoConfiguration 自动配置bean
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
AutoConfigurationPackage 自动配置包,主要是使用的@Import来给Spring容器中导入一个组件 ,这里导入的是Registrar.class
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
Registrar 注册类将主配置类(即@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描加载(注册)到Spring容器。
主要用来解决扫描那些包
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//获取需要注册的组件的包名
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
选择器类AutoConfigurationImportSelector
扫描的包找到之后,那具体加载哪些组件呢,看看下面这个注解
下面三个方法是获取所有需要自动配置的组件
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = getConfigurationClassFilter().filter(configurations);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
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 configurations;
}
总结
springboot启动类里面有一个 main 方法运行了一个 run()方法,在 run 方法中必 须要传入一个@SpringBootApplication 注解的类。 @SpringBootApplication 包含@EnableAutoConfiguration 该注解 @EnableAutoConfiguration 开启自动配置功能,在 @EnableAutoConfiguration 中包含 @Import({AutoConfigurationImportSelector.class})注解, 该注解需 要导入 AutoConfigurationImportSelector 自动配置选择器类,该类会 自动装载一些自动配置类。而这些配置类会完成相应的自动装配。