pom.xml
Q:为什么导入依赖不需要指定版本号?
所有springboot项目都继承了一个父工程,在父工程中,指定了所有启动器依赖的版本号
![](https://img.haomeiwen.com/i22864240/74d657b0882acfdc.png)
![](https://img.haomeiwen.com/i22864240/858a930e3e67c313.png)
![](https://img.haomeiwen.com/i22864240/fb8e0afd2f3a5179.png)
当然,若依赖的版本没有被声明,还是需要手动添加版本号
Q:资源过滤在何处配置的?
在第一层父工程中,进行了资源过滤的配置
![](https://img.haomeiwen.com/i22864240/d17c6e1d965cdd94.png)
Q:如何将项目打包
在pom.xml添加这段配置,就可以是用将项目打包的功能,在maven的生命周期操作中
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
![](https://img.haomeiwen.com/i22864240/d026a3d87ec0cc64.png)
启动器
Q:什么是启动器?
启动器就是spring-boot-starter:springboot的场景启动器,例如
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web就会帮我们导入正常运行web环境需要的依赖
springboot将各种使用场景抽取成了一个个不同的启动器(starter),需要使用时,导入对应的starter,就会自动导入环境运行需要的依赖,且版本由springboot自动控制
主程序
![](https://img.haomeiwen.com/i22864240/17cf050435861f8e.png)
@SpringBootApplication标注在一个类上,声明这个类是springboot的主配置类,springboot运行这个类的main方法来启动springboot应用
![](https://img.haomeiwen.com/i22864240/e47d6b8f24c118b0.png)
@SpringBootApplication解析:
- @SpringBootConfiguration:该注解标注的类是springboot的配置类
![](https://img.haomeiwen.com/i22864240/31f8dbff197bc794.png)
-
@Configuration:该注解标注的类是spring的配置类,配置类就是容器中的一个组件
@Configuration
- @EnableAutoConfiguration:开启自动配置功能
@EnableAutoConfiguration
-
@AutoConfigurationPackage:自动扫描包
@AutoConfigurationPackage
1、@Import(AutoConfigurationPackages.Registrar.class):是用import注解(等于spring配置文件中的<import>),引入了一个组件
Registrar
主配置类
![](https://img.haomeiwen.com/i22864240/6bda56acb9689eda.png)
将主配置类(SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描到spring容器中
主程序总结:
- @SpringBootApplication标注在一个类上,声明这个类是springboot的主配置类,springboot运行这个类的main方法来启动springboot应用
- @SpringBootConfiguration,将主配置类(SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描到spring容器中
- @EnableAutoConfiguration:开启自动配置功能,给容器中导入当前场景所需要的所有组件,并配置好这些组件
resources文件夹
- static:保存所有静态资源:css、js、images……
- templates:保存所有的模板页面:freemarker、thymeleaf……
- application.properties:springboot的配置文件
自动配置原理
第一步:
首先从主配置类入手,主配置类只用了@SpringBootApplication这个注解,才成为了主配置类,奥秘都在这里,点进去看原码
![](https://img.haomeiwen.com/i22864240/a401175fcd8ffd5f.png)
注意@EnableAutoConfiguration这个注解,他直译过来就是自动配置的意思,所以自动配置的奥秘,在它里面,点进去看源码,可以看到他的原码不复杂,但是他引用了这个配置类
![](https://img.haomeiwen.com/i22864240/a41cb689dfdfea56.png)
看名称,这是一个扫描器,似乎是为了扫描什么东西,点进去看一看
![](https://img.haomeiwen.com/i22864240/94a3e1a29a878475.png)
可以看到一个名为扫描器的方法,奥秘就在这个方法中,它调用了getAutoConfigurationEntry这个方法,这个方法中,有一个名为configurations从创建之后,几乎每一步都是用到了他
![](https://img.haomeiwen.com/i22864240/ac21addc401fce6c.png)
这一定是一个很重要的集合,打个断点看看他里面有啥,可以看到,他的两个参数中,annotationMetadata这个参数找到了类路径下装载所有自动加载类的包
![](https://img.haomeiwen.com/i22864240/58a7dc729d98ed24.png)
看来奥秘就在这里面,我们在点进这个方法看看,可以发现十分重要的configurations集合,是通过loadFactoryNames这个方法获得的
![](https://img.haomeiwen.com/i22864240/61ef1a918b1dd0f7.png)
在点进去看看
![](https://img.haomeiwen.com/i22864240/98c581566262a71a.png)
loadSpringFactories通过两个类加载器,加载了一些东西,这些东西是什么呢?
![](https://img.haomeiwen.com/i22864240/509f14e2e8565f51.png)
正式类路径下存放所有自动配置类的包,loadSpringFactories读取到这些包,封装成properties文件,返回给一个map集合,而这个map集合中就有最重要的那个list集合,返回之前的getCandidateConfigurations方法,看看是如何操作这些自动配置类的
![](https://img.haomeiwen.com/i22864240/043f22e6ab561135.png)
可见在方法中使用了getSpringFactoriesLoaderFactoryClass类加载器处理文件,点进去看看
![](https://img.haomeiwen.com/i22864240/efcc8679c7271513.png)
发现,他会将带有EnableAutoConfiguration的文件返回,哪里有EnableAutoConfiguration呢?在类路径下,被annotationMetadata找到的这个包中就有所有的自动配置类以及这个标识
![](https://img.haomeiwen.com/i22864240/1765baace72e3f19.png)
小结:
@EnableAutoConfiguration实现了自动配置类的功能,他是导入了AutoConfigurationImportSelector.class这个配置文件,这个配置文件使用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)方法获取了所有候选的配置,在方法中又使用SpringFactoriesLoader.loadFactoryNames扫描了jar包类路径下的META-INF/spring.factories,将扫描到的文件内容包装成properties对象,从properties中获取到EnableAutoConfiguration.class类对应的值,将他们添加到容器中
这些名称带有AutoConfiguration的被加入到容器中的自动配置类,就是自动配置的核心、源头,只有这些自动配置类进入了容器中,自动配置才会开始
# 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.CloudServiceConnectorsAutoConfiguration,\
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.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
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.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
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.RedisReactiveAutoConfiguration,\
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.elasticsearch.rest.RestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
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.http.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
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.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
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.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
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.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
至此,探索自动配置原理的第一步完成
第二步:
导入自动配置类到容器中之后,每一个自动配置类会进行自动配置的操作
以HttpEncodingAutoConfiguration这个自动配置类为例探索自动配置的原理
首先可以看到他被非常多的注解修饰了,这些注解的意思是
//表示这是一个配置类
@Configuration(proxyBeanMethods = false)
/*启动指定类的ConfigurationProperties功能,将配置文件中的值与指定的类映射
此时映射的是HttpProperties类,并将类注册到容器中*/
@EnableConfigurationProperties(HttpProperties.class)
//判断这是否是一个web项目,如果是,当前自动配置类生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
/*判断当前项目是否有CharacterEncodingFilter这个类
CharacterEncodingFilter是springMVC中的乱码解决过滤器*/
@ConditionalOnClass(CharacterEncodingFilter.class)
//判断配置文件中是否有指定的属性配置,如果没有,默认为true
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
而这个HttpProperties类就很熟悉了
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
@ConfigurationProperties(prefix = "spring.http")表示将全局配置文件中以spring.http开头的属性值与类中的同名属性进行映射
当判断是否为web项目的注解结果为true时,就会使当前自动配置类生效,会执行一些这样的方法
@Bean //将characterEncodingFilter注册到容器中
@ConditionalOnMissingBean
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;
}
所以,当当前自动配置类生效时,在全局配置文件中配置的以spring.http开头的属性值,会被自动映射到HttpProperties 类中,而类似characterEncodingFilter这样的组件配置类,又会从HttpProperties中读取对应属性进行组件的添加
![](https://img.haomeiwen.com/i22864240/68acd92329402b50.png)
![](https://img.haomeiwen.com/i22864240/2051be82a15d21e1.png)
可见,当一个自动配置类生效后,会从全局配置文件中读取需要的属性值,将各种组件添加到容器中
精髓:
- springboot启动时,就会加载大量的自动配置类
- 我们需要使用某些功能时,可以先看看springboot有没有默认写好的自动配置类,如果没有在自己手动创建
- 如果有,我们只需要看看这个自动配置类中配置了那些组件,只要有我们要用的组件,就不需要自己手动配置了
- 自动配置类给容器添加组件的时候,会从全局配置文件中读取一些特殊开头的属性值,我们只需要为这些属性值赋值即可
总结:
每一个自动配置类都是以xxxAutoConfiguration命名的,而每一个xxxAutoConfiguration自动配置类都会有一个xxxProperties类,用于封装全局配置文件中相关的属性值,xxxAutoConfiguration再通过方法获取属性值将组件添加到容器中
补充:
-
@Conditional以及其衍生注解
Conditional衍生注解
-
当我们需要检查哪些自动配置类启动了,哪些没启动的时候,如果一个一个手动查,将会十分的繁琐,此时可以在配置文件中加上debug=true,可以在项目启动后在控制台输出启动成功的自动配置类和未启动的自动配置类
Positive matches
未启动的
网友评论