本篇将介绍 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 并不强行要求开发者按照某种代码结构去书写才能正常运行,但是会有一些最佳实践。
-
注意默认包(default package)的使用
当没有声明包名的情况下,当前类会被视为放在default package中,而这时,使用@ComponentScan
、@EnableAutoConfiguration
、@SpringBootApplication
等注解都可能会出现问题。因此,官方推荐在构筑代码时,最好采用com.example.project
的形式将所有会用到的类都放入对应的命名包中。 -
注意包含 main 方法的 Application 类的位置
由于该类中会含有@ComponentScan
、@EnableAutoConfiguration
、@SpringBootApplication
等注解,其中@EnableAutoConfiguration
会对当前package下所有的package进行查找以便找到配置所需的明确条目。而@ComponentScan
会根据之前查找到的明确的条目,将这些组件注册到Spring容器中。那么,将Application 类放置在项目的 root package 下的好处就显而易见了,这样做可以使@ComponentScan
在无需明确指定要扫描的package的条件下,就扫描到所有的组件,从而顺利完成自动配置。最终达到简化配置的目的。
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.class
或 excludeName = 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了。
参考资料
http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/htmlsingle/#getting-started