springboot自動配置原理(高低版本比較)spring.factories文件的作用

@SpringBootApplication
public class SpringSecurityApplication {public static void main(String[] args) {SpringApplication.run(SpringSecurityApplication.class, args);}}

注解@SpringBootApplication
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};

@AliasFor(annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};@AliasFor(annotation = ComponentScan.class,attribute = "basePackages"
)
String[] scanBasePackages() default {};@AliasFor(annotation = ComponentScan.class,attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};@AliasFor(annotation = ComponentScan.class,attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;@AliasFor(annotation = Configuration.class
)
boolean proxyBeanMethods() default true;

}

核心3個注解:
@SpringBootConfiguration     改注解和@Configuration類似,表面這個類是配置類
@EnableAutoConfiguration    springboot實現自動化配置的核心注解
@ComponentScan    默認掃描啟動類當前包以及子包要了解springboot自動配置原理當然我們需要看@EnableAutoConfiguration

在這2.4版本以前
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = “spring.boot.enableautoconfiguration”;

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

}

3.4.1版本
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = “spring.boot.enableautoconfiguration”;

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

}

開啟自動配置注解我們需要看這個注解做了什么事?
看上面的代碼我們可以發現一個關鍵的@import注解,
低版本:開啟導入自動配置選擇器:
源碼:
@Deprecated
public class EnableAutoConfigurationImportSelector extends AutoConfigurationImportSelector {public EnableAutoConfigurationImportSelector() {}protected boolean isEnabled(AnnotationMetadata metadata) {return this.getClass().equals(EnableAutoConfigurationImportSelector.class) ? (Boolean)this.getEnvironment().getProperty("spring.boot.enableautoconfiguration", Boolean.class, true) : true;}
}
``3.4.1版本
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {static final int ORDER = 2147483646;private static final AutoConfigurationEntry EMPTY_ENTRY = new AutoConfigurationEntry();private static final String[] NO_IMPORTS = new String[0];private static final Log logger = LogFactory.getLog(AutoConfigurationImportSelector.class);private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude";private final Class<?> autoConfigurationAnnotation;private ConfigurableListableBeanFactory beanFactory;private Environment environment;private ClassLoader beanClassLoader;private ResourceLoader resourceLoader;private volatile ConfigurationClassFilter configurationClassFilter;private volatile AutoConfigurationReplacements autoConfigurationReplacements;public AutoConfigurationImportSelector() {this((Class)null);}AutoConfigurationImportSelector(Class<?> autoConfigurationAnnotation) {this.autoConfigurationAnnotation = autoConfigurationAnnotation != null ? autoConfigurationAnnotation : AutoConfiguration.class;}public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return NO_IMPORTS;} else {AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}}public Predicate<String> getExclusionFilter() {return this::shouldExclude;}private boolean shouldExclude(String configurationClassName) {return this.getConfigurationClassFilter().filter(Collections.singletonList(configurationClassName)).isEmpty();}protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;} else {AnnotationAttributes attributes = this.getAttributes(annotationMetadata);List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);configurations = this.removeDuplicates(configurations);Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);this.checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = this.getConfigurationClassFilter().filter(configurations);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);}}public Class<? extends DeferredImportSelector.Group> getImportGroup() {return AutoConfigurationGroup.class;}protected boolean isEnabled(AnnotationMetadata metadata) {return this.getClass() == AutoConfigurationImportSelector.class ? (Boolean)this.getEnvironment().getProperty("spring.boot.enableautoconfiguration", Boolean.class, true) : true;}protected AnnotationAttributes getAttributes(AnnotationMetadata metadata) {String name = this.getAnnotationClass().getName();AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));Assert.notNull(attributes, () -> {String var10000 = metadata.getClassName();return "No auto-configuration attributes found. Is " + var10000 + " annotated with " + ClassUtils.getShortName(name) + "?";});return attributes;}protected Class<?> getAnnotationClass() {return EnableAutoConfiguration.class;}protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {ImportCandidates importCandidates = ImportCandidates.load(this.autoConfigurationAnnotation, this.getBeanClassLoader());List<String> configurations = importCandidates.getCandidates();Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring/" + this.autoConfigurationAnnotation.getName() + ".imports. If you are using a custom packaging, make sure that file is correct.");return configurations;}private void checkExcludedClasses(List<String> configurations, Set<String> exclusions) {List<String> invalidExcludes = new ArrayList(exclusions.size());Iterator var4 = exclusions.iterator();while(var4.hasNext()) {String exclusion = (String)var4.next();if (ClassUtils.isPresent(exclusion, this.getClass().getClassLoader()) && !configurations.contains(exclusion)) {invalidExcludes.add(exclusion);}}if (!invalidExcludes.isEmpty()) {this.handleInvalidExcludes(invalidExcludes);}}protected void handleInvalidExcludes(List<String> invalidExcludes) {StringBuilder message = new StringBuilder();Iterator var3 = invalidExcludes.iterator();while(var3.hasNext()) {String exclude = (String)var3.next();message.append("\t- ").append(exclude).append(String.format("%n"));}throw new IllegalStateException(String.format("The following classes could not be excluded because they are not auto-configuration classes:%n%s", message));}protected Set<String> getExclusions(AnnotationMetadata metadata, AnnotationAttributes attributes) {Set<String> excluded = new LinkedHashSet();excluded.addAll(this.asList(attributes, "exclude"));excluded.addAll(this.asList(attributes, "excludeName"));excluded.addAll(this.getExcludeAutoConfigurationsProperty());return this.getAutoConfigurationReplacements().replaceAll(excluded);}protected List<String> getExcludeAutoConfigurationsProperty() {Environment environment = this.getEnvironment();if (environment == null) {return Collections.emptyList();} else if (environment instanceof ConfigurableEnvironment) {Binder binder = Binder.get(environment);return (List)binder.bind("spring.autoconfigure.exclude", String[].class).map(Arrays::asList).orElse(Collections.emptyList());} else {String[] excludes = (String[])environment.getProperty("spring.autoconfigure.exclude", String[].class);return excludes != null ? Arrays.asList(excludes) : Collections.emptyList();}}protected List<AutoConfigurationImportFilter> getAutoConfigurationImportFilters() {return SpringFactoriesLoader.loadFactories(AutoConfigurationImportFilter.class, this.beanClassLoader);}private ConfigurationClassFilter getConfigurationClassFilter() {ConfigurationClassFilter configurationClassFilter = this.configurationClassFilter;if (configurationClassFilter == null) {List<AutoConfigurationImportFilter> filters = this.getAutoConfigurationImportFilters();Iterator var3 = filters.iterator();while(var3.hasNext()) {AutoConfigurationImportFilter filter = (AutoConfigurationImportFilter)var3.next();this.invokeAwareMethods(filter);}configurationClassFilter = new ConfigurationClassFilter(this.beanClassLoader, filters);this.configurationClassFilter = configurationClassFilter;}return configurationClassFilter;}private AutoConfigurationReplacements getAutoConfigurationReplacements() {AutoConfigurationReplacements autoConfigurationReplacements = this.autoConfigurationReplacements;if (autoConfigurationReplacements == null) {autoConfigurationReplacements = AutoConfigurationReplacements.load(this.autoConfigurationAnnotation, this.beanClassLoader);this.autoConfigurationReplacements = autoConfigurationReplacements;}return autoConfigurationReplacements;}protected final <T> List<T> removeDuplicates(List<T> list) {return new ArrayList(new LinkedHashSet(list));}protected final List<String> asList(AnnotationAttributes attributes, String name) {String[] value = attributes.getStringArray(name);return Arrays.asList(value);}private void fireAutoConfigurationImportEvents(List<String> configurations, Set<String> exclusions) {List<AutoConfigurationImportListener> listeners = this.getAutoConfigurationImportListeners();if (!listeners.isEmpty()) {AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, configurations, exclusions);Iterator var5 = listeners.iterator();while(var5.hasNext()) {AutoConfigurationImportListener listener = (AutoConfigurationImportListener)var5.next();this.invokeAwareMethods(listener);listener.onAutoConfigurationImportEvent(event);}}}protected List<AutoConfigurationImportListener> getAutoConfigurationImportListeners() {return SpringFactoriesLoader.loadFactories(AutoConfigurationImportListener.class, this.beanClassLoader);}private void invokeAwareMethods(Object instance) {if (instance instanceof Aware) {if (instance instanceof BeanClassLoaderAware) {BeanClassLoaderAware beanClassLoaderAwareInstance = (BeanClassLoaderAware)instance;beanClassLoaderAwareInstance.setBeanClassLoader(this.beanClassLoader);}if (instance instanceof BeanFactoryAware) {BeanFactoryAware beanFactoryAwareInstance = (BeanFactoryAware)instance;beanFactoryAwareInstance.setBeanFactory(this.beanFactory);}if (instance instanceof EnvironmentAware) {EnvironmentAware environmentAwareInstance = (EnvironmentAware)instance;environmentAwareInstance.setEnvironment(this.environment);}if (instance instanceof ResourceLoaderAware) {ResourceLoaderAware resourceLoaderAwareInstance = (ResourceLoaderAware)instance;resourceLoaderAwareInstance.setResourceLoader(this.resourceLoader);}}}public void setBeanFactory(BeanFactory beanFactory) throws BeansException {Assert.isInstanceOf(ConfigurableListableBeanFactory.class, beanFactory);this.beanFactory = (ConfigurableListableBeanFactory)beanFactory;}protected final ConfigurableListableBeanFactory getBeanFactory() {return this.beanFactory;}public void setBeanClassLoader(ClassLoader classLoader) {this.beanClassLoader = classLoader;}protected ClassLoader getBeanClassLoader() {return this.beanClassLoader;}public void setEnvironment(Environment environment) {this.environment = environment;}protected final Environment getEnvironment() {return this.environment;}public void setResourceLoader(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}protected final ResourceLoader getResourceLoader() {return this.resourceLoader;}public int getOrder() {return 2147483646;}protected static class AutoConfigurationEntry {private final List<String> configurations;private final Set<String> exclusions;private AutoConfigurationEntry() {this.configurations = Collections.emptyList();this.exclusions = Collections.emptySet();}AutoConfigurationEntry(Collection<String> configurations, Collection<String> exclusions) {this.configurations = new ArrayList(configurations);this.exclusions = new HashSet(exclusions);}public List<String> getConfigurations() {return this.configurations;}public Set<String> getExclusions() {return this.exclusions;}}private static class ConfigurationClassFilter {private final AutoConfigurationMetadata autoConfigurationMetadata;private final List<AutoConfigurationImportFilter> filters;ConfigurationClassFilter(ClassLoader classLoader, List<AutoConfigurationImportFilter> filters) {this.autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(classLoader);this.filters = filters;}List<String> filter(List<String> configurations) {long startTime = System.nanoTime();String[] candidates = StringUtils.toStringArray(configurations);boolean skipped = false;Iterator var6 = this.filters.iterator();int i;while(var6.hasNext()) {AutoConfigurationImportFilter filter = (AutoConfigurationImportFilter)var6.next();boolean[] match = filter.match(candidates, this.autoConfigurationMetadata);for(i = 0; i < match.length; ++i) {if (!match[i]) {candidates[i] = null;skipped = true;}}}if (!skipped) {return configurations;} else {List<String> result = new ArrayList(candidates.length);String[] var12 = candidates;int var14 = candidates.length;for(i = 0; i < var14; ++i) {String candidate = var12[i];if (candidate != null) {result.add(candidate);}}if (AutoConfigurationImportSelector.logger.isTraceEnabled()) {int numberFiltered = configurations.size() - result.size();AutoConfigurationImportSelector.logger.trace("Filtered " + numberFiltered + " auto configuration class in " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime) + " ms");}return result;}}}private static final class AutoConfigurationGroup implements DeferredImportSelector.Group, BeanClassLoaderAware, BeanFactoryAware, ResourceLoaderAware {private final Map<String, AnnotationMetadata> entries = new LinkedHashMap();private final List<AutoConfigurationEntry> autoConfigurationEntries = new ArrayList();private ClassLoader beanClassLoader;private BeanFactory beanFactory;private ResourceLoader resourceLoader;private AutoConfigurationMetadata autoConfigurationMetadata;private AutoConfigurationReplacements autoConfigurationReplacements;private AutoConfigurationGroup() {}public void setBeanClassLoader(ClassLoader classLoader) {this.beanClassLoader = classLoader;}public void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;}public void setResourceLoader(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector, () -> {return String.format("Only %s implementations are supported, got %s", AutoConfigurationImportSelector.class.getSimpleName(), deferredImportSelector.getClass().getName());});AutoConfigurationImportSelector autoConfigurationImportSelector = (AutoConfigurationImportSelector)deferredImportSelector;AutoConfigurationReplacements autoConfigurationReplacements = autoConfigurationImportSelector.getAutoConfigurationReplacements();Assert.state(this.autoConfigurationReplacements == null || this.autoConfigurationReplacements.equals(autoConfigurationReplacements), "Auto-configuration replacements must be the same for each call to process");this.autoConfigurationReplacements = autoConfigurationReplacements;AutoConfigurationEntry autoConfigurationEntry = autoConfigurationImportSelector.getAutoConfigurationEntry(annotationMetadata);this.autoConfigurationEntries.add(autoConfigurationEntry);Iterator var6 = autoConfigurationEntry.getConfigurations().iterator();while(var6.hasNext()) {String importClassName = (String)var6.next();this.entries.putIfAbsent(importClassName, annotationMetadata);}}public Iterable<DeferredImportSelector.Group.Entry> selectImports() {if (this.autoConfigurationEntries.isEmpty()) {return Collections.emptyList();} else {Set<String> allExclusions = (Set)this.autoConfigurationEntries.stream().map(AutoConfigurationEntry::getExclusions).flatMap(Collection::stream).collect(Collectors.toSet());Set<String> processedConfigurations = (Set)this.autoConfigurationEntries.stream().map(AutoConfigurationEntry::getConfigurations).flatMap(Collection::stream).collect(Collectors.toCollection(LinkedHashSet::new));processedConfigurations.removeAll(allExclusions);return this.sortAutoConfigurations(processedConfigurations, this.getAutoConfigurationMetadata()).stream().map((importClassName) -> {return new DeferredImportSelector.Group.Entry((AnnotationMetadata)this.entries.get(importClassName), importClassName);}).toList();}}private AutoConfigurationMetadata getAutoConfigurationMetadata() {if (this.autoConfigurationMetadata == null) {this.autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);}return this.autoConfigurationMetadata;}private List<String> sortAutoConfigurations(Set<String> configurations, AutoConfigurationMetadata autoConfigurationMetadata) {MetadataReaderFactory var10002 = this.getMetadataReaderFactory();AutoConfigurationReplacements var10004 = this.autoConfigurationReplacements;Objects.requireNonNull(var10004);return (new AutoConfigurationSorter(var10002, autoConfigurationMetadata, var10004::replace)).getInPriorityOrder(configurations);}private MetadataReaderFactory getMetadataReaderFactory() {try {return (MetadataReaderFactory)this.beanFactory.getBean("org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory", MetadataReaderFactory.class);} catch (NoSuchBeanDefinitionException var2) {return new CachingMetadataReaderFactory(this.resourceLoader);}}}
}

