网站推广宣传语,开源wiki做网站,html个人简历完整代码,wordpress 全局设定使用springboot开发web应用是很方便#xff0c;只需要引入相对应的GAV就可以使用对应的功能#xff0c;springboot默认会帮我们配置好一些常用配置。那么springboot是怎么做到的呢?这篇文章将一步步跟踪源码#xff0c;查看springboot到底是如何帮我们做自动化配置。 sprin…使用springboot开发web应用是很方便只需要引入相对应的GAV就可以使用对应的功能springboot默认会帮我们配置好一些常用配置。那么springboot是怎么做到的呢?这篇文章将一步步跟踪源码查看springboot到底是如何帮我们做自动化配置。 springboot核心注解 SpringBootApplication 可以看到使用import导入一个开启自动配置的选择器 import的作用官方源码 * author Chris Beams* since 3.0* see Configuration* see ImportSelector* see ImportResource*/
Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
Documented
public interface Import {/*** The {link Configuration}, {link ImportSelector} and/or* {link ImportBeanDefinitionRegistrar} classes to import.*/Class?[] value();
} 导入Configuration注解的配置类导入ImportSelector的实现类导入ImportBeanDefinitionRegistrar的实现类 接着看导入的这个选择器EnableAutoConfigurationImportSelector.class protected ListString getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes) {ListString 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;} 这里方法调用了两个核心方法 1、 getSpringFactoriesLoaderFactoryClass()我们发现返回的是EnableAutoConfiguration.class 2、loadFactoryNames这个方法 public static ListString loadFactoryNames(Class? factoryClass, ClassLoader classLoader) {String factoryClassName factoryClass.getName();try {EnumerationURL urls (classLoader ! null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));ListString result new ArrayListString();while (urls.hasMoreElements()) {URL url urls.nextElement();Properties properties PropertiesLoaderUtils.loadProperties(new UrlResource(url));String propertyValue properties.getProperty(factoryClassName);for (String factoryName : StringUtils.commaDelimitedListToStringArray(propertyValue)) {result.add(factoryName.trim());}}return result;}catch (IOException ex) {throw new IllegalArgumentException(Unable to load factories from location [ FACTORIES_RESOURCE_LOCATION ], ex);}} 先获取factoryClassEnableAutoConfiguration的className(org.springframework.boot.autoconfigure.EnableAutoConfiguration) 将这个className当做Property的key值来获取Value。springboot默认会全局扫描FACTORIES_RESOURCE_LOCATION public static final String FACTORIES_RESOURCE_LOCATION META-INF/spring.factories; springboot将会加载org.springframework.boot.autoconfigure.EnableAutoConfiguration所对应的所有自动配置到spring IOC容器中 自动配置如何生效 以org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration为例。 我们看到当前自动配置类核心在这几个注解。 Configuration
ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class,MultipartConfigElement.class })
ConditionalOnProperty(prefix spring.http.multipart, name enabled, matchIfMissing true)
EnableConfigurationProperties(MultipartProperties.class) Configuration spring注解配置类 ConditionalOnClass 意思是存在某个类当前配置生效 ConditionalOnProperty 意思是否存在开启的spring.http.multipart 的配置这里默认开启对应的是springboot主配置文件(application)文件中配置项目 EnableConfigurationProperties 意思是将MultipartProperties类加入spring容器等价于在MultipartProperties类上加 Component注解 我们去看一下MultipartProperties类是干什么了 ConfigurationProperties(prefix spring.http.multipart, ignoreUnknownFields false)
public class MultipartProperties { ConfigurationProperties 读取springboot主配置文件(application.prperties)的配置 所以最后发现只要满足Conditionalxxxx条件 当前自动配置类即可生效。 综上如果我们想知道引入的某个GAV可以配置哪些属性主需要找到对应的xxxAutoConfiguration 查看对应的 EnableConfigurationProperties(xxxx.class)引入的class即可。 转载于:https://www.cnblogs.com/gyjx2016/p/10588733.html