SpringBoot自动配置原理

主程序类,主入口类

/*** @apiNote 来标注一个主程序类,说明这是一个Spring Boot应用*/
@SpringBootApplication
public class SpringBootPracticeApplication {
    public static void main(String[] args) {
        //Spring应用启动起来
        SpringApplication.run(SpringBootPracticeApplication.class,args);
    }
}

@SpringBootApplication作用

标注在某个类上,说明这个类是SpringBoot的主配置类,SpringBoot项目就应该运行这个类的main方法来启动SpringBoot应用。进入这个注解:可以看到上面还有很多其他注解!

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
			//....................
}

@ComponentScan

这个注解在Spring中很重要,它对应XML配置中的元素。
作用:自动扫描包(扫描当前主启动类同级的包)并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中。


@SpringBootConfiguration

作用:SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类。
我们继续进去这个注解查看

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}
@Configuration

这里的@Configuration,说明这是一个配置类,配置类就是对应Spring的xml配置文件。
再往里看

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {}
@Component

里面的@Component说明,启动类本身也是Spring中的一个组件而已,负责启动应用!

我们回到 SpringBootApplication 注解中继续看。


@EnableAutoConfiguration

开启自动配置功能
以前我们需要自己配置的东西,现在SpringBoot可以自动帮助我们配置;
@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;
点进注解接续查看:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
//....................
}
@AutoConfigurationPackage

自动配置包
再点进去查看:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
//..............
}
@import

(自动注册包和@ComponentScan自动扫描包,是联动的)Spring底层注解@import,给容器中导入一个组件。
Registrar.class 作用:将主启动类所在包及包下面所有子包里面的所有组件扫描到Spring容器;
这个分析完了,退到上一步,继续看。

@Import({AutoConfigurationImportSelector.class})

@Import({AutoConfigurationImportSelector.class})

给容器导入组件;
AutoConfigurationImportSelector: 自动配置导入选择器,那么它会导入哪些组件的选择器呢?我们点击去看这个类的源码。
省略…

思考:这么多自动配置为什么有的没有生效,需要导入对应的start才能有作用!
通过核心注解:@ConditionalOnxxx:如果这里边的条件都满足,才会生效。
我们在上面的自动配置类随便找一个打开看看,比如 :WebMvcAutoConfiguration
可以看到这些一个个的都是JavaConfig配置类,而且都注入了一些Bean,可以找一些自己认识的类,看着熟悉一下!

所以自动配置真正的实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项。但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配才会生效。
​ 通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类,然后将这些都汇总成为一个实例并加载到IOC容器中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值