在這里插入圖片描述

對于spring.factories文件
3.4.1版本
# 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.OnWebApplicationCondition1.5.2版本
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnClassCondition

3.4.1版本可以看到,實現方式發生了變化,引入了配置類過濾器ConfigurationClassFilter來完成bean自動配置的加載
在這里插入圖片描述
調用getAutoConfigurationEntry來獲取要自動配置的類放入AutoConfigurationEntry對象,這個對象包含2個集合,一個是要自動配置的集合,一個是排除自動配置的集合
在這里插入圖片描述在這里插入圖片描述
spring會跟進這兩個集合完成自動配置

低版本的只需要讀取spring.factories文件,獲取自動配置類進行自動加載bean

spring.factories文件自動配置信息

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.CloudAutoConfiguration,\
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,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration總結:
1.通過@SpringBootConfiguration 引入了@EnableAutoConfiguration(負責啟動自動配置功能)
2.@EnableAutoConfiguration引入了@Import
3.Spring容器啟動時:加載loc容器時會解析@Import 注解
4.@lmport導入了一個deferredlmportSelector,它會使SpringBoot的自動配置類的順序在最后,這樣方便我們擴展和覆蓋?
5.然后讀取所有的/META-INF/spring.factories文件(SPI)
6.過濾出所有AutoConfigurtionClass類型的類
7.最后通過@Condition排除無效的自動配置類

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66598.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66598.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66598.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Websocket進行前后端實時通信

