SpringBoot 入門簡介

Spring-Boot 學習筆記

1 Spring-Boot 介紹

1.1 什麼是Spring-Boot

  • Spring-Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。我的理解來講Spring-Boot其實不是什麼新的框架,它默認配置了不少框架的使用方式,就像maven整合了全部的jar包,Spring-Boot整合了其餘相關聯框架。
  • Spring-Boot 基於Spring框架,而Spring-Cloud基於Spring-Boot,爲微服務體系開發中的架構問題,提供了一整套的解決方案——服務註冊與發現,服務消費,服務保護與熔斷,網關,分佈式調用追蹤,分佈式配置管理等。
  • Spring-Boot 四大特性:自動配置起步依賴Actuator命令行界面(CLI)

1.2 爲何要使用Spring-Boot

  • 區別於Spring-Boot之前的Spring和其餘框架的整合例如Mybatis,Shiro等都須要配置文件,項目中的配置文件愈來愈多,也愈來愈繁瑣。項目中經常由於配置文件出錯的緣由,致使項目運行出錯。
  • 而Spring-Boot能夠說就是爲了解決繁雜配置而出現的解決方案。Spring-Boot理念能夠理解爲:約定大於配置。快速整合第三方框架,減小甚至不須要配置文件,解決了以往的Spring框架下的弊端。
  • 由於配置文件少了,代碼變少了,第三方框架帶來的煩惱變少了,對於一個開發團隊來講,更加利於開發,後期維護也更加簡單。
  • 要使用Spring-Cloud前應該掌握Spring-Boot

1.2.1 Spring-Boot 自動配置

傳統的Spring web項目配置須要通過如下步驟:html

  • 1)配置web.xml,加載Spring和Spring MVC
  • 2)配置數據庫鏈接、配置Spring事務
  • 3)配置加載配置文件的讀取,開啓註解
  • 4)配置日誌文件
  • 配置完成以後部署tomcat 調試

可是針對一些單一業務需求的項目,例如該項目只是實現一個郵件收發,表格導出等單一功能,配置步驟便顯得麻煩。java

Spring-Boot的自動配置則可以簡化不少配置,減小傳統開發步驟,直接開展項目。mysql

1.2.2 Spring-Boot 起步依賴

  1. Spring-Boot啓動時回去導入spring-boot-autoconfigure包下META-INF/spring.factories配置文件
  2. 根據XxxxAutoConfiguration配置類的條件註解@Conditional判斷當前環境中是否知足XxxxAutoConfiguration的註解條件,若是知足,則自動向Spring IOC 容器中注入bean

1.2.3 Spring-Boot Actuator

  • Spring-Boot爲了改善傳統Spring應用繁雜的配置內容,採用了包掃描和自動化配置的機制,加載了原來在xml文件中的內容。自動配置有利有弊,有利的地方是讓代碼看上去更加簡潔,反面則形成了分析應用中資源和實例的各類關係變得困難(實例建立和依賴關係等信息都被離散到了各個配置類的註解上)
應用配置類:獲取應用程序中加載的應用配置、環境變量、自動化配置報告等與Spring-Boot應用密切相關的配置類信息。
  
  度量指標類:獲取應用程序運行過程當中用於監控的度量指標,好比:內存信息、線程池信息、HTTP請求統計等。
  
  操做控制類:提供了對應用的關閉等操做類功能。
  • Actuator這類端點的出現意義就是爲了幫助咱們輕鬆的獲取一系列關於Spring 應用配置內容的詳細報告,好比:自動化配置的報告、Bean建立的報告、環境屬性的報告等。
  • Actuator提供瞭如下監控方式

圖片描述

  • Actuator 提供了 13 個接口,具體以下表所示

圖片描述

  • 經過在配置文件中加入 management.security.enabled=false

例如:
圖片描述
圖片描述web

1.2.4 Spring-Boot CLI

Spring-Boot CLI是一個命令行工具,可用於快速搭建基於Spring的原型。它支持運行Groovy腳本,這也就意味着你可使用相似Java的語法,但不用寫不少的模板代碼。算法

  • 首先下載Spring-Boot CLI

https://docs.spring.io/spring...spring

圖片描述

  • 配置環境變量

在PATH 中配置Spring-Boot CLI文件夾下bin的路徑:
D:spring-boot-cli-1.5.9.RELEASE-binspring-1.5.9.RELEASEbinsql

  • 打開CMD查看是否安裝成功

輸入 spring --version (注意是--)數據庫

