本文参考自Spring Boot文档。css
Spring框架功能很强大,可是就算是一个很简单的项目,咱们也要配置不少东西。所以就有了Spring Boot框架,它的做用很简单,就是帮咱们自动配置。Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮咱们自动配置。若是默认配置不能知足需求,咱们还能够替换掉自动配置类,使用咱们本身的配置。另外,Spring Boot还集成了嵌入式的Web服务器,系统监控等不少有用的功,让咱们快速构建企业及应用程序。html
建立项目很简单。若是使用STS的话,新建Spring Starter项目便可。若是使用IDEA的话,新建Spring Initializer项目。若是不想使用IDE的话,从start.spring.io建立项目也能够。例以下面就是一个Spring Boot项目的build.gradle
文件,是我用IDEA建立的项目。因为我是用了最新的快照版本,所以这里的仓库还多了两个Spring的快找仓库,能够直接无视。(由于1.5的稳定版中Thymeleaf的支持才到2,为了使用最新Thymeleaf3,只能使用最新的快照版。)java
咱们能够看到Spring Boot和通常的项目差很少,只不过多应用了Spring Boot插件,它会让咱们更方便的运行Spring。另外在项目中没有其余依赖的引用,只引用了Spring Boot Starter依赖,这些依赖会将可能会使用到的依赖帮咱们引用。例如spring-boot-starter-test
会引用JUnit、AssertJ等一些测试框架,咱们不用再引用了。这极大地方便了咱们的开发。并且这些依赖不须要指定具体版本,具体的版本由Spring帮咱们决定。关于详细的Starter项目和具体jar包的版本号,参考13.5. Starters和F. Dependency versions。mysql
buildscript { ext { springBootVersion = '2.0.0.BUILD-SNAPSHOT' } repositories { mavenCentral() maven { url "https://repo.spring.io/snapshot" } maven { url "https://repo.spring.io/milestone" } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' jar { baseName = 'spring-boot-sample' version = '0.0.1-SNAPSHOT' } sourceCompatibility = 1.8 repositories { mavenCentral() maven { url "https://repo.spring.io/snapshot" } maven { url "https://repo.spring.io/milestone" } } dependencies { compile('org.springframework.boot:spring-boot-starter-aop') compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-thymeleaf') compile('org.springframework.boot:spring-boot-starter-web') runtime('org.springframework.boot:spring-boot-devtools') runtime('org.hsqldb:hsqldb') runtime('mysql:mysql-connector-java') compileOnly('org.projectlombok:lombok') testCompile('org.springframework.boot:spring-boot-starter-test') }
项目格式相似下图,和通常的Maven或者Gradle项目相似,只不过多了点东西。资源文件夹下static
文件夹用来存放web程序的静态资源,例如图片、css、js等。template
文件夹存放web程序的视图模板,html等须要渲染的模板文件就放在这里。application.properties
文件很重要,它是Spring Boot项目的全局配置文件。以往咱们须要编写层级XML配置文件,如今只须要在这里使用key=value
方式便可指定这些属性。默认的模板还为咱们添加了两个类。一个在main下,是Spring Boot项目的运行类,另外一个在test下,是测试类。web
运行类的代码以下。它是一个简单的类,包含了主方法,并且类上使用了@SpringBootApplication注解。这是一个惯用注解,它会帮咱们启用自动配置等特性。spring
@SpringBootApplication public class SpringBootSampleApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSampleApplication.class, args); } }
若是看一下SpringBootApplication
的源代码,相似下面这样。能够看到,SpringBootApplication
的功能是经过几个注解实现的。EnableAutoConfiguration
注解启用了自动配置功能。ComponentScan
注解会扫描该类所在的包和子包。因此Spring推荐咱们将这个运行类放到项目的根包下,以便咱们不须要任何配置便可扫描到全部配置类。sql
@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 {
Spring Boot项目更喜欢Java配置方式。所以从这里开始,全部的Spring配置都是用Java方式配置。固然若是你还想使用XML配置文件也能够,新建一个空的配置类,而后添加@ImportResource
注解并传递要使用的XML文件路径便可。数据库
若是使用Maven的话,运行下面的命令。浏览器
mvn spring-boot:run
若是使用Gradle的话,使用下面的命令。tomcat
gradle bootRun
而后就会显示相似下面的输出,后面会跟一大堆日志信息。若是是命令行程序的话,日志信息以后就会显示程序的运行结果了。若是是Web程序的话,默认状况下会使用内嵌的Tomcat来运行。咱们使用localhost:8080
来访问便可。
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.0.BUILD-SNAPSHOT)
这个日志能够是彩色的。若是你的输出不是彩色的,能够在application.properties
文件中添加下面一句。
spring.output.ansi.enabled=always
前面咱们看到了SpringBoot项目的启动类是这样的。
@SpringBootApplication() public class SpringBootSampleApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSampleApplication.class, args); } }
其实,咱们能够自定义它的各类属性。这时候须要建立SpringApplication对象并设置它的各类属性。比方说下面不显示Banner。还有不少配置和用法请查阅官方文档。
@SpringBootApplication() public class SpringBootSampleApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(SpringBootSampleApplication.class); application.setBannerMode(Banner.Mode.OFF); application.run(args); } }
若是有更高级的需求可使用监听器来管理Spring Boot程序的各个生命周期。监听器须要实现org.springframework.context.ApplicationListener
接口。
public class MyAppListener implements ApplicationListener<ApplicationReadyEvent> { @Override public void onApplicationEvent(ApplicationReadyEvent event) { System.out.println("应用程序准备就绪"); } }
在监听器中能够设置下面几种事件。
ApplicationStartingEvent
ApplicationEnvironmentPreparedEvent
ApplicationPreparedEvent
ApplicationReadyEvent
ApplicationFailedEvent
以后,把监听器添加到Spring程序中。
@SpringBootApplication() public class SpringBootSampleApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(SpringBootSampleApplication.class); application.setBannerMode(Banner.Mode.OFF); application.addListeners(new MyAppListener()); application.run(args); } }
在Spring Boot中Profiles更简单了。咱们使用application-{profile}.properties
格式来区分不一样的Profile,例如一个测试profile(application-test.properties
),一个生产环境profile(application-product.properties
)。
定义好多个Profiles以后,还须要在标准的application.properties
中列出和启用这些Profiles。列出使用spring.profiles.include
,激活其中的一个使用spring.profiles.active
。
spring.output.ansi.enabled=always spring.thymeleaf.cache=false spring.profiles.include[0]=test spring.profiles.include[1]=product spring.profiles.active[0]=test
YAML也是一种配置文件格式,比方说上面的properties,就能够改写为下面这样的YAML文件(application.yaml
)。
spring: output: ansi: enabled: always thymeleaf: cache: false profiles: include: - product - test active: test
若是须要多个Profile,YAML只须要一个文件便可,profiles之间使用---
分隔开。
server: address: 192.168.1.100 --- spring: profiles: development server: address: 127.0.0.1 --- spring: profiles: production server: address: 192.168.1.120
使用Properties仍是YAML,根据我的喜爱便可。
Spring Boot的核心就是自动配置,它为几乎全部的Spring组件都提供了相应的自动配置类,并且默认是打开的。因此只要相关的jar文件存在,这些自动配置就会被使用。其中有些配置属于必配的(例如Web模板),自动配置会为咱们省下很多时间;有些配置(例如数据源)则每每须要咱们修改。Spring的自动配置是非侵入式的,因此若是咱们声明了本身的数据源,那么Spring自动配置的嵌入式数据源就会取消。
固然若是想要关闭某些自动配置也是能够的。若是你有本身的主配置类,手动在上排除某些自动配置类便可。
@Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
若是咱们使用了SpringBootApplication
注解,那么上面这种方式须要修改一下。SpringBootApplication
注解提供了几个属性,能够控制排除的自动配置和组件搜索的路径。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class SpringBootSampleApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSampleApplication.class, args); } }
另外还能够直接修改项目的属性。咱们能够编辑application.properties
文件,在其中添加spring.autoconfigure.exclude
属性并指定要排除的类便可。
Spring的自动配置类通常在org.springframework.boot.autoconfigure
包下,若是咱们须要查看当前使用了多少个自动配置类,能够在运行程序的时候添加--debug
标志,这样Spring会打印额外的调试信息。若是须要详细的自动配置类的列表,能够参考Spring Boot文档 附录C. Auto-configuration classes。
MVC自动配置会启用如下功能。
ContentNegotiatingViewResolver
和 BeanNameViewResolver
beans.
静态资源和WebJars的支持.
自动注册 Converter
, GenericConverter
, Formatter
beans.
HttpMessageConverters
的支持.
自动注册MessageCodesResolver
.
静态index.html
的支持.
自定义Favicon(浏览器页面的小图标) 支持.
自动使用ConfigurableWebBindingInitializer bean.
自动注册指的是,只须要在Spring中注册相应类型的Bean。Spring Web MVC会自动识别和使用这些Bean。例如,咱们要添加新的HttpMessageConverter
,只须要向下面这样。
@Configuration public class MyConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> additional = ... HttpMessageConverter<?> another = ... return new HttpMessageConverters(additional, another); } }
静态资源默认放在resources文件夹的/static
(或 /public
或 /resources
或/META-INF/resources
下面。若是须要配置位置的话,在属性文件中添加spring.mvc.static-path-pattern=/resources/**
。
若是须要静态主页,直接在resources/static/
下放入一个index.html
便可。
若是须要配置本身的favicon.ico
,只须要将本身的favicon.ico
直接放到resources文件夹下便可。
Spring会对Thymeleaf、Freemarker、Groovy和mustache四种模板进行自动配置。默认的模板路径为resources/templates
。
错误处理和通常的Spring Web MVC相似,使用@ControllerAdvice
。
自定义错误页面放在下面的路径。
src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
若是错误页面也须要使用模板引擎动态生成,那么放在下面的路径。
src/ +- main/ +- java/ | + <source code> +- resources/ +- templates/ +- error/ | +- 5xx.ftl +- <other templates>
若是类路径中包含HSQL、Derby或H2的相应jar包,那么Spring就会自动配置这些嵌入式数据库的实例和数据源。它们会将数据保存在内存中,当程序结束以后数据会丢失。这很是适合开发和测试。
在不一样的测试中Spring默认会重用这些嵌入式数据库。假如不一样测试之间的数据不一样,你可能但愿每次测试都使用新的数据库。这时候能够在属性文件中指定spring.datasource.generate-unique-name=true
。
Spring会自动选择带链接池的数据源,遵循如下规则:
若是存在tomcat-jdbc数据源,则使用它。
不然,若是存在HikariCP,则使用它。
若是前两个都不存在,而存在DBCP2,则使用它。
这时候咱们须要提供数据源的额外配置信息。
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
JdbcTemplate
和NamedParameterJdbcTemplate
会由上面的数据源自动配置。咱们直接使用@Autowire注入到程序中便可。
JPA Entity类(标记了@Entity的类)默认在persistence.xml
中配置。在Spring Boot中,@EnableAutoConfiguration
或 @SpringBootApplication
包下的实体类会被自动扫描到。若是但愿自定义实体类的位置,可使用@EntityScan
注解,添加到配置类上便可。
继承了 Repository
的接口会被自动扫描到,咱们不须要作任何配置。若是须要配置,设置spring.jpa.*
属性。例以下面指定了数据的生成策略。
spring.jpa.hibernate.ddl-auto=update
H2嵌入式数据库提供了一个基于web界面的控制台。这个控制台也能够由Spring自动配置。当(1:存在H2相关jar包,2:当前程序是一个web程序,3:devtoos存在)的状况下,Spring便会自动配置H2控制台。
web控制台的访问路径默认为/h2-console
。咱们可使用spring.h2.console.path
属性修改它。
如图,这是一个完整的交互界面,咱们能够方便的在这里处理数据。若是须要设置访问控制权限,添加下面的属性。
security.user.role
security.basic.authorize-mode
security.basic.enabled
若是不想使用该控制台,可使用spring.h2.console.enabled=false
关闭它。在生产环境中记得把它关掉。
最后我要说一点,Spring Boot文档包含了不少其余Spring项目的自动配置,这里不可能全写完。因此若是须要详细信息的话仍是直接啃文档吧。
若是使用Maven,添加下面的依赖。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
若是使用Gradle,添加下面的依赖。
dependencies { compile("org.springframework.boot:spring-boot-devtools") }
这样就能够将调试工具添加到项目中。调试工具添加了热更新、自动重启等几个很是有用的调试功能。自动重启须要Spring检测到类路径上有更改,在Spring Tool Suite中,简单的保存文件便可达到效果。若是在Intellij IDEA中,只能选择Build Project。
Spring Boot默认使用Logback来打印日志。不过咱们直接使用slf4j提供的接口就能够了。slf4j和Logback也都由Spring自动配置好了。咱们只须要在属性文件中设置日志级别便可。
logging.level.yitian.study=debug
而后在代码中调用slf4j的日志接口并打印日志便可。
@Controller public class MainController { private Logger logger = LoggerFactory.getLogger(MainController.class); @RequestMapping("/") public String index(@RequestParam(defaultValue = "苟") String name, Model model) { model.addAttribute("name", name); logger.debug("访问了主页"); return "index"; } }
日志信息和Spring的输出格式同样。另外随着日志级别的变化,日志的颜色也会在绿、黄和红之间变化,很是方便。
2017-03-16 23:50:19.628 INFO 17220 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 4 ms 2017-03-16 23:50:19.632 ERROR 17220 --- [nio-8080-exec-1] yitian.study.controller.MainController : 访问了主页
这个Banner也是能够定制的。在类路径(也就是resource文件夹下)添加banner.txt
,Banner就会使用你的文本。Banner甚至能够是一张图片,支持gif、jpg、png等格式。Spring会将图片转换成字符形式。
默认状况下Spring使用Tomcat做为嵌入式容器。
端口号使用server.port
设置。若是但愿在运行时随机分配一个未使用的端口号,能够将端口号设置为0:server.port=0
。
spring-boot-starter-web
包默认使用Tomcat,若是咱们但愿使用Jetty,就须要排除Tomcat的包。使用Maven的话,这么作。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
若是使用Gradle的话,这么作。
configurations { compile.exclude module: "spring-boot-starter-tomcat" } dependencies { compile("org.springframework.boot:spring-boot-starter-web:2.0.0.BUILD-SNAPSHOT") compile("org.springframework.boot:spring-boot-starter-jetty:2.0.0.BUILD-SNAPSHOT") // ... }
使用server.compression.enabled=true
启用HTTP的响应压缩。默认状况下要压缩的响应体至少须要2048字节,可使用server.compression.min-response-size
修改这个值。
Spring Boot项目默认打包为jar文件。咱们可使用Maven或Gradle的打包命令来打包项目。打包好以后,就能够和通常jar文件同样,使用java命令来运行了。若是但愿打包为war文件的话也能够,不过因为篇幅所限就不介绍了。直接看源文档吧。
Actuator我没理解怎么翻译,因此凭个人感受就叫作系统监控吧。这些功能能够帮助咱们监控正在运行的Spring Boot项目。要启用监控功能,须要添加spring-boot-starter-actuator
。使用Maven的话,添加下面的依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
若是使用Gradle的话,添加下面的依赖。
dependencies { compile("org.springframework.boot:spring-boot-starter-actuator") }
每一个端点就是一个监控项。Spring包含了不少端点,详细列表在这里47. Endpoints。除了health以外,其他端点都属于敏感信息,在没有设置Spring Security的状况下没法访问。为了简单的在本地访问,咱们能够设置management.security.enabled=false
。注意该选项在生产环境中务必打开,保证服务器信息不会泄露。
端点的访问路径默认是/端点名
,例如health的访问路径就是/health
。比较有用的几个端点是beans(列出当前全部已注册的Spring Beans)、mappings(全部的控制器映射路径)、trace(最近100个HTTP链接的信息)、health(服务器当前的运行状态和磁盘剩余空间以及数据库的运行状态)。还有一个有趣的端点是shutdown,当咱们向/shutdown
发送post请求时服务器就会关闭,不过该功能是默认关闭的。
端点能够在属性文件中设置,每一个端点敏感性和是否启用都是能够定制的。
endpoints.beans.sensitive=false endpoints.shutdown.enabled=true
端点的访问也是能够定制的。
management.port=8081 management.address=127.0.0.1
好了,Spring Boot框架的介绍到此为止。咱们已经基本看到了Spring Boto的使用方法。固然官方文档还有不少内容这里没有列出。这里也不可能彻底列出来。若是须要更详细的介绍仍是直接看官方文档吧。没有比这个更全面的了。