1、引入jar&#xff0c;spring-websocket-starter <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 2、配置websocket config import org.springframe…

vue2 - Day05 - VueX

Vuex 是 Vue.js 官方的狀態管理庫。它是一個讓你能在應用中集中管理共享狀態的工具。當應用的規模逐漸增大&#xff0c;組件之間的數據傳遞變得越來越復雜時&#xff0c;Vuex 就成為了救星&#xff0c;提供了一個集中式的存儲來管理所有的組件狀態&#xff0c;并且保證狀態以一…

中型項目中 HTTP 的挑戰與解決方案

一、引言 在當今數字化時代&#xff0c;HTTP&#xff08;超文本傳輸協議&#xff09;作為Web應用程序的基礎通信協議&#xff0c;在中型項目的開發中扮演著至關重要的角色。它為客戶端和服務器之間的數據傳輸提供了標準規范&#xff0c;使得各種類型的應用&#xff0c;從簡單的…

IDEA導入Maven工程不識別pom.xml

0 現象 把阿里 sentinel 項目下載本地后&#xff0c;IDEA 中卻沒顯示 maven 工具欄。 1 右鍵Maven Projects 點擊IDEA右側邊欄的Maven Projects&#xff0c;再點擊&#xff1a; 在出現的選擇框中選擇指定的未被識別的pom.xml即可&#xff1a; 2 Add as maven project 右鍵p…

