1、Spring Boot 概述
2、Spring Boot 入门案例
3、Spring Boot核心功能代码实战
4、项目源码与资料下载
5、参考文章javascript
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员再也不须要定义样板化的配置。简单的来讲 Spring Boot 这个项目整合目前不少的流行的第三方框架,而且作了一系列的默认配置,咱们无需在进行手动配置,直接拿过来直接使用! 接下来咱们比较一下Spring mvc和 Spring Boot的开发过程php
Spring mvc
(1)导入 spring mvc 的相关依赖包
(2)在 web.xml 文件中配置 Spring mvc 的前端控制器
(3)建立一个 spring mvc 的配置文件
(4)在 spring mvc 的配置文件中进行相关配置
1) 配置注解扫描路径
2)配置处理器映射器
3)配置处理器适配器
4)配置视图解析器
(5)开发 Controllercss
Spring Boot
(1)导入相关的依赖包
(2)开发 Controller
单单从开发步骤上讲都比咱们的原始开发少了不少,其中的配置部分 Spring Boot 帮咱们完成了,不须要咱们在进行配置,固然若是咱们想
更改 Spring Boot 的默认配置也是能够的.极大的简化了咱们的开发.html
(1)独立运行的 spring 项目: Spring Boot 能够以 jar 包形式直接运行,如 java -jar xxx.jar 优势是:节省服务器资源
(2)内嵌 servlet 容器: Spring Boot 能够选择内嵌 Tomcat,Jetty,这样咱们无须以 war 包形式部署项目。
(3)提供 starter 简化 Maven 配置: 在 Spring Boot 项目中为咱们提供了不少的 spring-boot-starter-xxx 的项目(咱们把这个依赖能够称之为起步依赖,咱们导入指定的这些项目的坐标,就会自动导入和该模块相关的依赖包:例如咱们后期再使用 Spring Boot 进行 web 开发咱们就须要导入 spring-boot-starter-web 这个项目的依赖,导入这个依赖之后!那么Spring Boot 就会自动导入 web 开发所须要的其余的依赖包,以下图所示:前端
(4)自动配置 spring: Spring Boot 会根据在类路径中的 jar 包,类,为 jar 包里的类自动配置 Bean,这样会极大减小咱们要使用的配置。固然 Spring Boot 只考虑了大部分开发场景,并非全部的场景,若是在实际的开发中咱们须要自动配置 Bean,而 Spring Boot 不能知足,则能够自定义自动配置。
(5)准生产的应用监控: Spring Boot 提供基于 http,ssh,telnet 对运行时的项目进行监控
(6)无代码生成和 xml 配置: Spring Boot 大量使用 spring4.x 提供的注解新特性来实现无代码生成和 xml 配置。spring4.x 提倡使用 Java配置和注解配置组合,而 Spring Boot 不须要任何 xml 配置便可实现 spring 的全部配置。java
3.1 优势
(1)快速构建项目
(2)对主流框架无缝集成
(3)项目能够独立运行,无需依赖外部 servlet 容器
(4)提供运行时的应用监控
(5)极大提升了开发,部署效率mysql
3.2 缺点
(1)资料相对比较少
(2)版本迭代较快jquery
建立后项目结构以下:web
main/java下新建包cn.itcast.startredis
resources文件夹下新建相关内容
<project xmlns="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>cn.itcast</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!--Spring Boot 项目默认的编译版本是 1.6,若是咱们想使用其余的编译版本咱们就须要在 pom.xml 文件中定义一个变量--> <java.version>1.8</java.version> </properties> <dependencies> <!-- 加入web开发的支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> </dependencies> <build> <plugins> <!-- maven的编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 没有该配置,devtools 不生效 --> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build> </project>
在cn.itcast.start.controller包下建立测试UserController.java
//@RestController注解至关于@ResponseBody + @Controller合在一块儿的做用 @RestController public class UserController { @RequestMapping("info") public User hello(){ User user = new User(); user.setUsername("张三丰"); user.setAddress("揭阳市"); return user; } }
package cn.itcast.start; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; //主Application类(加了SpringBootApplication的类),必定要放在代码的最外层,即Application.class与包同一级别 //这样能够保证在装配Bean的时候从Application所在的文件下从上向下扫描时,全部的类都会被装配进项目。 // 而若是写在某个包里,Application.class扫描时扫描不到其余class,所以springboot启动的时候没有报错,可是没办法进行访问 @SpringBootApplication public class MySpringBootApplication { public static void main(String[] args) { //入口运行类 SpringApplication.run(MySpringBootApplication.class, args); } }
建立后项目结构以下:
舒适提示:
(1)MySpringBootApplication启动类必定要放在代码的最外层,即Application.class与包同一级别,这样能够保证在装配Bean的时候从Application所在的文件下从上向下扫描时,全部的类都会被装配进项目。若是写在某个包里,Application.class扫描时扫描不到其余class,所以springboot启动的时候没有报错,可是没办法进行访问。
(2)@RestController注解至关于@ResponseBody + @Controller合在一块儿的做用
(3)@Controller注解若是没指定访问的url,那么该类下面的@RequestMapping方法不能出现重名(整个项目都不能够出现)
启动完成
浏览器进行访问
自从 spring3.0 之后 spring 提供了不少的注解来替代 xml 文件的配置.最为核心的是下面的两个注解:
(1)@Configuration 标注该类是一个配置类.相似于咱们定义的 applicationContext.xml
(2)@Bean 相似于咱们在以前的 spring 配置文件中配置的<bean id=”” class=””/>
有了上面的两个注解咱们就可使用编码的方式来完成 spring 的相关配置,接下来咱们就来使用 java 编码的方式来完成 spring 的配置
1.1 新建HelloService.java
在cn.itcast.start.service下新建HelloService.java类
package cn.itcast.start.service; public interface HelloService { public String sayHello(); }
1.2 新建HelloServiceImpl.java
cn.itcast.start.service.impl包下新建HelloServiceImpl.java
package cn.itcast.start.service.impl; import cn.itcast.start.service.HelloService; public class HelloServiceImpl implements HelloService { @Override public String sayHello() { return "Hello JavaConfig"; } }
建立后项目文件结构以下:
1.3 编写配置类
cn.itcast.start.config包下新建JavaConfigTest.java类
package cn.itcast.start.config; import cn.itcast.start.service.HelloService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class JavaConfigTest { public static void main(String[] args) { // 经过AnnotationConfigApplicationContext这个类获取Spring容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfiguration.class) ; HelloService helloService = applicationContext.getBean(HelloService.class) ; String result = helloService.sayHello() ; System.out.println(result); } }
1.4 运行JavaConfigTest.java
这个时候咱们应该就明白了 Spring Boot 项目之因此能作到不须要 xml 文件,是由于它使用了这两个注解替换了以前了 xml 文件的配置。
在咱们 web 开发中,存在不少的一些 css , js , 图片等等一些静态的资源文件!那么咱们应该把这些静态资源存储在什么目录下呢?Spring Boot 项目要求咱们将这个静态资源文件存储到 resources 目录下的 static 目录中; 固然这个配置是能够进行更改的,可是不建议更改!在进行访问的时候咱们不须要添加上 static 文件目录,Spring Boot 会自动在 static 目录中查找对应的资源文件.
咱们新建在resouces下的static文件夹就是用于存放静态资源的,静态资源的实战咱们会在下面的模板引擎(freemarker)进行介绍
Spring Boot 项目建议咱们使用模板引擎来进行页面视图的渲染,而不建议咱们使用 jsp! 所以内嵌的 tomcat 也没有提供 jsp 页面的支持.Spring Boot 提供了大量的模板引擎,包含: Freemarker , Groovy , Thymeleaf , Velocity 和 Mustache. 本次咱们就来说解一下 Spring Boot继承 freemarker 做为页面视图!
3.1 pom.xml添加依赖
<!--添加模板引擎(freemarker)依赖包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
3.2 添加静态资源文件
将项目源码与资料下载中的资源文件复制进去static文件夹下
3.3 添加模板引擎
Spring Boot 项目为咱们提供了一个 templates 目录专门用来存储模板文件的. 所以咱们须要将指定的模板文件放在该目录下! 模板文件的后缀名默认是 ftl.
3.4 新建访问Controller类
cn.itcast.start.controller包下新建JdController.java
package cn.itcast.start.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; //当使用Controller或RestController时,没指定访问的RequestMapping,那么全部的RequestMapping不能出现同名,不然启动会报错 @Controller public class JdController { /** * 需求:返回jd首页 */ @RequestMapping("list") public String jdList(){ return "index"; } }
3.5 运行项目并访问
4.1 新增模板文件
templates文件夹下新建模板文件file-upload.ftl
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用户添加</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="css/bootstrap-theme.min.css" /> <link rel="stylesheet" href="css/bootstrap.min.css" /> <script type="text/javascript" src="js/jquery-1.11.3.min.js" ></script> <script type="text/javascript" src="js/bootstrap.min.js" ></script> </head> <body class="container"> <center> <h1>文件上传表单</h1> </center> <form role="form" action="/fileUpload" enctype="multipart/form-data" method="post"> <div class="form-group"> <label for="inputfile">文件输入</label> <input type="file" id="inputfile" name="uploadFile"> </div> <button type="submit" class="btn btn-default">提交</button> </form> </body> </html>
4.2 新建上传文件 Controller
cn.itcast.start.controller包下新建UploadController.java
package cn.itcast.start.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import java.io.File; @Controller public class UploadController { /** * 需求:返回文件上传页面 */ @RequestMapping("file") public String jdList(){ return "file-Upload"; } @RequestMapping(value = "/fileUpload") @ResponseBody public String fileUpload(MultipartFile uploadFile) { try { File file = new File("D:\\images\\" + uploadFile.getOriginalFilename()) ; uploadFile.transferTo(file); } catch (Exception e) { e.printStackTrace(); } return "success" ; } }
4.3 运行项目并访问
Spring Boot 不建议咱们使用 jsp 页面做为视图的显示层,所以在 Spring Boot 中默认是不支持 jsp 页面的.若是咱们还想使用 jsp 页面就须要添加 jsp 页面的支持!
<!-- jsp的支持 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>
拦截器对使用 Spring mvc、Struts 的开发人员来讲特别熟悉,由于你只要想去作好一个项目必然会用到它。拦截器在咱们平时的项目中用处有不少,如:日志记录、用户登陆状态拦截、安全拦截等等。而 Spring Boot 内部集成的是 Spring mvc 控制框架,因此使用起来跟SpringMVC 没有区别,只是在配置上有点不一样。
下面演示拦截文件上传接口,并直接跳转到商城首页
6.1 编写拦截器
cn.itcast.start.interceptor包下新建CheckUserLoginInterceptor.java
package cn.itcast.start.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CheckUserLoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.sendRedirect("/list"); return false ; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
6.2 配置拦截器
cn.itcast.start.config包下新建InterceptorConfig.java
package cn.itcast.start.config; import cn.itcast.start.interceptor.CheckUserLoginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class InterceptorConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CheckUserLoginInterceptor()).addPathPatterns("/file") ; } }
舒适提示:file为接口访问的url
6.3 运行项目并访问
7.1 新建数据库
我已经准备好相应的.sql文件在项目源码与资料下载中,请直接使用Navicat for MySQL工具进行导入,数据库名为springboot_test,具体字段以下:
我已经插入了一条数据
7.2 pom.xml文件添加maven依赖
<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!--阿里巴巴数据链接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.28</version> </dependency>
7.3 添加配置文件
application.properties文件下添加如下内容:
#spring集成Mybatis环境 mybatis.type-aliases-package=cn.itcast.start.domain #加载Mybatis配置文件 mybatis.mapper-locations = classpath:mapper/*Mapper.xml mybatis.config-location = classpath:mapper/config/sqlMapConfig.xml spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.datasource.url = jdbc:mysql://localhost:3306/springboot_test?useUnicode=true&useSSL=true spring.datasource.username = root spring.datasource.password = 147258qq
mapper文件夹下新建UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="cn.itcast.start.mapper.UserMapper"> <select id="findAll" resultType="user"> select * from user </select> </mapper>
mapper/config文件夹下新建sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
建立后项目结构以下:
7.4 新建相关代码
cn.itcast.start.domain包下新建实体类User.java
package cn.itcast.start.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private Integer id; private String username; private Date birthday; private String sex; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
cn.itcast.start.mapper包下新建UserMapper.java
package cn.itcast.start.mapper; import java.util.List; import org.apache.ibatis.annotations.Mapper; import cn.itcast.start.domain.User; @Mapper public interface UserMapper { public List<User> findAll(); }
cn.itcast.start.service包下新建UserService.java
package cn.itcast.start.service; import java.util.List; import java.util.Map; import cn.itcast.start.domain.User; public interface UserService { /** * 根据接口查询所用的用户 */ }
cn.itcast.start.service.impl包下新建UserServiceImpl.java
package cn.itcast.start.service.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import redis.clients.jedis.JedisCluster; import cn.itcast.start.domain.User; import cn.itcast.start.mapper.UserMapper; import cn.itcast.start.service.UserService; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; public List<User> findAllUser() { List<User> list = userMapper.findAll(); return list; } }
cn.itcast.start.controller包下新建UserController.java
package cn.itcast.start.controller; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import cn.itcast.start.domain.User; import cn.itcast.start.service.UserService; //@RestController注解至关于@ResponseBody + @Controller合在一块儿的做用 @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("info") public User hello(){ User user = new User(); user.setUsername("张三丰"); user.setAddress("揭阳市"); return user; } @RequestMapping("list2") public List<User> list2(){ List<User> list = userService.findAllUser(); return list; } }
7.5 运行项目并访问
在进行项目开发阶段,咱们须要频繁的修改代码,来进行项目的测试!每一次进行项目代码修改的时候,咱们都须要进行项目从新启动,这样新添加的代码才能够生效!这种作法比较麻烦.咱们就可使用 Spring Boot 为咱们提供的: spring-boot-devtools,来进行项目的热部署! 咱们只须要引入对应的依赖包便可!
8.1 pom.xml文件添加相关配置
<!-- 热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>true</scope> </dependency> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 没有该配置,devtools 不生效 --> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>
8.2 application.properties文件添加配置
#热部署生效 spring.devtools.restart.enabled:true #设置重启的目录 spring.devtools.restart.additional-paths:src/main/java #classpath目录下的WEB-INF文件夹内容修改不重启 spring.devtools.restart.exclude:WEB-INF/**
8.3 idea修改配置
这样配置在myeclipse中已经能够实现热启动,可是在idea中配置好无效,下面须要修改idea中的两个配置
(1)setting –> compiler ,将 Build project automatically 勾选上
(2)alt + shift + a 搜索 registry 选第一个,弹出框后下拉找到compiler.automake.allow.when.app.running 勾选上便可。
(3)重启idea
8.4 运行项目并测试
浏览器访问以下
清除控制台信息
在代码中修改返回的参数
点击保存后,查看控制台,项目已经自动从新部署
从新访问浏览器
连接:https://pan.baidu.com/s/1lup1Wey-i9EW8G03-4ukig
提取码:737x
http://yun.itheima.com/course/471.html