共计 2855 个字符,预计需要花费 8 分钟才能阅读完成。
1、@EnableAutoConfiguration 激活自动装配
查看 @EnableAutoConfiguration 源码
@Target(ElementType.TYPE) // 表示此注解的标识范围为接口、类、枚举 | |
@Retention(RetentionPolicy.RUNTIME) // 元注解,表示注解不仅保存在 class 文件,并且 jvm 加载 class 文件之后,仍然存在 | |
@Documented // 表示该注解会被 javadoc 工具记录 | |
@Inherited // 表示该注解会被子类继承 | |
@AutoConfigurationPackage // 添加该注解的类所在的 package, 作为自动配置 package 进行管理 | |
@Import(AutoConfigurationImportSelector.class) // 通过快速导入的方式实现把实例加入 spring 的 IOC 容器中 | |
public @interface EnableAutoConfiguration { |
案例:
使用 @EnableAutoConfiguration 激活自动装配
WebConfig 代码如下:
@EnableAutoConfiguration // 开启自动装配 | |
@ComponentScan(basePackages = {"com.tyschool"}) // 包扫描 | |
public class WebConfig { | |
} |
2、理解自动装配
案例:
以 Spring Boot 提供装配 HSQLDB 的逻辑为例, 理解自动装配
EmbeddedDatabaseConnection 为嵌入式数据连接枚举,源码如下:
public enum EmbeddedDatabaseConnection {NONE((EmbeddedDatabaseType)null, (String)null, (String)null), | |
H2(EmbeddedDatabaseType.H2, "org.h2.Driver", "jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"), | |
DERBY(EmbeddedDatabaseType.DERBY, "org.apache.derby.jdbc.EmbeddedDriver", "jdbc:derby:memory:%s;create=true"), | |
HSQL(EmbeddedDatabaseType.HSQL, "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:%s"); | |
...... | |
// 获得嵌入式数据库连接 | |
public static EmbeddedDatabaseConnection get(ClassLoader classLoader) {EmbeddedDatabaseConnection[] var1 = values(); | |
int var2 = var1.length; | |
for(int var3 = 0; var3 < var2; ++var3) {EmbeddedDatabaseConnection candidate = var1[var3]; | |
if (candidate != NONE && ClassUtils.isPresent(candidate.getDriverClassName(), classLoader)) {return candidate; | |
} | |
} | |
return NONE; | |
} |
其中,get(ClassLoader classLoader) 用于 DataSourceAutoConfiguration.EmbeddedDatabaseCondition 实现:
源码如下:
@Configuration(proxyBeanMethods = false) // 标识为配置类 | |
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}) // 条件注解,当类存在时 | |
@EnableConfigurationProperties(DataSourceProperties.class) // 从配置文件中映射 DataSource 的值 | |
@Import({DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class}) // 通过快速导入的方式实现把实例加入 spring 的 IOC 容器中 | |
public class DataSourceAutoConfiguration {@Configuration(proxyBeanMethods = false) | |
@Conditional(EmbeddedDatabaseCondition.class) // 判断是否引入内置数据库:H2,DERBY,HSQL | |
@ConditionalOnMissingBean({DataSource.class, XADataSource.class}) // 条件注解,Spring 容器中没相关 Bean | |
@Import(EmbeddedDataSourceConfiguration.class) | |
protected static class EmbeddedDatabaseConfiguration { } | |
...... | |
} |
- @Conditional(EmbeddedDatabaseCondition.class) 表示当 DataSourceAutoConfiguration.EmbeddedDatabaseCondition 匹配后, 即 HSQLDB 的 JDBC 驱动类 org.hsqldb.jdbcDriver 存在于 Class Path 下时,DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration 将被装配
- @Import(EmbeddedDataSourceConfiguration.class), 导入 EmbeddedDataSourceConfiguration.class
DataSourceAutoConfiguration 是如何装配的呢?
spring-boot-autoconfig 是 Spring Boot 核心模块, 其中提供了大量的内建自动装配 @Configuration 类, 它们统一存放在 org.springframwork.boot.autoconfigure 包或子包下。同时 DataSourceAutoConfiguration 类配置在 META-INF/spring.factories 资源中,spring.factories 属于 JavaPropeties 文件格式,@EnableAutoConfiguration 充当该 Properties 的 Key, 而自动装配类为 Value
spring.propertis 对应内容:
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
正文完
星哥玩云-微信公众号
