Springboot运行原理

Springboot有三个核心注解

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan

一、@SpringBootConfiguration
这个注解是springboot的配置类,其作用和@configuration注解是基本上是一样的
可以看到其实就是直接对configuration注解进行了一层套娃式的封装
当我们在项目中使用了 @Indexed 之后,编译打包的时候会在项目中自动生成METAINT/spring.components文件。根据该文件进行扫描注入,可以提高效率,相当于为为扫描的类创建了索引文件,只需要一次io就能完成全部类的扫描。
当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader 读取并加载,转换为CandidateComponentsIndex对象,这样的话@ComponentScan不在扫描指定的package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的。

简单点说,使用了@Indexed注解后,原来@ComponentScan可能需要扫描非常多的类,现在只需要在启动后对spring.components进行一次io,将类路径写入文件,后续将只需要读取文件即可获得所有类路径

proxyBeanMethods属性是是否为被注解的类修饰的属性每次都去ioc容器里获取它的代理类,默认为true开启,设置为false关闭后,每次获取这个类的实例会创建一个新的对象且不由IOC容器进行管理

二、@EnableAutoConfiguration注解
这个是springboot开启自动配置的核心所在

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

@Import,当注入的类实现了ImportSelector接口,就不会将该类型注入到容器中,而是会注入selectImports方法返回的信息对应的对象(动态使用)
@Import有三种用法:

1、.class数组方式;不额外实现其他接口,简单将class数组中的每个类注册到IOC容器中
2、实现ImportSelector(Spring Boot底层采用比较得多的方式);
实现ImportSelector接口,重写selectImports()方法,返回的是要导入到容器中的类的全类名数组。然后会将返回的全类名数组对应的类全部加载到spring容器中
3、ImportBeanDefinitionRegistrar方式,实现ImportBeanDefinitionRegistrar接口
手动将指定的bean注册到IOC容器中
@AutoConfigurationPackage注解的作用是扫描启动类所在的包及其子包下所有的组件,并将其添加到IOC容器中进行管理

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}

这里最核心的就是这个Registrar类,正是通过它去将启动类所在的包及其子包下的所有组件注册到IOC容器

Registrar实现了ImportBeanDefinitionRegistrar接口
这个接口提供了两个重载的默认方法,Registrar类重写了一个默认方法

三、ComponentScan注解
在springbootApplication中,componentscan注解的作用主要是扫描@AutoConfigurationPackage中设置的basepackges属性指向的包及其子包

总结
因为spring默认情况下只能扫描到我们项目启动类下的组件,但是对于项目引入的jar包文件我们就必须手动扫描,springboot通过读取jar包文件下的META-INF/spring.factories文件,将其中指定的需要装配的类读取到IOC容器中,从而使得非spring官方的组件也能够不修改原有代码的情况下,只需要增加一部分自动装配的文件配置和自动装配类,即可完成与springboot的整合,充分体现了Java中SPI的设计理念

原博客地址https://blog.csdn.net/qq_59620850/article/details/131955632
自己简单总结
自己的理解

Springboot自动配置有两个重要的注解

一个是@SpringBootConfiguration,是Springboot的配置注解

一个是@EnableAutoConfiguration,是springboot自动导入加载的注解

springboot启动一开始会大量的加载自动配置类,是从/META-INF/spring.factories获取指定配置去加载

然后我们可以在yml或者properties里面开启debug模式看看是否加载了我们所需要的自动配置,如果没有的话就需要手动配置,默认值可以通过yml和properties里面的值去修改绑定springboot封装好的自动配置类里面的Properties文件中的相关属性。

posted @   泡泡大可爱  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示