前面说了Springboot的加载位置,我们可以在这四个位置写配置文件,也可以外部配置来进行加载,我们的配置也可以写在外部的这些来源里边,那么他们都能正常工作,而我们演示是从server.port为例的,我们调整服务器的端口,但是到底我们这个配置文件里边,能编写哪些配置,每个配置又能怎么写,包括自动配置,自动配置原理又是什么呢,我们接下来就来仔细解释一下,自动配置的原理,我们来到SpringBoot的官方文档,最后一章有一个Common PropertiesAppendix A. Common application properties哪些配置能够在application.properties/application.yml 中指定呢,他列举了每一个属性,https://docs.spring.io/spring-boot/docs/1.5.22.RELEASE/reference/html/common-application-properties.html包括属性的解释,全都在这,大家可以看他,配置文件能够配置的属性参照,我们就来参照这一块,其实这么多的配置,如果靠我们来记,或者是参照文档,其实这样都比较麻烦,只有我们真正研究透原理以后,我们才能随心所欲的应用,那我们就来说一下他的自动配置原理,这自动配置原理非常的关键,只要我们懂了他,从第一步开始说,当我们SpringBoot应用启动的时候,我们从主方法里面进行启动的,主要我们加载了SpringBoot这个配置类,他里面最重要的一个功能,就是开启了自动配置@EnableAutoConfiguration,SpringBoot启动的时候,加载主配置类,开启了自动配置功能,所谓的自动配置功能呢,就是这个注解,而这个注解的作用呢,它是非常重要的,这个注解开启自动配置,他主要利用这个选择器@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {给我们Springboot中导入一些组件,利用EnableAutoConfigurationImportSelector,给容器中导入一些组件,导入了哪些组件呢,@Import就是给容器中导组件,导入哪些组件要看他,点进来@Deprecated
public class EnableAutoConfigurationImportSelectorextends AutoConfigurationImportSelector {@Overrideprotected boolean isEnabled(AnnotationMetadata metadata) {if (getClass().equals(EnableAutoConfigurationImportSelector.class)) {return getEnvironment().getProperty(EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class,true);}return true;}}我来看他的父类AutoConfigurationImportSelector父类里面定义了一个方法,叫做selectImports@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}try {AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AnnotationAttributes attributes = getAttributes(annotationMetadata);List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);configurations = removeDuplicates(configurations);configurations = sort(configurations, autoConfigurationMetadata);Set<String> exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = filter(configurations, autoConfigurationMetadata);fireAutoConfigurationImportEvents(configurations, exclusions);return configurations.toArray(new String[configurations.size()]);}catch (IOException ex) {throw new IllegalStateException(ex);}
}我们就知道导入哪些内容了,这里主要有一个configurations最终会被返回,List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);这个我们再来回顾一遍,然后它是获取候选的配置,他导哪些组件,通过这个方法获取来的,这个方法的作用我们来看一下,点进来/*** Return the auto-configuration class names that should be considered. By default* this method will load candidates using {@link SpringFactoriesLoader} with* {@link #getSpringFactoriesLoaderFactoryClass()}.* @param metadata the source metadata* @param attributes the {@link #getAttributes(AnnotationMetadata) annotation* attributes}* @return a list of candidate configurations*/
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;
}利用SpringFactoriesLoader.loadFactoryNames,他从类路径下得到一个资源/*** Load the fully qualified class names of factory implementations of the* given type from {@value #FACTORIES_RESOURCE_LOCATION}, using the given* class loader.* @param factoryClass the interface or abstract class representing the factory* @param classLoader the ClassLoader to use for loading resources; can be* {@code null} to use the default* @see #loadFactories* @throws IllegalArgumentException if an error occurs while loading factory names*/
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 factoryClassNames = properties.getProperty(factoryClassName);result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));}return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);}
}classLoader.getResources(FACTORIES_RESOURCE_LOCATION),得到什么资源呢,它是扫描所有jar包类路径下的这个文件/*** The location to look for factories.* <p>Can be present in multiple JAR files.*/
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";类路径下的META-INF/spring.factories,扫描这个文件的作用是什么,他在这个方法里面说了,/*** Load the fully qualified class names of factory implementations of the* given type from {@value #FACTORIES_RESOURCE_LOCATION}, using the given* class loader.* @param factoryClass the interface or abstract class representing the factory* @param classLoader the ClassLoader to use for loading resources; can be* {@code null} to use the default* @see #loadFactories* @throws IllegalArgumentException if an error occurs while loading factory names*/
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 factoryClassNames = properties.getProperty(factoryClassName);result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));}return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);}
}Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION),把url得到,然后把每一个遍历,最终把这些整成Property文件,把扫描到的这些文件的内容,包装成properties对象,这些文件最终是Properties对象,然后他从properties里面获取一些值,加到最终要返回的结果里面,就是我们传过来的class类名,而传过来的class,/*** Return the class used by {@link SpringFactoriesLoader} to load configuration* candidates.* @return the factory class*/
protected Class<?> getSpringFactoriesLoaderFactoryClass() {return EnableAutoConfiguration.class;
}他叫EnableAutoConfiguration,这就是我们以前说过的,从properties中获取到这个类的值,应该是类名对应的值,然后把他们添加到容器中,我们按照这个意思,springboot里面没有"META-INF/spring.factories",而我们在第二个jar包里面,找到了,它里面有EnableAutoConfigurationspring-boot-autoconfigure/1.5.12.RELEASE/spring-boot-autoconfigure-1.5.12.RELEASE-sources.jarorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\所以相当于把我们这些组件,拿到了容器中,这个东西一句话,将类路径下,spring.factories里面配置的所有EnableAutoConfiguration的值,加入到了容器中,所以我们容器中最终要添加很多的类

