Spring Boot 简单使用


本篇将介绍 Spring Boot 的简单使用方式,会通过一个HelloWorldDemo来说明。


构建 Spring Boot 项目文件系统

这里推荐使用项目自动化构建工具,可以提高效率。本文使用的是Gradle,具体步骤可以参考《工具使用——如何使用Gradle创建一个Spring Boot项目》

在这里有一点需要注意,即在Gradle引入项目依赖时,官方推荐的是忽略掉所依赖的jar包的版本号。这是因为Spring Boot 的 Gradle 插件会提供 Dependencies Management(依赖管理),依赖管理在没有指明依赖的版本号时,自动更新所引用的依赖包,并使所有依赖的包之间也可以相互协作。但若是手动指定版本,可能会因为依赖包间的版本冲突,产生问题。


关于starters依赖描述符

在引入 Spring Boot 依赖时,会根据所要完成的应用的需求,引入许多如spring-boot-starter-*形式命名的依赖。这些依赖统称为 Spring Boot Starters。它们包含了完成一定功能的,应用所需要的依赖描述符
为了便于项目构建,这些Starters都可以通过一站式商店直接获取。这样就可以不必同伙写代码、复制粘贴等步骤到处搜索。
下面列出了几个基本的Web Application会用到的Starters:

| 名称 | 作用 |
| : ------ : | : ------ : |
| spring-boot-starter-web | 用于构建Web,包含了RESTful,使用Spring MVC作为基础框架,并使用 Tomcat 作为默认的内嵌容器。 |
| spring-boot-starter-test | 包含了 Spring Boot 应用测试所需要的依赖库。如JUnit、Hamcret和Mockito。|
| spring-boot-starter-jdbc | 用于Spring Boot 应用配置,告知使用 Tomcat JDBC 连接池。|
| spring-boot-starter-jpa | 用于告知 Spring Boot 配置,通过Hibernate持久层框架使用 Spring Data JPA。|
| spring-boot-starter-hateoas | 用于构建基于超媒体 RESTful 的 Web 应用,使用了Spring MVC 和Spring HATEOAS|
当然,还有很多其他的依赖可供使用,在需要时可以去“Maven central"查找。


构筑代码

Spring Boot 并不强行要求开发者按照某种代码结构去书写才能正常运行,但是会有一些最佳实践。

  1. 注意默认包(default package)的使用
    当没有声明包名的情况下,当前类会被视为放在default package中,而这时,使用 @ComponentScan@EnableAutoConfiguration@SpringBootApplication 等注解都可能会出现问题。因此,官方推荐在构筑代码时,最好采用 com.example.project 的形式将所有会用到的类都放入对应的命名包中。
  2. 注意包含 main 方法的 Application 类的位置
    由于该类中会含有 @ComponentScan@EnableAutoConfiguration@SpringBootApplication 等注解,其中 @EnableAutoConfiguration 会对当前package下所有的package进行查找以便找到配置所需的明确条目。而@ComponentScan 会根据之前查找到的明确的条目,将这些组件注册到Spring容器中。那么,将Application 类放置在项目的 root package 下的好处就显而易见了,这样做可以使 @ComponentScan 在无需明确指定要扫描的package的条件下,就扫描到所有的组件,从而顺利完成自动配置。最终达到简化配置的目的。
项目的包结构,以及Application类的位置

Spring Boot 的配置类

Spring Boot 同样支持 XML 配置和基于 Java 的配置。但是相比之下,更加推荐使用基于 Java 的配置。这种配置方式需要开发者在主要的配置类中添加一个main()方法,并将其委托给 SpringApplication 类的run() 方法执行。基于 Java 的配置类需要通过@Configuration注解标明,或者通过@Import 注解引入到主要的配置类中。如果一定要使用 XML 配置文件,可以通过 @ImportResource 注解将 XML 文件引入到主要配置类中。


Spring Boot 的自动配置

