一、介绍
spring boot并不是一个全新的框架,它被设计的目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使
用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。换句话说,spring boot 其实是默认配置了很
多框架的使用方式(减少你的配置),就像maven整合了所有的jar包一样。从而可以让项目快速跑起来。
特点:
以ssm项目为例,其搭建过程还是比较繁琐的,配置文件如下:
① 配置web.xml,加载spring和spring mvc
② 配置数据库连接、配置日志文件
③ 配置加载配置文件的读取,开启注解
④ 配置mapper文件
......
而使用spring boot来开发项目则只需要非常少的几个配置就可以搭建起来一个web项目,并利用idea可以自动生成。
① 简单、快速、方便地搭建项目
② 对主流开发框架的无配置集成
③ 极大地提高了开发、部署效率
二、spring boot 项目搭建(maven构建)
1.访问http://start.spring.io/
2.选择构建工具Maven Project、Spring boot版本2.1.1(有多个版本,这里默认选最新版本)以及一些工程基本信息,点击
“Switch to the full version.”java版本选择1.8(1.7也可以)并点击Generate Project下载项目压缩包。
3.解压之后将项目导入进来
在eclipse中右键Import -> Existing Maven Projects -> Next ->选择解压后的文件夹-> Finsh
Spring Boot的基础结构共三个文件:
① src/main/java 程序开发以及主程序入口
SpringbootApplication:默认生成的一个带有main()方法的类,用于启动应用程序
②src/main/resources 配置文件
application.properties:一个空的 properties 文件,可以根据需要添加配置属性
③src/test/java 测试程序
SpringbootApplication:默认生成的一个空的 Junit 测试,它加载了一个使用 Spring Boot 字典配置功能的
Spring 应用程序上下文。
Sping boot建议的目录结果如下:
root package结构:com.example.myproject //myproject为自定义的项目名
com
+- example
+- myproject //自定义的项目名
+- Application.java //建议放到根目录下,主要是做一些框架配置
|
+- domain //目录主要用于实体(Entity)与数据访问层(Repository)
| +- Customer.java
| +- CustomerRepository.java
|
+- service //层主要是业务类代码
| +- CustomerService.java
|
+- controller //负责页面访问控制
| +- CustomerController.java
|
以上是采用默认配置可以省去很多配置,也可根据个人喜好进行重新配置。项目的底层创建已经完成了,最后,启动
Application main方法,项目就启动了。后面步骤是该项目的完善。
4. 引入web模块
1.pom.xml中添加支持web的模块:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
pom.xml文件中默认有两个模块:
① spring-boot-starter:核心模块,包括自动配置支持、日志和YAML。
② spring-boot-starter-test:测试模块,包括JUnit、Hamcrest、Mockito。
2.编写controller
package com.example.springboot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //该注解意为controller里面的方法都以json格式输出,不用再写什么jackjson的配置。
// @RestController是@Controller 和 @ResponseBody 注解的合体版
public class UserController {
@RequestMapping("/name")
public String name() {
return "石破天"; //输出的数据
}
}
3.在地址栏中输出 localhost:8080/name
三、解析 Spring Boot 项目
1.解析 pom.xml 文件
parent标签 :配置spring boot的父级依赖
有了这个,当前的项目才是 Spring Boot 项目,spring-boot-starter-parent 是一个特殊的 starter ,它用来提
供相关的 Maven 默认依赖,使用它之后,常用的包依赖就可以省去 version 标签。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Spring Boot 提供了哪些 jar 包的依赖,我们可以查看本地 Maven 仓库下:
\repository\org\springframework\boot\spring-boot-dependencies\2.0.1.RELEASE\spring-boot-dependencies-
2.0.1.RELEASE.pom 文件来查看。
2.应用入口类
Spring Boot 项目通常有一个名为 *Application 的入口类,入口类里有一个 main 方法, 这个 main 方法其实就
是一个标准的 Javay 应用的入口方法。
@SpringBootApplication 是 Spring Boot 的核心注解,它是一个组合注解,该注解组合了:
@Configuration、@EnableAutoConfiguration、 @ComponentScan;
若不是用 @SpringBootApplication 注解也可以使用这三个注解代替。
@EnableAutoConfiguration:让 Spring Boot 根据类路径中的 jar 包依赖为当前项目进行自动配置,例如,添加
了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,那
么Spring Boot 会对 Tomcat 和 Spring MVC 进行自动配置。
Spring Boot 还会自动扫描 @SpringBootApplication 所在类的同级包以及下级包里的 Bean ,所以入口类建
议就配置在 grounpID + arctifactID 组合的包名下(这里为 cn.wmyskxz.springboot 包)。
3.Spring Boot 的配置文件
Spring Boot 使用一个全局的配置文件 application.properties 或 application.yml(需要安装YEdit插件),放置在
【src/main/resources】目录或者类路径的 /config 下。
Spring Boot 不仅支持常规的 properties 配置文件,还支持 yaml 语言的配置文件。yaml 是以数据为中心的语言,
在配置数据的时候具有面向对象的特征。
Spring Boot 的全局配置文件的作用是对一些默认配置的配置值进行修改。
示例:
我们同样的将 Tomcat 默认端口设置为 8080 ,并将默认的访问路径从 “/
” 修改为 “/name
” 时,使用 properties
文件和 yml 文件(yml 需要在 “:
” 后加一个空格)的区别如上图。
①我们可以自己配置多个属性:
我们使用 .yml 文件来进行简单的配置,然后使用 @Value 来获取配置属性:
注意:如果$中的属性不加上server.,会报:Could not resolve placeholder 'xxxx' in value "${xxxx}"
重启 Spring Boot ,输入地址:localhost:8080/name,结果如下:
②也可以在配置文件中使用当前配置:
其结果如下:
③上面方式写配置文件繁琐而且可能会造成类的臃肿,因为有许许多多的 @Value 注解。
所以可以用封装配置:
其结果如下:
4.spring boot 热部署
在上面的 Spring Boot 项目中,当发生了任何修改之后都需要重新启动才能够正确的得到效果,而Spring Boot 提
供了热部署的方式,当发现任何类发生了改变,就会通过 JVM 类加载的方式,加载最新的类到虚拟机中,这样就
不需要重新启动也能看到修改后的效果了。
只需要在pom.xml中加入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency>
正常启动保存修改之前:
保存修改之后:
5.单元测试的使用
测试入口在 src/test/下,编写简单的http请求来测试;使用mockmvc进行,利用MockMvcResultHandlers.print()
打印出执行结果,如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControlerTests {
private MockMvc mvc;
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
public void getName() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/name").accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
6 开发环境的调试
热启动在正常开发项目中已经很常见了吧,虽然平时开发web项目过程中,改动项目启重启总是报错;但
springBoot对调试支持很好,修改之后可以实时生效,需要添加以下的配置:
<!--在该信息中,加入的部分是加入头注释的,其他部分已经存在不需要添加-->
<dependencies>
<!--增加热部署相关包的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--增加configuration-->
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
该模块在完整的打包环境下运行的时候会被禁用。如果你使用java -jar启动应用或者用一个特定的classloader
启动,它会认为这是一个“生产环境”。
7.Spring Boot 支持 JSP
Spring Boot 的默认视图支持是 Thymeleaf 模板引擎,但是一般常用的引擎是jsp,这也是大部分人熟悉的,如
果想换成jsp,具体操作如下:
① 在pom.xml中增加对jsp的支持:
<!-- servlet依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat的支持.-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
② 配置试图重定向 JSP 文件的位置:
修改 application.yml 文件,将我们的 JSP 文件重定向到 /WEB-INF/views/ 目录(手动创建)下:
③修改 UserController
修改 @RestController 注解为 @Controller ,然后将 name方法修改为:
④创建 .jsp文件
在【src/main】目录下依次创建 webapp、WEB-INF、views 目录,并创建一个 name.jsp 文件:
⑤重启访问
虽然说已经配置了热部署,但是在之后不断地创建了文件夹,可能自动重启的时候并没有加载进去,导致在
跳转页面时出现了404。结果如下:
8.集成 MyBatis
① 在pom.xml中添加MySql和 MyBatis的支持
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
②新增数据库链接参数
#注释用#表示
#.yml文件对格式有要求:1.‘:’后如果有内容,必须加上一个空格 2.路径级别关系,同一级别缩紧空格相同,子目录时,父路径的‘:’后面是空的表示这是文件夹名,有内容说明这属于属性
#如果不遵循以上规则,可能在读取配置时失败
spring:
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=UTF-8
username: root
password: admin
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update #新增数据链接必备的参数
③创建实体类user以及映射类UserMapper
在com.example.springboot目录下新建一个pojo包,存放新建的实体类User(不贴代码了)
在com.example.springboot目录下新建一个mapper包,存放持久层的映射类
注解形式:
映射类 UserMapper
package com.example.springboot.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.example.springboot.pojo.User;
/**
*这里用的是注解的形式建立映射关系,没有使用xml配置
*/
@Mapper
public interface UserMapper {
@Select("select * from user")
List<User> findAll();
@Insert("insert into user(name,age)values(#{name},#{age})")
void insertUser(User user);
}
xml配置形式:
映射类 UserMapper:去掉接口方法中的注解,编写映射文件userMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 根节点:对应接口 -->
<!-- 为mapper指定唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,可保证唯一性 -->
<!-- 这里namespace必须是UserMapper接口的路径,不然运行的时候要报错 “is not known to the MapperRegistry” -->
<mapper namespace="com.springboot.mapper.UserMapper">
<!--子节点:对应接口中的方法,id对应方法名,parameterType对应入参数类型,可以用数据类型、全限名或者别名表示 -->
<insert id="insertUser" parameterType="com.springboot.entity.User" >
<!-- 这里sql结尾不能加分号,否则报“ORA-00911”的错误 -->
insert into user(name,age) values(#{name},#{age})
</insert>
<!-- 这里的id必须和UserMapper接口中的接口方法名相同,不然运行的时候也要报错 -->
<!-- 必须要加入resultType或者resultMap,否则会报错 -->
<select id="getUser" resultType="com.springboot.entity.User" parameterType="java.lang.String">
select * from user
</select>
</mapper>
在application.yml中加上以下配置信息:
mybatis:
#指定映射文件的路径
mapper-locations: classpath:mapper/*.xml
#对应实体类的路径
type-aliases-package: com.springboot.pojo
④编写UserController
在com.springboot.controller中创建UserController
package com.example.springboot.controller;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.example.springboot.mapper.UserMapper;
import com.example.springboot.pojo.User;
@Controller //注意Controller与RestController的区别
//这里没有编写service,实际项目需要增加
public class UserController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/getalluser")
public String getAllUser(Model m) {
System.out.println("hahahh");
List<User> userList =userMapper.findAll();
m.addAttribute("userList", userList);
return "showUser";
}
@RequestMapping("/insertuser")
public String insertUser() {
User u = new User();
u.setName("石破天");
u.setAge(25);
userMapper.insertUser(u);
return "redirect:/getalluser";
}
}
⑤编写jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head></head>
<body>
<table align='left' border='1' cellspacing='0'>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
</tr>
<c:forEach items="${userList}" var="u" varStatus="st">
<tr>
<td>${u.id}</td>
<td>${u.name}</td>
<td>${u.age}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
⑥重启访问,结果如下:
注意:热部署对pom.xml的修改以及Java文件夹的增加无效,所以这些都需要手动重启。