# 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.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
它会把这些值加载进来,每一个这样的,xxAutoConfiguration都是容器的组件,都加入到容器中,用他们来做自动配置,这就是我们自动配置的开始,只有这些自动配置类进入到容器中以后,接下来自动配置类才会起作用,每一个自动配置类,进行自动配置功能,什么是自动配置功能呢,我们以一个为例,我们就不看这么多了,HttpEncodingAutoConfiguration,我们以他为例,来解析自动配置原理,自动配置原理是什么呢,我们这个类一进来以后呢,@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class)
@ConditionalOnWebApplication
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {标了一大堆的注解,看下这堆的注解,首先Configuration,表示这是一个配置类,就是我们以前写的配置文件一样,也可以给容器中添加组件,@EnableConfigurationProperties,启用ConfigurationProperties功能,为什么要启用这个功能呢,后边有一个类,就是启用指定的ConfigurationProperties功能,我们就发现这个类上标了@ConfigurationProperties注解/*** Configuration properties for http encoding.** @author Stephane Nicoll* @author Brian Clozel* @since 1.2.0*/
@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties {而这个注解我们都知道,他就是从配置文件中获取指定的值,和bean的属性进行绑定,所以我们首先看第一个,我们配置文件中该配什么,我们就按照他的旨意,他要配置spring.http.encoding,他能配这个属性,属性里面配什么值都可以归属到propertie类中,所有在配置文件中,都在xxxProperties类中封装着,我们就以他为例,所以配置文件,配置什么,就可以参照某一个功能,对应的这个属性类,比如看我们的这个功能,他就叫HTTP的编码自动配置,帮我们来解决编码问题的,有了这个注解以后,相当于与配置文件中的类关联起来了@EnableConfigurationProperties(HttpEncodingProperties.class)讲配置文件中对应的值和HttpEncodingProperties绑定起来了,其实就是这个JAVABEAN对象,他还有一个注解,@ConditionalOnWebApplication,翻译过来,他要考虑,WebApplication,Spring底层有一个Conditional注解,他的这个作用呢,根据咱们不同的条件,然后我们可以自己来进行条件判断,如果满足指定的条件,我们接下来整个配置类,才会生效,所以他是按照条件进行判断的,他的这个判断翻译过来就是,他判断当前是不是WEB应用,如果是当前WEB类生效,如果不是那就不行了,第二个还是一个判断,@ConditionalOnClass(CharacterEncodingFilter.class),我们jar包里面有没有这个类,判断当前项目有没有这个类,就是这个CharacterEncodingFilter,这个filter其实大家都知道,是SpringMVC,进行乱码解决的过滤器,乱码的时候我们配一个这个filter就行了,但是我们以前filter是配置在web.xml中,然后让他起作用的,看我们这个类里面有没有这个过滤器,第三个条件是@ConditionalOnProperty,判断我们配置文件中是否存在,某个配置,存在哪个配置,spring.http.encoding.enabled,是不是存在这个配置,这里还有一个matchIfMissing,如果不存在也认为是正确的,@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)相当于condition会返回true或者false,然后只要判断成立了,接下来就生效了,即使我们的配置文件中不配置,spring.http.encoding.enabled这个属性,即使不配置也是默认生效的,这就是matchIfMissing,自动配置类一句话解释,根据当前不同的条件,看 我们当前是不是WEB应用,是不是类里面有这个类,是不是有了这些配置,根据当前不同的条件判断,决定这个配置类是否生效,如果一旦生效了,判断都成功了,自动配置HttpEncodingAutoConfiguration的,如果配置类生效了,@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));return filter;
}@Bean啥意思,给容器中添加一个组件,我们以前用过这种模式,添加哪个组件,就是我们自己来new OrderedCharacterEncodingFilter,这个filter里面要获取字符集的名字,你是UTF8编码,还是什么编码,他要重properties里面获取,这个组件的某些值,需要从properties中获取,private final HttpEncodingProperties properties;properties属性它是HttpEncodingProperties,而我们这个HttpEncodingProperties以前也知道,他已经和Springboot的配置文件映射了,我们这个对象的值,它是获取配置文件中的值的@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties {我们在配这个filter,从这里面获取的,我们这个HttpEncodingAutoConfiguration呢,用一个有参构造器public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {this.properties = properties;
}一个有参构造器的情况下,我们这个参数的值,就会从容器中拿,相当于前边的@EnableConfigurationProperties(HttpEncodingProperties.class)这个注解,就是把HttpEncodingProperties和配置文件绑定起来,并把HttpEncodingProperties放到如IOC容器中,加入到Spring的容器中,自动配置类通过有参构造器,把我们这个属性拿来,而我们的这个属性已经和properties映射了,这样到底要用什么编码,就是拿到我们这个类里面的属性,所以我们springboot能配啥,他要设置编码,this.properties.getCharset().name(),有一个属性叫做name,以此类推,我们就可以配一个spring.http.encoding.enabled=true就是相当于我们之前的判断属性,spring.http.encoding.charset=UTF-8实际上要配charset里面的name,spring.http.encoding.force= #
Force the encoding to the configured charset on HTTP requests and responses.是不是进行强制编码,是不是我们的请求响应一定要编程UTF8,所以我们能够配置哪些,都是来自于properties,我们能配置的属性都是来源于properties类,我们properties类来封装这个配置,这是我们自动配置的这两项,有了我们这个自动配置类,我们自动配置类就给这个容器加这个filter,这个filter就会起作用了,首先它会根据当前不同的条件判断,决定这个配置类是否生效,一旦这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性,是从对应的properties类中获取的,而这些类里面的属性,我们encoding用什么,是从properties中获取的,properties里面的每一个属性,又是和配置文件绑定的,我们能配哪些,就是看我们自动配置功能的这个类,这个其实就是SpringBoot的整个精髓,你要用好Springboot,怎么用呢,你把我这一点,SpringBoot启动会加载大量的自动配置类,所以说我们要做的就是,我们看我们需要的功能,有没有Springboot默认写好的自动配置类,我们再来看这个自动配置类中,到底配置了哪些组件,SpringBoot给我们容器中添加了哪些组件,我们要用的组件有,我们就不需要再来配置了,但是如果说没有,我们当然需要自己来写一个配置类,给容器中添组件的时候,会从properties类中获取属性,而这些属性呢,我们就可以在配置文件中指定这些属性的值,也就是说他跟配置文件绑定的,这就是springboot的精华,那我们要用起来springboot,springboot有非常多的这种模式,xxxxAutoConfiguration,他就是用来做自动配置的类,然后他会给容器中添加组件,然后也会有个xxxxProperties,他来封装配置文件中相关的属性,每一个功能都如此,springboot设计的也是非常清晰的
比如还有数据源的自动配置,比如还有缓存的,@Configuration
@ConditionalOnClass(CacheManager.class)
@ConditionalOnBean(CacheAspectSupport.class)
@ConditionalOnMissingBean(value = CacheManager.class, name = "cacheResolver")
@EnableConfigurationProperties(CacheProperties.class)
@AutoConfigureBefore(HibernateJpaAutoConfiguration.class)
@AutoConfigureAfter({ CouchbaseAutoConfiguration.class, HazelcastAutoConfiguration.class,RedisAutoConfiguration.class })
@Import(CacheConfigurationImportSelector.class)
public class CacheAutoConfiguration {属性值获取,就有CacheProperties/*** Configuration properties for the cache abstraction.** @author Stephane Nicoll* @author Eddú Meléndez* @since 1.3.0*/
@ConfigurationProperties(prefix = "spring.cache")
public class CacheProperties {那么能配哪些,就配指定的这个,这就是我们自动配置的原理

springboot帮我们自动配置了什么,如果没有我自己添加,如果有,用他的,如果哪些属性不满意,我们就在属性文件里面配置

SpringBoot_配置-自动配置原理相关推荐

  1. vue动态全局组件配置 自动配置全局组件

    新建文件 _globals.js和 components-global 文件夹 _globals.js配置如下: import Vue from 'vue' const requireComponen ...

  2. SpringBoot_入门-HelloWorld细节-自动配置

    前面分析了pom文件的父依赖,以及starter场景启动器,下面说一下helloworld主程序,这个主程序我们只要运行main方法就行了,但是运行main方法要注意,我们spring应用run的时候 ...

  3. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  4. spring boot 核心_SpringBoot 核心技术 — 自动配置

    SpringBoot 能实现快速开发和部署的需求,越来越流行. 约定优于配置 SpringBoot 重要概念之一 约定优配置.这是一种开发模式吧,按照行业的规则,规定,减少不必要的开发. 如: 驼峰规 ...

  5. [工具向]__androidstudio签名打包apk及配置自动签名

    前言 好几天了,没怎么更新了,最近迷上了抓妖,有些懈怠了,这两天在看android的一些东西,java暂时就先放了放,昨天终于是完成了一个小阶段的任务,今天来对这两天的东西进行一下总结. *** 因为 ...

  6. 《Spring Boot官方文档》16. 自动配置

    16. 自动配置 Spring Boot的自动配置会尝试根据你添加进来的jar依赖来自动配置你的Spring应用.例如,如果HSQLDB在你的classpath路径上,你没有手动配置任何数据库连接实体 ...

  7. SpringBoot_数据访问-JDBC自动配置原理

    整合最基本的JDBC和数据源,第一个MYSQL,导入mysql驱动的,第二个我们使用原生的JDBC,后面使用Mybatis和JPA再选相应的内容就行了,为了演示方便我也把WEB模块选中,我们在pom文 ...

  8. SpringBoot自动配置的原理及实现

    SpringBoot的核心就是自动配置,自动配置是基于条件判断配置Bean 自动配置的源码在spring-boot-autoconfigure-2.2.13.RELEASE SpringBoot运行原 ...

  9. Spring Boot 面试杀手锏:自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如 ...

最新文章

  1. DotNet 项目开发文档的自动生成和相关工具的使用
  2. VC++大数据量绘图时无闪烁刷屏技术实现
  3. linux 好用的命令积累
  4. linux 安装 Elasticsearch6.4.0详细步骤以及问题解决方案
  5. python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码
  6. 设计模式学习笔记-代理模式
  7. SQLAlchemy 操作数据库
  8. mysql并发获取唯一数值_高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]...
  9. 渐进式web应用程序_如何在渐进式Web应用程序中添加到主屏幕
  10. 冻结和只读取当前对象的属性,不读取对象原型的属性
  11. 输入两个长度相同的字符串,比较两个数在相同位置的字符是否相同
  12. WPF DataGrid 样式分享
  13. 用 ABAP 新建本地 Excel 文件并写入数据试读版
  14. java小球与小球碰撞_Java实现小球间的弹性碰撞(考虑小球质量)
  15. expected primary-expression before ‘int‘
  16. linux ipsec racoon工具移动客户端模式详细配置
  17. ps 如何使用钢笔工具抠图
  18. 按键精灵:函数之可选参数
  19. android之模拟手机助手下载
  20. 开发常用镜像资源替换为国内开源镜像(yum,compose,maven,docker,android sdk,npm,国内开源镜像汇总)...

热门文章

  1. NSObject中的performSelector用法简介
  2. 文件修改如何简单修改Android的so文件
  3. WCF 异常(原创:灰灰虫的家http://hi.baidu.com/grayworm)
  4. 深复制VS浅复制(MemberwiseClone方法介绍)
  5. Properties类详细解析
  6. Android动画之Property属性动画
  7. 第一次打开Lightroom时的基本设置
  8. RabbitMQ之主题(Topic)
  9. hibernate 与 spring 松散配置的问题
  10. 10个用于处理日期和时间的 Python 库