VUE學習筆記(入門)5__vue指令v-html

v-html是用來解析字符串標簽 示例 <!doctype html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

OSPF的LSA的學習研究

OSPF常見1、2、3、4、5、7類LSA的研究 1、拓撲如圖&#xff0c;按照地址表配置&#xff0c;激活OSPF劃分相關區域并宣告相關網段 2、1類LSA&#xff0c;每臺運行了OSPF的路由器都會產生&#xff0c;描述了路由器的直連接口狀況和cost 可以看到R1產生了一條router lsa&#xff0…

小結:OSPF協議的工作原理

OSPF&#xff08;開放最短路徑優先&#xff09;優點&#xff1a; 快速收斂&#xff1a;OSPF的收斂速度較快&#xff0c;能迅速響應網絡拓撲變化&#xff0c;并在發生故障后快速更新路由信息。 支持大規模網絡&#xff1a;OSPF適合大型網絡&#xff0c;可以通過劃分區域來減少網…

TypeScript - 利用GPT輔助學習

TypeScript 一、基礎1. 安裝 TypeScript2. 創建你的第一個 TypeScript 文件3. 編譯 TypeScript 代碼4. 變量聲明與類型注解5. 函數與類型注解6. 總結 二、進階常用類型1. 類型別名2. 對象類型3. 類型斷言4.typeof 操作符 高級類型1. 類2. 交叉類型3. 泛型與 keyof4. 索引簽名類…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一種協議&#xff0c;用于在Web應用程序和服務器之間建立實時、雙向的通信連接。它通過一個單一的TCP連接提供了持久化連接&#xff0c;這使得Web應用程序可以更加實時地傳遞數據。WebSocket協議最初由W3C開發&#xff0c;并于2…