Spring Boot 的自动配置是根据当前添加的项目依赖(jar包)去自动完成相关配置的。例如添加了 spring-boot-starter-web 依赖包,Spring Boot 就会自动按照Web Application的默认形式去完成与 web.xml 基本工作等价的配置。当开发者想要应用自动配置功能时,就需要在标注了@Configuration 的配置类类中添加 @EnableAutoConfiguration 注解。
当然,完全依赖自动配置会限制 Web 应用的功能。因此,Spring Boot 推荐开发者根据需求逐步替换自动配置。能做到这一点,也是因为Spring Boot 提供的自动配置是非侵入性的,使得开发者可以从任意一点切入去更改默认配置而不影响项目其他部分。
另外,当开发者使用了多个配置类时,可以通过@EnableAutoConfiguration 提供的 exclude = SomeConfiguration.classexcludeName = someConfigurationInstance 属性来指定不去应用某个配置类


Spring Boot Beans 和 Denpendency Injection

Spring Boot 支持Spring framework 技术中的 Beans 定义和依赖注入方式。因此,开发者可以很容易的使用 @ComponentScan 找寻 Beans ,并利用 @Autowired 注解完成依赖注入。
@ComponentScan 可以讲所有的应用组件都注册到Spring容器中。
应用组件(Beans)的标注可以通过@Comtroller@Service@Repository@Component完成。
以下是以Controller为例的代码:

import com.tw.jlhe.helloworld.model.Greeting;
import com.tw.jlhe.helloworld.service.HelloWorldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @Autowired
    HelloWorldService helloWorldService;

    @RequestMapping(value = "/greeting" , method = RequestMethod.GET)
    public ResponseEntity<?> greeting(){
        Greeting greeting = new Greeting();
        greeting.setGreetingContent(helloWorldService.greering());
        return ResponseEntity.ok(greeting);
    }
    @RequestMapping(value = "/{name}" , method = RequestMethod.GET )
    public ResponseEntity<?> greetingToSomeone(@PathVariable String name){
        Greeting greeting = new Greeting();
        greeting.setGreetingContent(helloWorldService.greetingToSomeone(name));
        return ResponseEntity.ok(greeting);
    }
    @RequestMapping(value = "/greeting/{id}" , method = RequestMethod.GET)
    public ResponseEntity<?> greetingToRepository(@PathVariable Long id){
        Greeting greeting = new Greeting();
        greeting.setGreetingContent(helloWorldService.greetingToRepository(id));
        return ResponseEntity.ok(greeting);
    }
}

其中 @RestController 注解表明当前类是一个 Controller 组件,会被注册到Spring容器中。当有请求访问时,Spring容器会自动创建一个该组件的实例来处理请求。在创建该实例的过程中,容器会获取到 @Autowired 注解,并被告知此处需要注入一个HelloWorldService的实例,也就是该Controller的依赖。那么Spring容器就会根据Java类名反射机制,在 @Service 注解标注的组件中找到一个合适的Service类去创建实例,并将该实例注入到该处。这个创建实例和注入依赖的过程是一种递归的过程。


关于@SpringBootApplication注解

这里需要提一下,@SpringBootApplication 注解是Spring Boot 的注解,本着为开发应用提供便捷途径的原则,Spring Boot将基于 Java 配置类中最佳实践常用的三个注解@ComponentScan@EnableAutoConfiguration@Configuration 的功能合并成了@SpringBootApplication


了解了以上知识点,就可以使用 Spring Boot 完成一个简单的 HelloWorldDemo了。

源码见《HelloWorldDemo》


参考资料

http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/htmlsingle/#getting-started

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,678评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 此篇翻译的是Spring Boot官方指南 Part III. 使用 Spring Boot (Using Spr...
    K天道酬勤阅读 6,692评论 0 21
  • 1.系统构建 2.代码构建 3.配置类和相关注解 4.运行 基于版本:Spring Boot 1.5.7.RELE...
    白菜饼阅读 1,954评论 0 2
  • 前两天知悉外婆再次患上中风,生命垂危。第二天便乘上火车往家赶,两个小时后,当我再一次踏上这条通往家的路...
    野草夏花阅读 291评论 0 0