Spring Boot自动装配原理

触发自动装配的注解

@SpringBootApplication这个注解是一个复合注解,表示这个是启动类

下面有三个子注解:

@SpringBootConfiguration // 注解:标志该类为springboot配置
@EnableAutoConfiguration //启用springboot自动配置/自动转配。
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

//默认扫描当前包及其子包中@Controller,@Service等注解,并把这些bean加载到ioc器中

自动装配源码解析

在这个AutoConfigurationImportSelector类中我们重点关注selectImports()方法

@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
        //通过这个类加载器去加载
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
				annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

通过源码可以知道,这个classLoader类加载器,就是要去帮我们加载和扫描这个路径"META-INF/spring-autoconfigure-metadata.properties",这个路径就是一个配置文件。

我们去全局收索一下,果然在springboot包里面发现了。

进入后发现有大量的配置,全是完整的全类名

然后也有我们常用的配置,例如:

org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration.ConditionalOnClass=javax.sql.DataSource,org.springframework.jdbc.core.JdbcTemplate

springboot把常用的第三方jar包的配置文件都管理在一起,把所有的全类名都记录下来了,当检查到导入了对应的jar包或者说starter(也就是pom文件里面的gav坐标),就可以根据全类名找到配置,根据配置加载想要的bean到IOC容器中。

除了在上面说到的加载配置文件,还有

AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata);方法也会加载配置

SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());

//spring的工厂类加载器还会帮我们去加载一些工厂需要的,这个类加载器会从META-INF/spring.factories配置文件中去加载spring自己需要的配置。spring.factories配置如下:

这里会加载两份配置文件:

1、扫描加载 META-INF/spring-autoconfigure-metadata.properties
这里基本定义了绝大对数你可能会用到的三方的一些配置类

2、扫描加载 META-INF/spring.factories

问:以上两份配置文件中定义的bean都会在启动的时候被加载到IOC容器中吗?

答案:不会,简单来说,加了@Configuration注解才会被加入IOC容器,这里还有很多复杂的判断省略...即按需装配对应的Bean

总结:

  • 查看底层源码后可以得出Spring Boot自动配置原理:
  1. @EnableAutoConfiguration注解导入AutoConfigurationImportSelector类。
  2. 执行selectImports方法调用SpringFactoriesLoader.loadFactoryNames()扫描所有jar下面的对应的META-INF/spring.factories文件.
  3. 限定为@EnableAutoConfiguration对应的value,将这些装配条件的装配到IOC容器中。
  • 自动装配简单来说就是自动将第三方的组件的bean装载到IOC容器内,不需要再去写bean相关的配置,符合约定大于配置理念。
  • Spring Boot基于约定大于配置的理念,配置如果没有额外的配置的话,就给按照默认的配置使用约定的默认值,按照约定配置到IOC容器中,无需开发人员手动添加配置,加快开发效率。

面试回答步骤:

  1.  @SpringBootApplication 或 @EnableAutoConfiguration: 在Spring Boot的主类的 main 方法中使用 @SpringBootApplication 或者 @EnableAutoConfiguration 注解,是启动Spring Boot应用程序的入口。这两个注解会触发Spring Boot自动配置的机制。
  2.  spring.factories 文件: 在项目的依赖中,每个Spring Boot Starter都包含一个 META-INF/spring.factories 文件。这个文件中列出了各个Starter所提供的自动配置类。当Spring Boot应用启动时,它会扫描这些Starter,加载并应用自动配置类。
  3.  自动配置类的加载: Spring Boot会在启动时扫描项目的依赖中的spring.factories文件,找到各个Starter的自动配置类,并加载这些类。
  4.  @Conditional 注解的条件判断: 自动配置类通常会使用 @Conditional 注解来定义一些条件,例如 @ConditionalOnClass@ConditionalOnMissingBean 等。这些条件会在Spring Boot启动时进行评估,根据条件判断结果来决定是否应用某个自动配置。
  5. 自动配置与Bean注入: 符合条件的自动配置类会在Spring容器中创建和注册一些Bean。这些Bean通常是应用程序所需的基础设施,如数据源、消息队列、缓存等。这些Bean会根据自动配置的条件和配置信息被注入到Spring的应用上下文中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值