SpringBoot启动流程(二)——自动装配原理

本文详细探讨了SpringBoot的自动装配机制,从什么是自动装配开始,解释了自动装配如何通过DataSourceAutoConfiguration类工作,然后揭示了自动装配类在autoConfig.jar的spring.factories文件中加载的过程。文章深入到AutoConfigurationImportSelector和ConfigurationClassPostProcessor等关键类,逐步解析了自动装配何时被触发以及其在SpringBoot启动流程中的位置。
摘要由CSDN通过智能技术生成

目录

什么是自动装配?

自动装配是如何工作的?

何时触发自动装配?


什么是自动装配?

我们先来看一下如果要配置一个DataSource在spring中是怎么配置的,需要在工程的xml中创建一个Bean节点,配置好后spring在启动时会将其初始化到IOC容器中供需要时使用,大致代码如下:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
    destroy-method="close">  
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />  
    <property name="url"  
        value="jdbc:sqlserver://xxx" />  
    <property name="username" value="sa" />  
    <property name="password" value="********" />  
</bean>  

那么在SpringBoot中要想配置一个DataSource是怎么配置的呢,很简单只需要在yml文件配置对应属性的值无需额外的xml来配置Bean,此时Bean的创建过程是有跟数据源相关的自动配置类DataSourceAutoConfiguration完成的,这个过程我们称之为自动装配。

spring:
    datasource:
        url: jdbc:mysql://xxx
        username: @prd.db.username@
        password: @prd.db.password@
        driver-class-name: com.mysql.cj.jdbc.Driver

下面是 DataSourceAutoConfiguration的代码,上面的属性会映射到@EnableConfigurationProperties(DataSourceProperties.class)DataSourceProperties类中。

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {

	@Configuration(proxyBeanMethods = false)
	@Conditional(EmbeddedDatabaseCondition.class)
	@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
	@Import(EmbeddedDataSourceConfiguration.class)
	protected static class EmbeddedDatabaseConfiguration {

	}
//省略其他方法
}


--------------------- 下面是DataSourceProperties的部分代码--------------
--------------------- 可以看到与yml配置对应的参数          ---------------



@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {

	/**
	 * Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
	 */
	private String driverClassName;

	/**
	 * JDBC URL of the database.
	 */
	private String url;

	/**
	 * Login username of the database.
	 */
	private String username;
//省略其他方法
}

自动装配是如何工作的?

SpringBoot能支持的自动装配的类都在autoConfig.jar 这个jar文件下的spring.factories文件中了,下面仅仅贴出其中部分作为示例说明, 该文件是如何加载的请参考SpringBoot启动流程(一)这里不赘述了。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\

加载这些类是通过AutoConfigu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有机叶生菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值