圖片描述

  • 使用命令初始化項目

spring init --build=maven --java-version=1.8 --dependencies=web --packaging=jar --boot-version=1.5.9.RELEASE --groupId=com.example.demo --artifactId=javenjson

圖片描述

--build:表示項目構建工具maven,也能夠選擇gradle
--java-version:表示JDK版本
--dependencies=web:表示依賴web插件
--packaging:表示打包程序方式
--boot-version:選擇 spring boot的版本
--groupId:maven的groupId
--artifactId:maven的artifactId

圖片描述

將生成的javan.zip導入eclipse(STS)中便可spring-mvc

1.3 更簡潔的報錯信息

圖片描述
Spring-Boot相比於之前的控制檯報錯信息,更加人性化和簡潔。

2 Spring-Boot 環境要求

  • 默認狀況下,Spring-Boot 1.3.0 Build-snapshot 須要Java 7 以及Spring框架 4.1.3或以上,若是在Java 6下使用Spring-Boot,須要添加額外的配置。
  • 雖然能夠在Java 6 和 java 7下使用Spring-Boot,可是官方建議在Java 8下使用Spring-Boot
  • 構建環境明確支持有Maven(3.2+)和Gradle(1.12+)。

2.1 Spring-Boot 內嵌servlet 容器

Spring-Boot內嵌容器支持開箱即用(out of the box)
圖片描述

也可使用Spring-Boot應用部署到任何兼容Servlet 3.0+的容器。

3 建立 Spring-Boot 項目

3.1 三種建立Spring-Boot項目的方式:

進行項目名稱等設置並選擇版本、依賴。而後會下載這個項目的壓縮文件,解壓後,使用 eclipse,Import -> Existing Maven Projects -> Next ->選擇解壓後的文件夾-> Finsh 成功導入該項目

  • 2) 使用Spring-Boot 插件,在eclipse中new一個 Spring starter project,並選擇須要的依賴。(第一次構建會很慢)
  • 3) 用maven構建項目

上面 1)、2)的構建方式中生成的pom.xml文件中默認有兩個模塊:

  • spring-boot-starter :核心模塊,包括自動配置支持、日誌和yml;
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
</parent>
  • spring-boot-starter-test :測試模塊,包括JUnit、Hamcrest、Mockito。
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
</dependency>

3.2 Spring-Boot熱部署:

  • 只用在pom.xml裏面依賴devtools便可
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional>
</dependency>

3.2.1 Spring-Boot熱部署從新編譯類文件

  • 熱部署指的是:當咱們修改了一個java類的時候,咱們只須要從新編譯一下,Spring-Boot的就會重啓了。由於devtools會監聽classpath下的文件變更,因此當java類從新編譯的時候,devtools會監聽到這個變化,而後就會從新啓動Spring-Boot。這個重啓是很是快的一個過程。由於在Spring-Boot中有兩個類加載器,一個是加載工程外部資源的,如jar包,還有一個類加載器是用來加載本工程的class的。因此在重啓Spring-Boot的時候只加載本工程的class文件。

3.2.2 Spring-Boot熱部署監聽文件夾的變化

  • 若是你不想從新編譯java類的話,還有一種方式用來讓Spring-Boot重啓,那就是讓devtools監聽文件夾的變化:好比咱們想讓com.example.springboot這個文件夾下的文件改變的時候,從新啓動Spring-Boot,那麼咱們只要在application.properties中添加這樣一句話就好了:spring.devtools.restart.additional-paths=com\example\springboot

3.2.3 Spring-Boot熱部署頁面熱部署

  • devtools能夠實現頁面熱部署,即頁面修改後會當即生效。你能夠在application.properties文件中配置spring.thymeleaf.cache=false來實現這個功能。

3.3 Spring-Boot Maven插件:

3.3.1 Spring-Boot maven插件做用:

  • Spring-Boot的Maven插件(spring-boot-maven-plugin)可以以Maven的方式爲應用提供Spring-Boot的支持,即爲Spring-Boot應用提供了執行Maven操做的可能。
  • spring-boot-maven-plugin可以將Spring-Boot應用打包爲可執行的jar或war文件,而後以一般的方式運行Spring Boot應用。
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

3.3.2 Spring-Boot Maven plugin的5個Goals:

  • spring-boot: repackage,默認goal。在mvn package以後,再次打包可執行的jar/war,同時保留mvn package生成的jar/war爲.origin
  • spring-boot: run,運行Spring-Boot應用
  • spring-boot: start,在mvn integration-test階段,進行Spring-Boot應用生命週期的管理
  • spring-boot: stop,在mvn integration-test階段,進行Spring-Boot應用生命週期的管理
  • spring-boot: build-info,生成Actuator使用的構建信息文件build-info.properties

