SpringBoot自动装配原理

我们一般配置SpringBoot的时候,会先配置yml或者properties配置文件。并且pom.xml中,一般都会配置starter依赖。

首先,我先要写一个启动类,在run方法里面,有new 了一个SpringApplication。所以第一步会先创建一个SpringApplicaiton对象。执行run方法最核心的逻辑,创建IOC容器,创建对应的Bean对象

在这之前,我们需要明白我们要做的准备工作:

标记好对应的启动类

解析启动类上的注解

通过debug,我们进行代码解析:在run方法以后,我们new了一个SpringApplication(primarySource)启动类。

并且在其中的ConfigurableApplicationContext继承于ApplicationContext,ApplicationContext又继承于BeanFactory。而我们的BeanFactory是用来存储Bean的,所以我们的ConfigurableApplicationContext是一个IOC容器。

在外面的容器中,我们加载了启动类。就是run括号里面的当前类,以及加载args参数。

我们args可以加一些JVM启动参数,比如起始堆内存,最大堆内存,垃圾回收器使用哪一个等。

参数构建完以后,通过Java虚拟机开始加载我们的.class文件。加载我们.class文件的时候,用的是类加载器[类加载器有三种:启动类加载器、扩展类加载器、应用类加载器]。

1、启动类上面有一个@SpringBootApplication注解,在这个注解里面,会加载一个@SpringBootConfiguration,它是一个配置类。所以这个注解会将我们的启动类配置为一个配置类。那么配置为一个配置类有什么好处呢?

我们可以在启动类中做一些Bean的注入,比如restTemplate,加上@Bean注解,可以完成它的初始化,等同于我们springIOC中,.xml文件中的配置Bean的方式。

2、加载@ComponentScan注解,它可以扫描启动类所在的包下所有类的注解,同时扫描启动类所在包下子包中所有类的注解。

3、自动配置:[加载所有可能使用到的Bean对象,依据是pom文件中引入了哪些坐标]

启动类上面有一个@SpringBootApplication注解,在这个注解里面,会包含一个注解:@EnableAutoConfiguration。在@EnableAutoConfiguration注解里面,有一个@Import注解[动态导入]

静态导入:在一个类里面写死的。在编译的时候就会引入进来

动态导入:在这个类被加载的时候,才会去加载这个类。如果这个类不被加载,不被初始化,就不会被导入进来。

而我们的@Import包含了一个class类,叫做AutoConfigurationImportSelector.class.[自动配置导入选择器]

在这个selector里面,有一个方法,叫做selectImports,用于找到你要导入哪些东西。AnnotationMetadata annotationMetadata[原数据],那么原数据存在哪里呢?

在这个selector里面,还有一个方法。叫做getCandidateConfigurations。

在这个方法里面,有一个方法,叫做:loadFactoryNames

这个方法刚好返回了一个类的名称,叫做:EnableAutoConfiguration.class

当我检测到这个类的名称以后,我会干一件事,我去我们的配置文件里面读取到当前这个类的名字。哪个配置文件?在外面加载Spring包的时候,在springbootautoconfigure里面,有一个spring.factories。在它里面有一个EnableAutoConfiguration

    当我识别到这个以后,我就可以把里面存在的所有value值中,与pom依赖相关的取出来,通过反射的方式,完成实例化对象,这样就完成了自动装配。        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值