Java之Spring Boot詳解

故事愛人發表於2019-05-16

文章大綱

一、Spring Boot 概述
二、Spring Boot 入門案例
三、Spring Boot核心功能程式碼實戰
四、專案原始碼與資料下載
五、參考文章

 

一、Spring Boot 概述

1. 什麼是 Spring Boot

  Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。簡單的來說 Spring Boot 這個專案整合目前很多的流行的第三方框架,並且做了一系列的預設配置,我們無需在進行手動配置,直接拿過來直接使用! 接下來我們比較一下Spring mvc和 Spring Boot的開發過程

Spring mvc
(1)匯入 spring mvc 的相關依賴包
(2)在 web.xml 檔案中配置 Spring mvc 的前端控制器
(3)建立一個 spring mvc 的配置檔案
(4)在 spring mvc 的配置檔案中進行相關配置
  1) 配置註解掃描路徑
  2)配置處理器對映器
  3)配置處理器介面卡
  4)配置檢視解析器
(5)開發 Controller

Spring Boot
(1)匯入相關的依賴包
(2)開發 Controller
  單單從開發步驟上講都比我們的原始開發少了很多,其中的配置部分 Spring Boot 幫我們完成了,不需要我們在進行配置,當然如果我們想
  更改 Spring Boot 的預設配置也是可以的.極大的簡化了我們的開發.

2. Spring Boot 的核心功能

(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 的所有配置。

3. Spring Boot 的優點和缺點

3.1 優點
(1)快速構建專案
(2)對主流框架無縫整合
(3)專案可以獨立執行,無需依賴外部 servlet 容器
(4)提供執行時的應用監控
(5)極大提高了開發,部署效率

3.2 缺點
(1)資料相對比較少
(2)版本迭代較快

二、Spring Boot 入門案例

1. 新建maven專案

 
 
 

建立後專案結構如下:

 

2. 新建相關資料夾與包

main/java下新建包cn.itcast.start

 

resources資料夾下新建相關內容

 

3. pom.xml檔案新增maven依賴

<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>

4. 開發 Controller

在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;
    }
}

5. 開發啟動類HelloSpringBootApplication.java

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方法不能出現重名(整個專案都不可以出現)

6. 執行專案並訪問

 

啟動完成

 

瀏覽器進行訪問

 

三、Spring Boot核心功能程式碼實戰

1. 無 xml 配置的實現

  自從 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 檔案的配置。

2. 靜態資源的訪問

  在我們 web 開發中,存在很多的一些 css , js , 圖片等等一些靜態的資原始檔!那麼我們應該把這些靜態資源儲存在什麼目錄下呢?Spring Boot 專案要求我們將這個靜態資原始檔儲存到 resources 目錄下的 static 目錄中; 當然這個配置是可以進行更改的,但是不建議更改!在進行訪問的時候我們不需要新增上 static 檔案目錄,Spring Boot 會自動在 static 目錄中查詢對應的資原始檔.
  我們新建在resouces下的static資料夾就是用於存放靜態資源的,靜態資源的實戰我們會在下面的模板引擎(freemarker)進行介紹

3. 模板引擎(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. 檔案上傳

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 執行專案並訪問

 
 

5. Jsp 頁面的支援(瞭解)

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>

6. 攔截器

  攔截器對使用 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. 整合mybatis

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 執行專案並訪問

 
 

8. 專案熱部署(開發時使用)

  在進行專案開發階段,我們需要頻繁的修改程式碼,來進行專案的測試!每一次進行專案程式碼修改的時候,我們都需要進行專案重新啟動,這樣新新增的程式碼才可以生效!這種做法比較麻煩.我們就可以使用 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

相關文章