Webアプリケーションを開発するspringbootを使用することは非常に便利ですが、唯一のGAVはspringbootのデフォルトの設定は、私たちに、より良い共通の構成を支援する、対応する機能を使用することができ、対応する導入する必要があります。だから、springbootはそれを行う方法です?この記事では最後にspringbootを見るために、ソースコードをステップ実行します自動設定を行うために私たちを助ける方法です。
springbootコアノート
@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 List<String> 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;
}
ここでの方法は、2つのコアメソッドと呼ば
1、getSpringFactoriesLoaderFactoryClass()、我々はリターンがEnableAutoConfiguration.classであることがわかり
2、loadFactoryNamesこの方法
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
List<String> result = new ArrayList<String>();
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);
}
}
先获取factoryClass(EnableAutoConfiguration)的クラス名(org.springframework.boot.autoconfigure.EnableAutoConfiguration)
プロパティのキー値としてクラス名これは、値を取得します。springboot defaultグローバルスキャンFACTORIES_RESOURCE_LOCATION
springbootは、すべての自動ばねIOCコンテナに対応する(org.springframework.boot.autoconfigure.EnableAutoConfiguration)をロードします
どのように自動設定を有効にするには
以(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春のコンフィギュレーション・クラスのノート
クラスの存在を意味@ConditionalOnClass、現在の設定を有効にします
コンフィギュレーションを開くかどうかspring.http.multipartの@ConditionalOnPropertyの意味は、ここでの主な設定ファイル(アプリケーション)ファイルの設定項目をspringbootに対応し、デフォルトで有効になって存在します
@EnableConfigurationPropertiesはMultipartPropertiesクラス@Componentに加えアノテーションに、クラスMultipartPropertiesスプリングコンテナと同等添加されることを意味します
私たちは、クラスがやっているルックMultipartPropertiesを取りますか?
@ConfigurationProperties(prefix = "spring.http.multipart", ignoreUnknownFields = false)
public class MultipartProperties {
@ConfigurationPropertiesは、構成springbootメインの設定ファイル(application.prperties)の読み
だから、最終的に私たちを有効にするには、限り@Conditionalxxxx条件として、現在のクラスの自動設定を見つけました。
我々が設定することができますGAVの導入をどの属性を知りたい場合は、要約すると、主な必要性はxxxAutoConfigurationを対応する対応ビューを見つけるために
(xxxx.class)@EnableConfigurationPropertiesクラスに導入することができます。
ます。https://www.jianshu.com/p/ad21f8e65c7aで再現