前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@EnableAutoConfiguration

@EnableAutoConfiguration

作者头像
星哥玩云
发布2022-09-15 14:04:46
3530
发布2022-09-15 14:04:46
举报
文章被收录于专栏:开源部署开源部署

1、@EnableAutoConfiguration激活自动装配

查看@EnableAutoConfiguration源码

代码语言:javascript
复制
@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代码如下:

代码语言:javascript
复制
@EnableAutoConfiguration //开启自动装配
@ComponentScan(basePackages = {"com.tyschool"}) //包扫描
public class WebConfig {
}

2、理解自动装配

案例:

以Spring Boot提供装配HSQLDB的逻辑为例,理解自动装配

EmbeddedDatabaseConnection为嵌入式数据连接枚举,源码如下:

代码语言:javascript
复制
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实现:

源码如下:

代码语言:javascript
复制
@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对应内容:

代码语言:javascript
复制
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、@EnableAutoConfiguration激活自动装配
  • 2、理解自动装配
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档