stm32 no connect target

解決 STM32 報錯 “no target connected” 的方法 前言 stm32最小系統在下載程序是一直報錯&#xff1a;no target connected&#xff0c;試了很多辦法成功不了&#xff0c;最后將芯片擦除了才成功。 一、問題描述 當時是寫flash的時候寫到ST Link 存儲的地方了。 之后就不…

element的el-form-item的prop作用

這個在elemenui中介紹比較簡單&#xff0c;一般寫的時候照著例子寫&#xff0c;會正常運行。沒太注意porp到底有啥影響點。這次有點時間整理一下。 這個https://worktile.com/kb/p/3534641鏈接講述的要比一般csdn上的文章清晰。 總結&#xff1a; Vue表單驗證中的prop屬性用于指…

Open3D計算點云粗糙度(方法一)【2025最新版】

目錄 一、Roughness二、代碼實現三、結果展示博客長期更新,本文最近更新時間為:2025年1月18日。 一、Roughness 通過菜單欄的Tools > Other > Roughness找到該功能。 這個工具可以估計點云的“粗糙度”。 選擇一個或幾個點云,然后啟動這個工具。 CloudCompare只會詢問…

窺探QCC518x/308x系列與手機之間的藍牙HCI記錄與分析 - 手機篇

今天要介紹給大家的是, 當我們在開發高通耳機時如果遇到與手機之間相容性問題, 通常會用Frontline或Ellisys的Bluetooth Analyzer來截取資料分析, 如果手邊沒有這樣的儀器, 要如何窺探Bluetooth的HCI log.這次介紹的是手機篇. 這次跟QCC518x/QCC308x測試的手機是Samsung S23 U…