3.4 application.properties和application.yml

yml: Spring-Boot會加載的配置文件(和properties功能一致,只是文件編輯的格式不一樣)
除此以外: application.properties 配置中文值的時候,讀取出來的屬性值會出現亂碼問題。可是 application.yml 不會出現亂碼問題。緣由是,Spring-Boot 是以 iso-8859 的編碼方式讀取 application.properties 配置文件。
如下是 .properties和 .yml格式對比

3.4.1 application.properties :

  • Spring-Data JPA數據源配置
spring.datasource.url=jdbc:mysql://localhost:3306/yourDB
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true

spring.thymeleaf.cache=false

3.4.2 application.yml :

  • Spring-Data JPA數據源配置
spring:
    datasource:
        url: jdbc:mysql://localhost:3306/yourDB
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
    jpa:
        properties.hibernate.hbm2ddl.auto: update
        properties.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
        
        show-sql: true
    thymeleaf:
        cache: false

yml的格式特色:縮進式,"="號使用":"替代,":"以後要使用空格。
yml比properties更能清晰體現結構以及內容,相似eclipse裏面的包路徑展現方式

3.5 Spring-Boot Application.class

  • Spring-Boot因爲內嵌入了Tomcat,在jar項目下,直接開啓Application.class就能直接加載配置並開啓Tomcat。

@PropertySource 掃描指定路徑下的properties

@SpringBootApplication
@PropertySource("classpath:prop/application.properties")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3.6 jasypt-Spring-Boot 配置文件加密

  • 在配置文件.properties或.yml中,數據庫鏈接的帳號密碼不該該直接暴露。而Spring-Boot與jasypt的整合包能夠對咱們的配置文件的帳號密碼進行加密。
@EnableEncryptableProperties
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Deserializers.Base.class)
//@SpringBootTest
public class JaysptTest {
    @Autowired
    private StringEncryptor stringEncryptor;//密碼解碼器注入

    @Test
    public void test() {
        System.out.println("生成加密後的數據庫用戶名:"+stringEncryptor.encrypt("root"));
        System.out.println("生成加密後的數據庫密碼:"+stringEncryptor.encrypt("root"));    
    }
}
  • 獲得加密後的信息:
生成加密後的數據庫用戶名:5KtXuBsNjeQtOuUOR8PPMg==
生成加密後的數據庫密碼:Y/SEuMVPbIqgimIKqnxFrg==

在配置文件中修改:

  • jasypt.encryptor.password:能夠理解爲加鹽

默認狀況下jasypt採用的算法是PBEWithMD5AndDES,該算法對同一串明文每次加密的密文都不同,比較適合作數據加解密。可是該算法必須配置密碼,咱們在yml文件配置以下參數

jasypt:
  encryptor:
    password: 123456
  • 加密後的字符串須要放進ENC()裏面
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/sbjpa?useUnicode=true&characterEncoding=UTF-8
    username: ENC(5KtXuBsNjeQtOuUOR8PPMg==)
    password: ENC(Y/SEuMVPbIqgimIKqnxFrg==)
    driver-class-name: com.mysql.jdbc.Driver

4 使用Spring-Boot Web項目綜合開發

4.1 Spring-Boot 在Controller下的特別註解

  • @RestController 的意思就是controller裏面的方法都以json格式輸出,不用再進行jackjson、fastjson的配置。
@RestController
public class UsersController {

    @RequestMapping("/users")
    public Map<String, Object> getUsers() {
        Map<String, Object> map = new HashMap<>();
        Users users = new Users();
        users.setUid(001);
        users.setUserName("administrator");
        users.setUserSex("simpleBoy");
        users.setUserAge(16);
        map.put("users", users);
        return map;
    }
}

輸出結果爲json對象:圖片描述

4.2 Spring-Boot下使用Mybatis

相比以往復雜的配置,Spring-Boot的配置至關簡單:

    1. 添加相關依賴
<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
</dependency>

4.2.1 無配置文件版使用Mybatis

只用添加相關依賴和application.yml並配合註解便可

  1. 相關的主要依賴(web、mybatis-spring-boot、mysql-connector)
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
        <!--Spring Boot-->
        <!--支持 Web 應用開發,包含 Tomcat 和 spring-mvc -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
        <!--模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>
    <!--添加適用於生產環境的功能,如性能指標和監測等功能。 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    <-- 這裏使用的是MySQL數據庫--!>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
    1. application.yml
