@EnableAutoConfiguration原理分析
EnableAutoConfigurationの役割は、Springの設定を自動的にロードできるようにすることです@ @SpringBootApplicationは、@EnableAutoConfiguration注釈が含まれています。
これは一見方法の柔軟性を低下させるが、SpringBootが大きく、開発プロセスを簡素化し、コアビューは契約が設定よりも大きいことであるSpringBoot。この規則は、視点を達成するためにSpringBootあるデフォルトの設定パラメータの数を提供し、その後の質問は、SpringBootは、どのように自動的にデフォルトのパラメータを設定する場所のこれらのデフォルトの設定パラメータを格納していますか?
実際には、スターターのSpringBoot多くは実装の原則の先頭に@Enableノートを持っているが、非常に似ているところ、この注釈の原則を初めて目。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
ここでは、@EnableAutoConfigurationは@importがAutoConfigurationImportSelectorクラスを追加使用して見ることができ、Spring構成は、自動的にオブジェクトに依存するコア機能の中に注入されます。
このクラスで、が設けられているgetCandidateConfigurations()
コンフィギュレーションファイルをロードするための方法。ツールSpringFactoriesでは春はloadFactoryNames()コンフィギュレーションファイルをロードする方法を提供します。デフォルトのスキャンパスが配置されているMETA-INF/spring.factories
中で。
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
# 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,\
...
コンフィギュレーション情報の上部のみ。等号の左側に対応するインターフェイスコンフィギュレーションであり、右のクラスに。我々は、特にこれらのクラスをロードする方法を見て。
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
MultiValueMap<String, String> result = cache.get(classLoader);
if (result != null) {
return result;
}
try {
// 从META-INF/spring.factories中加载urls。
Enumeration<URL> urls = (classLoader != null ?
classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
result = new LinkedMultiValueMap<>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
UrlResource resource = new UrlResource(url);
// 从文件中加载配置
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
for (Map.Entry<?, ?> entry : properties.entrySet()) {
String factoryClassName = ((String) entry.getKey()).trim();
for (String factoryName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
result.add(factoryClassName, factoryName.trim());
}
}
}
// 添加到缓存中防止重新加载
cache.put(classLoader, result);
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load factories from location [" +
FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}
最後に、返される結果は、構造に対応する実際のMETA-INF / spring.factoriesマップデータです。これは実際にそうで、リスナーの一部を含むSpring構成を通じて、各クラスの完全なクラス名を、保存したフィルタおよびマッピングします。クラスをロードするための最初のステップは、クラスに対応する完全なクラス名に、および特定のロード処理の後に取得することです実際には導入しないように注意ここでは、特定のSpringApplicationによって行われ、私たちは、私たちの優先事項に戻る方法自動負荷設定。spring.factoriesではちょうど、私たちは、次の要素を見て:
# 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,\
...
ここではお馴染みの名前の多くを見ることができ、Aopとは、ウサギは、そのため非常に多く、それが自動的に設定が、我々がするために使用される単純な設定よりもはるかにあるロードと思われ、SpringBootは、クラスで使用可能なすべての設定をロードします。ここで最初のオープンRabbitAutoConfiguration馴染みの表情。
@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {
これは、私たちが一つ一つを見て、トップクラスのノートの多くを追加します。
- @Configuration:私たちは、これは、構成クラスであることを示し、このコメントに非常に精通しています。
- @ConditionalOnClass():このコメントは、入力クラスの番号であり、この構成は、クラススイッチに相当し、それ以外の場合は、インスタンス化されない、構成クラスの入力があったときに検出クラスを有効にする場合、追加します。それはそこにあなたのプロジェクトが対応する依存関係が自動的に開き、構成クラスであれば、これは非常に有益なコメントで、あります。
- @EnableConfigurationProperties():コメントを有効に@ConfigurationProperties
- @import(RabbitAnnotationDrivenConfiguration.class):アノテーションベースの構成クラスを導入
役割@ConfigurationPropertiesを不思議に思われるかもしれませんあなたの上に注釈では、ここでは、対応するRabbitPropertiesの具体的な実現を見てください。
@ConfigurationProperties(prefix = "spring.rabbitmq")
public class RabbitProperties {
/**
* RabbitMQ host.
*/
private String host = "localhost";
/**
* RabbitMQ port.
*/
private int port = 5672;
/**
* Login user to authenticate to the broker.
*/
private String username = "guest";
...
全体的に、全体は、おそらく初期値を設定されているそのうちのいくつかのRabbitMQのパラメータを含んでPOJOクラスRabbitProperies、ですが、私たちは道をカスタマイズするために、直接クラスの初期設定の値は困難であり、これらの変更設定パラメータは、このクラス()コメントで@ConfigurationPropertiesを使用しています。
@ConfigurationProperties(perfix =「spring.rabbitmq」)関数は、指定されたプレフィックスSpring構成の構成からロードされ、自動的に対応するメンバ変数に設定されています。それは、この方法でも、自動注入の実際の構成です。
概要
ここでは、私たちが実際に@EnableAutoConfigurationからこの注釈を開始する必要があり、全体のプロセスの分析が自動的に設定します。単に上部に再度処理を繰り返します。
@ EnableAutoConfiguration-> AutoConfigurationImportSelector-> spring.factories-> EnableAutoConfiguration-> RabbitAutoConfiguration(具体的配置类) - > @ EnableConfigurationProperties-> RabbitProperties(具体的配置类) - > ConfigurationProperties(接頭辞= "spring.rabbitmq")@
負荷の上に層を通じ、我々は簡単に自動注入の構成を実装することができます。このプロセスは複雑ではない、次はスターターが自分のクラスを達成するため、上記の手順に従うことを試みます。