Springboot 的启动原理

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 自动配置选择器类,该类会 自动装载一些自动配置类。而这些配置类会完成相应的自动装配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值