Java之Spring Boot詳解(非原創)

文章大綱

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章