在上节中我们通过了一个小的入门案例已经看到了Spring Boot的强大和简单之处。本章将详细介绍Spring Boot的核心注解,基本配置和运行机制。笔者一直认为:精通一个技术一定要深入了解这个技术帮助我们做了哪些动作,深入理解它底层的运行原理,只有达到这个目标才可以熟练使用框架,最终达到融会贯通的目的。
Spring Boot的项目一般都会有注解*Application标注的入口类,入口类中会有一个main方法,main方法是一个标准的Java应用程序的入口方法,可以直接启动。 @SpringBootApplication注解是Spring Boot的核心注解,用此注解标注的入口类是应用的启动类,通常会在启动类的main方法中通过 SpringApplication.run(App.class, args) 来启动Spring Boot应用项目。 @SpringBootApplication其实是一个组合注解,查看源码如下:
(2)@EnableAutoConfiguration:启动自动配置,该注解会让Spring Boot根据当前项目所依赖的jar包自动配置项目的相关配置项。 例如,当我们在Spring Boot项目的pom.xml文件中配置了spring-boot-starter-web依赖:
通过上述例子可以看出,如果我们又在项目中添加spring-boot-starter-data-solr依赖,Spring Boot就会自动进行Solr技术的相关配置。 (3) @ComponentScan:扫描配置,Spring Boot默认会扫描@SpringBootApplication所在类的同级包以及它的子包。所以建议将@SpringBootApplication修饰的入口类放置在项目包下(Group Id+Artifact Id),这样做的好处是:可以保证Spring Boot项目自动扫描到项目所有的包。
通过上节@SpringBootApplication下的@EnableAutoConfiguration得知,Spring Boot会根据项目中的jar包依赖,自动做出配置,Spring Boot支持的自动配置如下(非常多):
假如我们不需要Spring Boot自动配置,想关闭某一项的自动配置,该如何设置呢? 例如:我们不想自动配置Redis,想自己手动配置呢?通过查看@SpringBootApplication的源码可以看出,关闭特定的自动配置应该使用@SpringBootApplication下的exclude参数,现以关闭Redis自动配置为例: @SpringBootApplication(exclude={RedisAutoConfiguration.class})
(2)在第一步所示范的网站上选择左下方的“select & copy”按钮将自定义的banner图案进行复制,然后新建一个banner.txt文件,将复制好的图案写入到banner.txt文件中。
可以在Spring Boot项目的src/main/resources目录下或者在类路径下的/config目录下创建一个全局的配置文件application.properties或者是后缀为.yml的application.yml的文件用于修改Spring Boot项目的默认配置值,例如修改项目的默认端口,或者进入DispatcherServlet的请求地址规则等。 通常,在实际开发中我们习惯使用application.properties文件作为应用的全局配置文件,一般我们放到src/main/resources目录下。 例如,在src/main/resources目录下创建一个名称为application.properties的文件,配置内容如下:
从上面的参数配置可以看出,Spring Boot支持很多参数的配置与参数值的修改,关于其他配置参数的详细说明和描述可以查看官方的文档说明:http://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#common-application-properties
Spring Boot就会自动关联web开发相关的依赖,如Tomcat以及spring-webmvc等,进而对web开发进行支持,同时相关技术的配置也将实现自动配置,程序员即可从繁琐的配置文件中脱身而出了。除此之外,官方还提供了如下Starters:
Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器,进行自动配置。
-
#Initializers
-
org.springframework.context.ApplicationContextInitializer=\
-
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
-
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
-
-
#ApplicationListeners
-
org.springframework.context.ApplicationListener=\
-
org.springframework.boot.autoconfigure.BackgroundPreinitializer
-
-
#AutoConfigurationImportListeners
-
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
-
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
-
-
#AutoConfigurationImportFilters
-
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
-
org.springframework.boot.autoconfigure.condition.OnClassCondition
-
-
#AutoConfigure
-
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
-
-
#Failureanalyzers
-
org.springframework.boot.diagnostics.FailureAnalyzer=\
-
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
-
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
-
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer
-
-
#Templateavailability providers
-
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
-
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
-
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
-
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
-
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
-
org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider
在spring.factories中可以看出web开发的自动配置类是:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,在这个类中就自动实现了Sprng MVC的配置。现在以Spring MVC的配置如下:
其中@ConditionalOnClass是一个条件注解,意思就是只有当前项目运行环境中有Servlet类,并且有DispatcherServlet类以及WebMvcConfigurerAdapter类时(说明本项目是需要集成Spring MVC的),,Spring Boot才会初始化WebMvcAutoConfiguration进行自动配置。 (2) 自动配置试图解析器ViewResolver。 在WebMvcAutoConfiguration类下找到以下源码:
@Bean是在这里定义了一个Bean对象InternalResourceViewResolver,以前我们是通过标签来定义的。 @CoditionalOnMissingBean是一个条件注解,是当 前环境下没有这个Bean的时候才会创建该bean。 方法的返回值即是InternalResourceViewResolver,即是我们需要的对象,那么视图解析器中前缀和后缀Spring Boot是如何实现自动配置的呢?