1 SpringBoot 介绍
Spring 框架对于很多 Java 开发人员来说都不陌生。自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架。有大量的企业应用基于 Spring 框架来开发。Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面。如此多的子项目和组件,一方面方便了开发人员的使用,另外一个方面也带来了使用方面的问题。每个子项目都有一定的学习曲线。开发人员需要了解这些子项目和组件的具体细节,才能知道如何把这些子项目整合起来形成一个完整的解决方案。在如何使用这些组件上,并没有相关的最佳实践提供指导。对于新接触 Spring 框架的开发人员来说,并不知道如何更好的使用这些组件。Spring 框架的另外一个常见问题是要快速创建一个可以运行的应用比较麻烦。Spring Boot 是 Spring 框架的一个新的子项目,用于创建 Spring 4.0 项目。它的开发始于 2013 年。2014 年 4 月发布 1.0.0 版本。它可以自动配置 Spring 的各种组件,并不依赖代码生成和 XML 配置文件。Spring Boot 也提供了对于常见场景的推荐组件配置。Spring Boot 可以大大提升使用 Spring 框架时的开发效率
–
- 使用Spring boot ,可以轻松的创建独立运行的程序,非常容易构建独立的服务组件,是实现分布式架构、微服务架构利器。
- Spring boot简化了第三方包的引用,通过提供的starter,简化了依赖包的配置
1.1 Spring boot的优点
- 轻松创建独立的Spring应用程序。
- 内嵌Tomcat、jetty等web容器,不需要部署WAR文件。
- 提供一系列的“starter” 来简化的Maven配置,不需要添加很多依赖。
- 开箱即用,尽可能自动配置Spring。
1.2 内置Servlet容器
2 入门案例
2.1 war 结构的项目
2.2 jar 包项目
pom.xml
spring-boot-starter-parent
作用
在pom.xml中引入spring-boot-start-parent,它可以提供dependency management,也就是说依赖管理,引入以后在申明其它dependency的时候就不需要version了,后面可以看到。spring-boot-starter-web
作用
springweb 核心组件
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tzb.springboot</groupId><artifactId>springboot-jar</artifactId><version>1.0-SNAPSHOT</version><name>springboot-jar</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><!--springboot--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies></project>
- 控制器
package com.tzb.springboot.web.controller;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;// rest 风格的控制器@RestController@EnableAutoConfiguration// 自动配置,相当于写了spring 配置文件publicclassHelloController{@RequestMapping("hello")@ResponseBody// 返回的数据转为 jsonpublic Stringhello(){return"Hello World!";}publicstaticvoidmain(String[] args){// 启动 springboot 项目
SpringApplication.run(HelloController.class);}}
// rest 风格的控制器@RestController@EnableAutoConfiguration// 自动配置,相当于写了spring 配置文件publicclassHelloController{@RequestMapping("hello/{name}")@ResponseBody// 返回的数据转为 jsonpublic Stringhello(@PathVariable String name){return"Hello World! "+ name;}publicstaticvoidmain(String[] args){// 启动 springboot 项目
SpringApplication.run(HelloController.class);}}
3 springboot 启动方式
3.1 方式 1
在控制器配置EnableAutoConfiguration并使用SpringApplication启动程序
3.2 方式 2 【常用】
创建一个App类,在App类中配置EnableAutoConfiguration
和组件扫描ComponentScan
,
然后使用SpringApplication启动程序,这样就可以访问多个Controller了.
- 控制器
package com.tzb.springboot.web.controller;import com.tzb.springboot.model.User;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;// rest 风格的控制器@RestController@RequestMapping("user")publicclassUserController{@RequestMapping("{id}")@ResponseBody// 返回的数据转为 jsonpublic UseruserInfo(@PathVariable Integer id){
User user=newUser("Mike","123");
user.setId(id);return user;}/* public static void main(String[] args) {
// 启动 springboot 项目
SpringApplication.run(UserController.class);
}*/}
- App.java
package com.tzb.springboot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.context.annotation.ComponentScan;@ComponentScan(basePackages="com.tzb.springboot.web.controller")@EnableAutoConfigurationpublicclassApp{publicstaticvoidmain(String[] args){
SpringApplication.run(App.class, args);}}
4 Spring Boot依赖介绍
- spring-boot-starter 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。
- spring-boot-starter-amqp 通过 spring-rabbit 支持 AMQP
- spring-boot-starter-aop 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。
- spring-boot-starter-batch 支持 Spring Batch,包含 HSQLDB。
- spring-boot-starter-data-jpa 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。
- spring-boot-starter-data-mongodb 包含 spring-data-mongodb 来支持 MongoDB。
- spring-boot-starter-data-rest 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。
- spring-boot-starter-jdbc 支持使用 JDBC 访问数据库
- spring-boot-starter-security 包含 spring-security。
- spring-boot-starter-test 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。
- spring-boot-starter-velocity 支持使用 Velocity 作为模板引擎。
- spring-boot-starter-web 支持 Web 应用开发,包含 Tomcat 和 spring-mvc。
- spring-boot-starter-websocket 支持使用 Tomcat 开发 WebSocket 应用。
- spring-boot-starter-ws 支持 Spring Web Services
- spring-boot-starter-actuator 添加适用于生产环境的功能,如性能指标和监测等功能。
- spring-boot-starter-remote-shell 添加远程 SSH 支持
- spring-boot-starter-jetty 使用 Jetty 而不是默认的 Tomcat 作为应用服务器。
- spring-boot-starter-log4j 添加 Log4j 的支持
- spring-boot-starter-logging 使用 Spring Boot 默认的日志框架 Logback
- spring-boot-starter-tomcat 使用 Spring Boot 默认的 Tomcat 作为应用服务器。
4.1 spring-boot-starter-web
- POM 文件中可以看到,应用所声明的依赖很少
- 只有一个“org.springframework.boot:spring-boot-starter-web”
- 而不是像其他 Spring 项目一样需要声明很多的依赖。
- 当使用 Maven 命令“mvn dependency:tree”来查看项目实际的依赖时
- 发现其中包含SpringMVC框架、SLF4J、Jackson、Hibernate Validator 和 Tomcat 等依赖。
- 这实际上 Spring 推荐的 Web 应用中使用的开源库的组合。
4.2 EnableAutoConfiguration
- EnableAutoConfiguration”注解的作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,这就减少了开发人员的工作量。
- Spring Boot 推荐采用基于 Java 注解的配置方式,而不是传统的 XML。只需要在主配置 Java 类上添加“@EnableAutoConfiguration”注解就可以启用自动配置。
- 注解“@RestController”和”@RequestMapping”由 Spring MVC 提供,用来创建 REST 服务。这两个注解和 Spring Boot 本身并没有关系。
5 web 开发
5.1 静态资源的访问
开发Web应用的时候,需要引用大量的js、css、图片等静态资源。
Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
/static
/public
/resources
/META-INF/resources
在src/main/resources/
目录下创建static
,在该位置放置一个图片文件。启动程序后,尝试访问http://localhost:8080/imgs/d.jpg。如能显示图片,配置成功。
5.2 全局捕获异常
@ExceptionHandler
表示拦截异常@ControllerAdvice
controller 的一个辅助类,最常用的就是作为全局异常处理的切面类
可以指定扫描范围
约定了几种可行的返回值,如果是直接返回 model 类的话,需要使用
@ResponseBody
进行 json 转换
- 异常类
package com.tzb.springboot.exception;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;import java.util.Map;/**
* 用于捕获全局异常
* */@ControllerAdvice// 控制器切面publicclassGlobalExceptionHandler{// 处理异常的方法@ExceptionHandler(RuntimeException.class)// 捕获运行时异常@ResponseBody// 返回 jsonpublic Map<String,Object>exceptionHandler(){
Map<String, Object> map=newHashMap<String, Object>();
map.put("errorCode","101");
map.put("errorMsg","系統错误!");return map;}}
控制器
App.java
@ComponentScan(basePackages="com.tzb.springboot")@EnableAutoConfigurationpublicclassApp{publicstaticvoidmain(String[] args){
SpringApplication.run(App.class, args);}}