什么是spring boot?
spring boot其实就是spring的进阶版,它替我们完成了许多配置工作,使我们不用考虑为了实现某种功能应该引入的依赖以及引入依赖之间的兼容性,从而使我们更加专注于应用程序代码逻辑的实现。
spring boot中有诸多特性,其中比较重要的便是起步依赖和自动配置
起步依赖
即把实现某种特定功能所需要的库聚合成一类,这些库之间相互兼容,起步依赖本质上是一个Maven项目对象模型,定义了了对其他库的依赖传递,我们可以选择覆盖起步依赖中的依赖版本,但须慎重,因为起步依赖中的依赖版本都是经过严格配置的,修改版本可能导致各依赖版本不兼容
自动配置
有些配置在spring应用程序中很常见,spring boot能够对这些常用的配置进行自动配置,其基本原理如下:
当我们创建一个spring boot应用程序时,在启动引导类中我们往往会加入@SpringBootApplication注解,这个注解包括三部分:
1、@Configuration:表明该类使用spring基于java的配置
2、@ComponentScan:启动组建扫描,这样自己写的web控制器类和其他组件才会被自动发现并被注册为Spring上下文中的Bean
3、@EnableAutoConfiguration:开启spring boot的自动配置,在@EnableAutoConfiguration的注解文件中我们可以发现@import注解,如下:
@Import({ EnableAutoConfigurationImportSelector.class,
AutoConfigurationPackages.Registrar.class })
该注解引入了EnableAutoConfigurationImportSelector类,该类的代码中包含如下代码:
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,
this.beanClassLoader))
SpringFactoriesLoader会加载类路径下spring.factories下key为EnableAutoConfiguration全限定名对应值,如下所示:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
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.hornetq.HornetQAutoConfiguration,\
org.springframework.boot.autoconfigure.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
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.velocity.VelocityAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.GzipFilterAutoConfiguration,\
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.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration
spring boot自动配置使用了条件化注解,当满足一定条件时,spring boot便会通过反射机制将相应的类实例化为配置类,我们可以用自己的配置覆盖自动配置,在大部分情况下,配置类中的@ConditionMissingBean(容器中没有配置特定的Bean)是忽略自动配置的关键,spring boot会优先配置我们的配置类,创建对应的Bean,从而使@ConditionMissingBean为假,忽略自动配置,如果我们不用使用spring boot中的某些自动配置,可以更改@SpringBootApplication为如下形式:
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, KafkaAutoConfiguration.class})//去除Mongo和Kafka的自动配置
实例——Hello World!
下面给出一个hello world的实例,开发平台为eclipse,需安装spring boot suit插件,具体安装参照百度百科eclipse中安装spring boot suit
由于eclipse生成spring boot项目其实是从Spring Initializr中获取,故请确保自己联网。
1、选择起步依赖,此处选择web。
2、生成的项目结构如下:
HelloworldApplication为程序的启动引导类,也是主要的spring配置类
application.properties用于配置应用程序和spring boot的属性
pom.xml为Maven的构建说明文件,其中会看到我们注入的起步依赖——spring-boot-starter-web
Maven Dependencies为相应的依赖,由于我们选择了web作为起步依赖,因此在这里我们可以看到许多与web有关的jar包
HelloworldApplication为一个集成测试类
HelloworldApplication.java文件代码:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
}
确保使用SpringBootApplication,开启组建扫描和自动配置
接下来创建一个springMVC控制器
helloworldcontroller.java文件代码:
package com.example.demo;
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//注册为控制器,以便组建扫描能够找到该控制器,注册为Bean
@RequestMapping("/helloworld")//设置访问的URL
public class helloworldcontroller {
@RequestMapping("/")
String home(){//使用HTTP GET请求上名为name的参数作为形参name的值
return "Hello World!";
}
}
运行:
在浏览器上输入http://localhost:8080/helloworld/,结果如下:
注意:spring boot默认只会扫描启动类所在的包以及下级包,对于上例来说,spring boot只会扫描com.example.demo和com.example.demo.*包,因此控制器应该位于这两个包中的其中一个,控制器启动成功后,可以在控制台日记看到如下日记:
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/helloworld/]}"
onto java.lang.String com.example.demo.helloworldcontroller.home()
表明控制器成功启动
在上述实例中,似乎没有看到tomcat的身影,那是不是可以说spring boot是一个servlet容器呢?其实spring boot本身并不是servlet容器,其内嵌了一个tomcat服务器,该功能由内嵌的servlet容器tomcat提供。