好程序员Java培训分享SpringBoot -自动配置原理

200 篇文章 0 订阅
101 篇文章 0 订阅

好程序员Java培训分享SpringBoot -自动配置原理,概要:SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration

利用EnableAutoConfigurationImportSelector给容器中导入一些组件可以查看selectImports()方法的内容

List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

SpringFactoriesLoader.loadFactoryNames()扫描所有jar包类路径下META‐INF/spring.factories

把扫描到的这些文件的内容包装成properties对象,从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中

@EnableAutoConfiguration

作用

@EnableAutoConfiguration这个类很重要,主要的作用是自动载入应用程序所需要的所有默认配置,达到智能的自动配置作用

主要是通过他来实现约定大于配置

源码

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

// 自动配置包

@AutoConfigurationPackage

// 给IOC容器导入组件

@Import(AutoConfigurationImportSelector.class)

public @interface EnableAutoConfiguration {

String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

Class<?>[] exclude() default {};



String[] excludeName() default {};

}

说明

@Import(AutoConfigurationImportSelector.class) 这个注解里的AutoConfigurationImportSelector最为重要

利用AutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

AutoConfigurationImportSelector

selectImports()方法

首先执行selectImports()方法 中调用 getAutoConfigurationEntry()

public String[] selectImports(AnnotationMetadata annotationMetadata) {

...

    AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,

            annotationMetadata);

    return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());

}

getAutoConfigurationEntry

该方法主要作用获取EnableAutoConfiguration中的属性,调用getCandidateConfigurations()方法

protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,

        AnnotationMetadata annotationMetadata) {

        ...

      List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

     ..

}

getCandidateConfigurations

获取候选的配置信息,在候选信息的中使用SpringFactoriesLoader.loadFactoryNames()

protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {

 //加载所有的配置类信息

    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),

            getBeanClassLoader());

    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "

            + "are using a custom packaging, make sure that file is correct.");

    return configurations;

}

SpringFactoriesLoader

这个类中有一个比较重要的工具类SpringFactoriesLoader主要功能就是从指定的配置文件META-INF/spring-factories加载配置,spring-factories是一个典型的java properties文件,只不过Key和Value都是Java类型的完整类名,

主要的作用:

扫描所有jar包类路径下 META-INF/spring.factories

把扫描到的这些文件的内容包装成properties对象 从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,

然后把他们添加在容器中 将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中

/**

  • 使用内部工具 SpringFactoriesLoader,查找classpath上所有jar包中的META-INF\spring.factories

  • 找出其中key为org.springframework.boot.autoconfigure.AutoConfigurationImportFilter的属性定义的过滤器类并实例化。

  • AutoConfigurationImportFilter过滤器可以被注册到 spring.factories用于对自动配置类做一些限制,在这些自动配置类的字节码被读取之前做快速排除处理。

  • spring boot autoconfigure 缺省注册了一个 AutoConfigurationImportFilter :

**/

public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {

    String factoryClassName = factoryClass.getName();

    return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());

}

在这里插入图片描述

Auto Configure

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.batch.BatchAutoConfiguration,\

org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\

org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\

org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\

org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\

org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\

org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\

org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\

org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\

以MultipartAutoConfiguration(文件上传)为例

// 表示这是一个配置类

@Configuration

// 判断当前项目有没有这些类 有这些类则配置生效

@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })

// 判断配置文件中是否存在某个配置spring.servlet.multipart.enabled;

@ConditionalOnProperty(prefix = “spring.servlet.multipart”, name = “enabled”, matchIfMissing = true)

// 判断当前应用是否是web应用,如果是,当前配置类生效

@ConditionalOnWebApplication(type = Type.SERVLET)

@EnableConfigurationProperties(MultipartProperties.class)

public class MultipartAutoConfiguration {

// 配置文件中对应的JavaBean

private final MultipartProperties multipartProperties;



public MultipartAutoConfiguration(MultipartProperties multipartProperties) {

    this.multipartProperties = multipartProperties;

}

}

根据当前不同的条件判断,决定这个配置类是否生效?一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类中每一个属性又是和配置文件绑定;

MultipartProperties

所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类

@ConfigurationProperties(prefix = “spring.servlet.multipart”, ignoreUnknownFields = false)

public class MultipartProperties {

//是否开启文件上传功能  默认开启

private boolean enabled = true;

// 上传的路径

private String location;



public void setMaxFileSize(DataSize maxFileSize) {

    this.maxFileSize = maxFileSize;

}



public void setMaxRequestSize(DataSize maxRequestSize) {

    this.maxRequestSize = maxRequestSize;

}

public void setResolveLazily(boolean resolveLazily) {

    this.resolveLazily = resolveLazily;

}

public void setFileSizeThreshold(DataSize fileSizeThreshold) {

    this.fileSizeThreshold = fileSizeThreshold;

}

}

spring:

servlet:

multipart:

  enabled: true

  location: /upload/files

  # 支持文件写入磁盘

  file-size-threshold: 0

  # 上传文件总的最大值

  max-request-size: 50MB

  # 单个文件上传的大小

  max-file-size: 5MB

  # 上传时是否支持懒加载

  resolve-lazily: false

小结

SpringBoot启动会加载大量的自动配置类

自动配置类添加组件的时候,会从properties类中获取某些属性。我们可以在配置文件中指定这些属性的值

xxxxAutoConfigurartion:自动配置类给容器中添加组件

xxxxProperties:对应配置文件中相关属性,在配置对象可以是setter方法 也有可以是属性

根据当前不同的条件判断,决定这个配置类是否生效。

一但这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的。

5.所有在配置文件中能配置的属性都是在xxxxProperties类中封装者,配置文件能配置什么就可以参照某个功能对应的这个属性类

@ConfigurationProperties(prefix = “spring.http.encoding”) //从配置文件中获取指定的值和bean的属性进行绑定

public class HttpEncodingProperties {

public static final Charset DEFAULT_CHARSET = Charset.forName(“UTF-8”);

精髓:

1)、SpringBoot启动会加载大量的自动配置类

2)、先看我们需要的功能有没有SpringBoot默认写好的自动配置类

3)、再来看这个自动配置类中到底配置了哪些组件(只要我们要用的组件有,我们就不需要再来配置了)

4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值

xxxxAutoConfigurartion:自动配置类;给容器中添加组件;

xxxxProperties:封装配置文件中相关属性;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值