目录
什么是自动装配?
我们先来看一下如果要配置一个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