mybatis:
    type-aliases-package: com.example.demo.po
    
spring:
    datasource: 
      url: jdbc:mysql://localhost:3306/sbjpa
      username: root
      password: root
      driverClassName: com.mysql.jdbc.Driver
    1. Application.java啓動類上加上註解
  • 在啓動類中添加對mapper包掃描@MapperScan
  • @MapperScan("com.example.*.dao")掃描多個包下的mapper,能夠有如下幾種方法掃描
1. @MapperScan("com.example.*.dao")
2. @MapperScan("com.example.test1.dao,com.example.test2.dao")
@SpringBootApplication
@MapperScan("com.example.*.dao")
public class SpringBootMybatisApplication {

    public static void main(String[] args) {
          SpringApplication.run(SpringBootMybatisApplication.class, args);
    }
}
  • Spring-Boot會自動加載spring.datasource.*相關配置,數據源就會自動注入到sqlSessionFactory中,sqlSessionFactory會自動注入到Mapper中,能夠直接使用。要麼在其餘Mapper類上加@Mapper註解,前者更加方便。
public interface UsersMapper {

    @Select("select * from users")
    @Results({ @Result(property = "userName", column = "user_name"), @Result(property = "userSex", column = "user_sex"),
            @Result(property = "userAge", column = "user_age") })
    public List<Users> getAll();

    @Insert("insert into users(user_name,user_sex,user_age) values(#{usersName},#{userSex},#{userAge})")
    public void insert(Users users);

    @Update("update users set user_name=#{usersName},user_sex=#{userSex},user_age=#{userAge}")
    public void update(Users users);

    @Delete("delete from users where uid=#{uid}")
    public void delete(Integer uid);
}

4.2.2 有配置文件XML下的Mybatis使用

  • @MapperScan("com.example.*.dao")掃描多個包下的mapper,能夠有如下幾種方法掃描
1. @MapperScan("com.example.*.dao")
2. @MapperScan("com.example.test1.dao,com.example.test2.dao")
@SpringBootApplication
@MapperScan("com.example.*.dao")
public class SpringBootMybatisApplication {

    public static void main(String[] args) {
          SpringApplication.run(SpringBootMybatisApplication.class, args);
    }
}
  • 1.application.properties
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.example.*.po

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/sbmybatis?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password =
  • 2.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="com.neo.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.neo.entity.UserEntity">
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="userName" property="userName" jdbcType="VARCHAR" />
        <result column="passWord" property="passWord" jdbcType="VARCHAR" />
        <result column="user_sex" property="userSex" javaType="com.neo.enums.UserSexEnum" />
        <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
    </resultMap>

    <sql id="Base_Column_List">
        id, userName, passWord, user_sex, nick_name
    </sql>

    <sql id="Base_Where_List">
        <if test="userName != null  and userName != ''">
            and userName = #{userName}
        </if>
        <if test="userSex != null and userSex != ''">
            and user_sex = #{userSex}
        </if>
    </sql>

    <select id="getAll" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List" />
        FROM users
    </select>
    
    <select id="getList" resultMap="BaseResultMap" parameterType="com.neo.param.UserParam">
        select
        <include refid="Base_Column_List" />
        from users
        where 1=1
        <include refid="Base_Where_List" />
        order by id desc
        limit #{beginLine} , #{pageSize}
    </select>

    <select id="getCount" resultType="Integer" parameterType="com.neo.param.UserParam">
        select
        count(1)
        from users
        where 1=1
        <include refid="Base_Where_List" />
    </select>

    <select id="getOne" parameterType="Long" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List" />
        FROM users
        WHERE id = #{id}
    </select>

    <insert id="insert" parameterType="com.neo.entity.UserEntity">
        INSERT INTO
        users
        (userName,passWord,user_sex)
        VALUES
        (#{userName}, #{passWord}, #{userSex})
    </insert>

    <update id="update" parameterType="com.neo.entity.UserEntity">
        UPDATE
        users
        SET
        <if test="userName != null">userName = #{userName},</if>
        <if test="passWord != null">passWord = #{passWord},</if>
        nick_name = #{nickName}
        WHERE
        id = #{id}
    </update>

    <delete id="delete" parameterType="Long">
        DELETE FROM
        users
        WHERE
        id =#{id}
    </delete>

</mapper>
相關文章
相關標籤/搜索