赞
踩
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
spring大家都知道,boot是启动的意思。所以,spring boot其实就是一个启动spring项目的一个工具而已。从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。
以前在写spring项目的时候,要配置各种xml文件,还记得曾经被ssh框架支配的恐惧。随着spring3,spring4的相继推出,约定大于配置逐渐成为了开发者的共识,大家也渐渐的从写xml转为写各种注解,在spring4的项目里,你甚至可以一行xml都不写。
虽然spring4已经可以做到无xml,但写一个大项目需要茫茫多的包,maven配置要写几百行,也是一件很可怕的事。
现在,快速开发一个网站的平台层出不穷,nodejs,php等虎视眈眈,并且脚本语言渐渐流行了起来(Node JS,Ruby,Groovy,Scala等),spring的开发模式越来越显得笨重。
在这种环境下,spring boot伴随着spring4一起出现了。
那么,spring boot可以做什么呢?
spring boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装。所以,你以前可以用spring做的事情,现在用spring boot都可以做。
现在流行微服务与分布式系统,springboot就是一个非常好的微服务开发框架,你可以使用它快速的搭建起一个系统。同时,你也可以使用spring cloud(Spring Cloud是一个基于Spring Boot实现的云应用开发工具)来搭建一个分布式的网站。
spring boot采用java config的方式,对spring进行配置,并且提供了大量的注解,极大地提高了工作效率。
spring boot提供许多默认配置,当然也提供自定义配置。但是所有spring boot的项目都只有一个配置文件:application.properties/application.yml。用了spring boot,再也不用担心配置出错找不到问题所在了。
spring boot内置了三种servlet容器:tomcat,jetty,undertow。
所以,你只需要一个java的运行环境就可以跑spring boot的项目了。spring boot的项目可以打成一个jar包,然后通过java -jar xxx.jar
来运行。(spring boot项目的入口是一个main方法,运行该方法即可。 )
spring boot提供了actuator包,可以使用它来对你的应用进行监控。它主要提供了以下功能:
我们将在后续文章中学习它。
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
比如我要开发一个购票系统。就可以简单的拆分为用户管理微服务和售票系统微服务。两个服务都可以独立运行,都有自己的数据库,他们之间通过restapi 进行通信。
而spring boot就是搭建微服务的一个很好的选择。
restful 是一种api的风格,后面的文章里,会着重讲解。spring boot可以很方便的提供restful 风格的api。
微服务有很多优点,当然也有一些挑战。可以参考这篇文章:
微服务实战(一):微服务架构的优势与不足。
微服务一般都是运行在分布式环境中的,这可不是简单的写一个ssm框架的小程序就可以解决的,其中需要用到很多技术,比如负载均衡,反向代理,服务治理,配置管理,消息总线等,spring cloud提供了这些技术。并且,spring cloud全家桶是基于spring boot的。
之后会专门开一个spring cloud的专题。
来总结一下spring boot的特点。
Spring Boot可以以jar包的形式进行独立的运行,使用:java -jar xx.jar 就可以成功的运行项目,或者在应用项目的主程序中运行main函数即可;
我们上面已经讲过。
spring boot提供各种starter,其实就是一些spring bao的集合,只不过spring boot帮我们整合起来了而已。
上图只是其中的一部分,还有很多其他的。通过这些starter也可以看得出来,spring boot可以和其他主流的框架无缝集成,比如mybatis等。所以,你不需要担心你想用的技术spring boot不支持。
Spring Boot会根据我们项目中类路径的jar包/类,为jar包的类进行自动配置Bean,这样一来就大大的简化了我们的配置。当然,这只是Spring考虑到的大多数的使用场景,在一些特殊情况,我们还需要自定义自动配置(就在那唯一的配置文件里,而且它不是xml文件!)。
Spring Boot提供了基于http、ssh、telnet对运行时的项目进行监控。
----------------------------------------------------------------------------------------------------------------------------------------------------------
选择spring initializr,然后选择jdk版本,点next。可以发现,idea的这个插件其实用的也是start.spring.io。
接下来配置你的项目:
选择你需要的依赖和版本:
设置项目名和位置:
完成:
------------------------------------------------------------------------------------------------------------------------------------------------------------
创建好工程了,接下来,我们简单的写一个小demo。
打开DemoApplication.java 修改代码为:
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class}) //移除自动注入数据源
- @RestController // 添加了一个注解
- public class DemoApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
- //添加了一个方法
- @RequestMapping("/hello")
- public String hello(){
- return "no hello world";
- }
- }
直接运行这个main方法:
浏览器访问http://localhost:8080/hello:
大功告成。第一个spring boot项目完成。
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
- //移除自动注入数据源
现在新版本的springboot会自动注入数据源,所以需要在application配置文件里写你的数据库信息,但是我们暂时用不到它,所以先把这个功能移除,不然会报错。
@RestController
这个一个组合注解,相当于@ResponseBody
和@Controller
,controller大家都知道,ResponseBody注解将内容或对象作为 HTTP 响应正文返回。
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
这个就是spring boot的入口。关于这个方法,我们以后会详细讲解。
- @RequestMapping("/hello")
- public String hello(){
- return "no hello world";
- }
写过springmvc的应该都懂吧,我就不多说了。由于只是演示,所以我就把它放在入口类中了,规范点应该自己写controller类的。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
spring boot使用一个全局配置文件:application.properties或者application.yml,放置在src/main/resources目录下或者类路径的/config目录下。
application.properties是我们熟知的键值对配置文件:
application.yml是yaml语言的配置文件,yaml是一种以数据为中心的语言,在配置数据的时候具有面向对象的特征。我们以后的代码都会使用yml格式的配置文件。:
spring boot 的全局配置文件的作用是对一些默认配置的配置进行修改。后面我们会详细的讲解。
pom,是maven的配置文件,gradel也差不多,因为我一直在用maven,所以就讲maven了。
为了解决大型项目以及一些常用组件jar包过多的问题,spring boot 为我们提供了许多starter pom,每一个pom都已经添加好了对应的依赖,以往我们需要写茫茫多的dependence,但是现在只需要一个starter就可以了,并且spring boot 还为它们提供了默认的配置和自动配置的bean。
名称 | 描述 |
---|---|
spring-boot-starter | 核心Spring Boot starter,包括自动配置支持,日志和YAML |
spring-boot-starter-actuator | 生产准备的特性,用于帮我们监控和管理应用 |
spring-boot-starter-amqp | 对”高级消息队列协议”的支持,通过spring-rabbit实现 |
spring-boot-starter-aop | 对面向切面编程的支持,包括spring-aop和AspectJ |
spring-boot-starter-batch | 对Spring Batch的支持,包括HSQLDB数据库 |
spring-boot-starter-cloud-connectors | 对Spring Cloud Connectors的支持,简化在云平台下(例如,Cloud Foundry 和Heroku)服务的连接 |
spring-boot-starter-data-elasticsearch | 对Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch |
spring-boot-starter-data-gemfire | 对GemFire分布式数据存储的支持,包括spring-data-gemfire |
spring-boot-starter-data-jpa | 对”Java持久化API”的支持,包括spring-data-jpa,spring-orm和Hibernate |
spring-boot-starter-data-mongodb | 对MongoDB NOSQL数据库的支持,包括spring-data-mongodb |
spring-boot-starter-data-rest | 对通过REST暴露Spring Data仓库的支持,通过spring-data-rest-webmvc实现 |
spring-boot-starter-data-solr | 对Apache Solr搜索平台的支持,包括spring-data-solr |
spring-boot-starter-freemarker | 对FreeMarker模板引擎的支持 |
spring-boot-starter-groovy-templates | 对Groovy模板引擎的支持 |
spring-boot-starter-hateoas | 对基于HATEOAS的RESTful服务的支持,通过spring-hateoas实现 |
spring-boot-starter-hornetq | 对”Java消息服务API”的支持,通过HornetQ实现 |
spring-boot-starter-integration | 对普通spring-integration模块的支持 |
spring-boot-starter-jdbc | 对JDBC数据库的支持 |
spring-boot-starter-jersey | 对Jersey RESTful Web服务框架的支持 |
spring-boot-starter-jta-atomikos | 对JTA分布式事务的支持,通过Atomikos实现 |
spring-boot-starter-jta-bitronix | 对JTA分布式事务的支持,通过Bitronix实现 |
spring-boot-starter-mail | 对javax.mail的支持 |
spring-boot-starter-mobile | 对spring-mobile的支持 |
spring-boot-starter-mustache | 对Mustache模板引擎的支持 |
spring-boot-starter-redis | 对REDIS键值数据存储的支持,包括spring-redis |
spring-boot-starter-security | 对spring-security的支持 |
spring-boot-starter-social-facebook | 对spring-social-facebook的支持 |
spring-boot-starter-social-linkedin | 对spring-social-linkedin的支持 |
spring-boot-starter-social-twitter | 对spring-social-twitter的支持 |
spring-boot-starter-test | 对常用测试依赖的支持,包括JUnit, Hamcrest和Mockito,还有spring-test模块 |
spring-boot-starter-thymeleaf | 对Thymeleaf模板引擎的支持,包括和Spring的集成 |
spring-boot-starter-velocity | 对Velocity模板引擎的支持 |
spring-boot-starter-web | 对全栈web开发的支持, 包括Tomcat和spring-webmvc |
spring-boot-starter-websocket | 对WebSocket开发的支持 |
spring-boot-starter-ws | 对Spring Web服务的支持 |
- 2.1.2 spring boot生产准备的starters:
名称 | 描述 |
---|---|
spring-boot-starter-actuator | 添加生产准备特性,比如指标和监控 |
spring-boot-starter-remote-shell | 添加远程ssh shell支持 |
- 2.1.3 排除或交换具体技术方面的starters
名称 | 描述 |
---|---|
spring-boot-starter-jetty | 导入Jetty HTTP引擎(作为Tomcat的替代) |
spring-boot-starter-log4j | 对Log4J日志系统的支持 |
spring-boot-starter-logging | 导入Spring Boot的默认日志系统 |
spring-boot-starter-tomcat | 导入Spring Boot的默认HTTP引擎 |
spring-boot-starter-undertow | 导入Undertow HTTP引擎(作为Tomcat的替代) |
也有一些第三方为spring boot 提供了starter:
这些都可以在github上找到,感兴趣的可以去搜一下。
spring boot 提倡零配置,也就是无xml配置,但是在实际项目中,可能有一些要求必须使用xml配置,这时我们可以使用spring提供的@ImportResource 来加载xml配置,比如:
@ImportResource({"classpath:some-context.xml","classpath:other-context.xml"})
上一篇文章中也有提到,spring boot 项目是可以打成jar包的,然后通过java -jar xxx.jar
来执行,我们都知道,main函数是可以接受参数的,同样,spring boot的main函数也可以。
我们可以通过下面的命令来修改Tomcat的端口号:
java -jar xxx.jar --server.port=9090
在写spring项目的时候,我们可以在properties文件中定义一个变量,然后再代码中通过 @PropertySource 指明 properties 文件的位置,然后通过@Value注入相应的值。
在spring boot 中我们同样可以自定义一个变量,因为spring boot中的全局配置文件默认在一个目录下,所以我们可以直接用@Value注入值。
比如,在上一篇文章的demo项目中,我们可以在application.yml文件中这样定义:
- key:
- hello: hello world
修改DemoApplication.java代码为:
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
- @RestController
- public class DemoApplication {
-
- @Value("${key.hello}")
- private String hello;
-
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
-
- @RequestMapping("/hello")
- public String hello(){
- return hello;
- }
- }
运行项目,在浏览器中访问http://localhost:8080/hello:
值被正常的注入进去了。
上面的例子中,使用@Value注入每个配置在实际的应用中会显得格外的麻烦,因为配置一般会有很多,用上面的方式就要写好多@Value,并且如果在多个类文件中都使用这个值的话,工作量会更大。所以,需要一种更好的方式。并且,这种方式是有安全隐患的,比如我需要的是一个long类型,但是注入的却是String,这个时候就报错了:
Failed to convert value of type 'java.lang.String' to required type 'long';
spring boot 提供了基于类型安全的配置方式,通过@ConfigurationProperties将properties属性和一个bean及其属性关联,从而实现类型安全的配置。
我们来看一下:
application.yml:
- key:
- name: cleverfan
- sex: man
在demo项目中创建一个class: Person.java
- @Component
- @ConfigurationProperties(prefix = "key")
- public class Person {
- private String name;
- private String sex;
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setSex(String sex) {
- this.sex = sex;
- }
-
- public String getName() {
- return name;
- }
-
- public String getSex() {
- return sex;
- }
- }
修改DemoApplication.java :
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
- @RestController
- public class DemoApplication {
-
- @Autowired
- private Person person;
-
- public static void main(String[] args) {
- SpringApplication.run(DemoApplication.class, args);
- }
-
- @RequestMapping("/hello")
- public String hello(){
- return person.getName() + ": " + person.getSex();
- }
- }
启动项目,访问http://localhost:8080/hello:
回到刚刚的问题,如果这个时候我需要的是long,但是给的是String怎么办呢?这里给出一个很简单的处理方式:
Person.java
- @Component
- @ConfigurationProperties(prefix = "key")
- public class Person {
- private String name;
- private long sex;
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setSex(String sex) {
- try{
- this.sex = Long.valueOf(sex);
- }catch (Exception e){
- this.sex = 0L;
- }
-
- }
-
- public String getName() {
- return name;
- }
-
- public long getSex() {
- return sex;
- }
- }
yml配置文件不变,我们传递的是字符串,这次重启项目,访问http://localhost:8080/hello:
这样就可以简单的保证数据的安全了。
spring boot 支持Java Util Loggin、Log4J、Log4J2和LogBack作为日志框架,无论使用哪种日志框架,spring boot已为当前使用日志框架的控制台输出及文件输出做好了配置。
默认情况下,spring boot 使用 Logback作为日志框架。可以在配置文件中(yml)修改默认配置文件的配置:
- logging:
- level: debug
- logging:
- org:
- springframework:
- web: debug
Profile 是 spring 用来针对不同的环境对不同的配置提供支持的,比如生成环境,测试环境和开发环境。全局 Profile 使用application-{profile}.yml(例如application-prod.yml)命名。
下面我们做一个演示,我们把demo项目分为生产(prod)和开发(dev)环境,生产环境下端口号为8000,开发环境下为8888。
我们在demo项目的application.yml文件的同级目录下创建两个文件:
application-prod.yml:
- server:
- port: 8000
application-dev.yml:
- server:
- port: 8888
目录结构是这样的:
application.yml
- key:
- name: cleverfan
- sex: man
-
- logging:
- level: debug
-
-
- spring:
- profiles:
- active: dev
启动项目:
端口号是8888
修改application.yml:
- spring:
- profiles:
- active: prod
重新启动项目:
端口号的8000
证明我们的配置生效了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。