【論文投稿】Python 網絡爬蟲:探秘網頁數據抓取的奇妙世界

目錄 前言 一、Python—— 網絡爬蟲的絕佳拍檔 二、網絡爬蟲基礎&#xff1a;揭開神秘面紗 &#xff08;一&#xff09;工作原理&#xff1a;步步為營的數據狩獵 &#xff08;二&#xff09;分類&#xff1a;各顯神通的爬蟲家族 三、Python 網絡爬蟲核心庫深度剖析 &…

前端炫酷動畫--圖片(一)

目錄 一、四角線框的跟隨移動 二、元素倒影(-webkit-box-reflect) 三、模特換裝(maskblend) 四、元素平滑上升 五、無限視差滾動 六、判斷鼠標進入方向(輪播方向) 七、環形旋轉效果 八、黑白小球交替旋轉 九、hover時圓形放大 十、畫一棵隨機樹(canvas) 十一、代碼雨…

STL--list(雙向鏈表)

目錄 一、list 對象創建 1、默認構造函數 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷貝構造函數 二、list 賦值操作 1、賦值 2、assign&#xff08;迭代器1&#xff0c;迭代器2&#xff09; 3、assign&#xff08;初始化列表&#xff09; 4、assig…

【語言處理和機器學習】概述篇(基礎小白入門篇)

前言 自學筆記&#xff0c;分享給語言學/語言教育學方向的&#xff0c;但對語言數據處理感興趣但是尚未入門&#xff0c;卻需要在論文中用到的小伙伴&#xff0c;歡迎大佬們補充或繞道。ps&#xff1a;本文不涉及公式講解&#xff08;文科生小白友好體質&#xff09;&#xff…

小程序獲取微信運動步數

1、用戶點擊按鈕&#xff0c;在小程序中觸發getuserinfo方法&#xff0c;獲取用戶信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">獲取</button&…

leetcode——找到字符串中所有字母異位詞(java)

給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 示例 1: 輸入: s "cbaebabacd", p "abc" 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 "cba", 它是 "…

LDN的藍牙雙模鍵盤幫助文檔

文檔索引 已支持的PCB列表(僅列出少部分)&#xff1a;鍵盤特性硬件軟件鍵盤以及驅動藍牙模式USB模式 驅動功能介紹主界面鍵盤列表頁面鍵盤配置&#xff08;使用雙模鍵盤的請務必細看本說明&#xff09;功能層配置(改鍵)觸發層配置(改FN鍵等觸發功能)功能選擇&#xff08;重要&a…