《深刻實踐Spring Boot》閱讀筆記:基礎應用開發

上上篇「1718總結與計劃」中提到,18年要對部分項目拆分,進行服務化,並對代碼進行重構。公司技術委員會也推薦使用spring boot,以前在各個技術網站中也瞭解過,它能夠大大簡化spring配置和各個組件的使用,與其關係密切的Spring Cloud能夠很好支持微服務的開發。java

爲了後續項目的應用,想利用這2天看下《深刻實踐Spring Boot》,這本書是17年雙十一期間在京東上買的,一直懶着沒看。這本書偏應用,適合初學者看,正文內容也就240多頁,看的會比較輕鬆。mysql

目前,看完了第一部分,約佔全書1/2內容,計劃初七上班前看完這本書。我會分3篇文章進行介紹,這篇文章首先介紹下這本書的總體結構,而後總結下第一部分的內容。git

我不會介紹具體的實現過程,只是把這本書想要講的內容串起來,重點說明下我認爲重要的內容。想深刻了解的,能夠直接看這本書,也能夠經過文中的一些概念搜索相關的文章閱讀。github

書籍總體結構

Spring Boot 是在Spring框架基礎上建立的一個全新框架,其設計目的是簡化Spring應用的搭建和開發過程,不但具備Spring的全部優秀特性,並且具備以下顯著特色:redis

  • 爲Spring開發提供更加簡單的使用和快速開發的技巧;
  • 具備開箱即用的默認配置功能,能根據項目依賴自動配置;
  • 具備功能更增強大的服務體系,包括嵌入式服務、安全、性能指標、監控檢查等;
  • 能夠再也不須要XML配置,讓應用更加輕巧和靈活;

2014年4月發佈了1.0.0版本,目前有2個版本,v1最新版本爲v1.5.10,v2最新版本爲v2.0.0.RC1。spring

本書從技術、實踐和原理3個維度對Spring Boot進行了系統且深刻的講解,做者由淺入深逐步帶咱們瞭解Spring Boot。sql

第一部分 - 技術維度

針對性地介紹了Spring Boot入門、數據庫的使用和訪問性能提高、界面設計、安全設計等重要技術知識,以實用性爲主,幫助咱們快速掌握Spring Boot開發方法和精髓,儘快融入生產實踐中。mongodb

第二部分 - 實踐維度

用生產環境中的實際案例講解如何使用Spring Boot開發分佈式應用和雲應用,以及如何用微服務構建高可用的服務平臺。數據庫

第三部分 - 原理維度

從源碼層面着重分析了Spring Boot的程序加載、自動配置、數據管理、S pring Cloud的配置管理、發現服務和負載均衡服務等核心功能的實現原理,幫助咱們更深入理解Spring Boot開發,掌握其精髓。緩存

很喜歡做者的章節安排,之後學習新技術時,能夠按照這個思路去學習。

Spring Boot入門

本章主要介紹開發環境的配置,包括安裝JDK,安裝IDEA、安裝Maven、安裝Git客戶端,建立了一個簡單的項目,演示如何使用Spring Boot。

使用Spring Initializr建立項目

IDEA提供了可視化的界面建立各類類型的項目,能夠經過Spring Initializr的方式,按要求建立Spring Boot項目。

Spring Initializr

一個簡單demo

項目建立完成後,會生成一個入口Applicaton類,進行以下的修改,就可提供reset接口,供使用者訪問。

@SpringBootApplication
@RestController
public class BookPart1Application {

	@RequestMapping("/")
	String home(){
		return "hello";
	}

	public static void main(String[] args) {
		SpringApplication.run(BookPart1Application.class, args);
	}
}
複製代碼
運行與發佈

運行Spring Boot項目很簡單,像普通項目同樣直接運行便可。

若是要發佈到線上Tomcat容器中,須要增長一個打包插件:spring-boot-maven-plugin,經過mvn package打包便可。

Spring Boot配置

能夠在工程的resources文件夾中建立一個application.properties或application.yml文件,該文件會被髮布在classpath中,被Spring Boot自動讀取。 做者推薦使用application.yml文件,由於它提供結構化及其嵌套的格式。

server:
  tomcat:
    uri-encoding: UTF-8
  port: 80
複製代碼

使用數據庫

使用數據庫是開發基本應用的基礎,Spring Boot 提供更加高層次上訪問數據庫。本章經過介紹使用MySQL、Redis、MongoDB、Neo4j來講明Spring Boot提供的便捷性。

使用MySQL

對於傳統關係型數據庫來講,Spring Boot使用JPA資源庫來實現對數據庫的操做,JPA是爲POJO提供持久化的標準規範,即將Java的普通對象經過對象關係映射持久化到數據庫中。

做者經過「實體建模」-> 「實體持久化」-> 「測試程序」的思路介紹MySQL的使用。

實體建模是經過註解描述與數據庫的對應關係,包括實體的屬性、實體之間的關係。

關係模型示例

實體持久化是Spring Data提供的強大功能,經過繼承於JPA資源庫JpaRepository接口,就能夠對數據庫進行增刪改查、分頁查詢和指定排序的字段等操做,不須要本身實現。

public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAll(Iterable<ID> var1);

    <S extends T> List<S> save(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
複製代碼

JPA還提供了一些自定義聲明方法的規則,這些方法也不用實現,JPA將會代理實現這些方法,十分方便。

使用Redis

Redis沒有表結構的概念,因此要實現MySQL數據庫表的數據在Redis中存取,必須作一些轉換,可使用JSON格式的文本做爲Redis與Java普通對象互相交換數據的存儲格式。

經過RedisTemplate能夠很方便的操做Redis。

對於Redis的使用,還能夠將註解方式(@Cacheable、@CachePut、@CacheEvict)與調用數據庫的方法相結合,就不用編寫redis操做服務類了,使用起來也更簡單。不過只能對簡單對象進行相關操做,對於想實體User包含必定關係的複雜對象,或其餘集合、列表對象,就不能使用簡單註解方式來實現,還得使用RedisTemplate。

public class RoleService { 
    @Autowired 
    private RoleRepository roleRepository;
    @Autowired 
    private RoleRedis roleRedis;
 
 
    @Cacheable(value = "mysql:findById:role", keyGenerator = "simpleKey") 
    public Role findById(Long id) {
        return roleRepository.findOne(id);
    } 
 
    @CachePut(value = "mysql:findById:role", keyGenerator = "objectId") 
    public Role create(Role role) {
        return roleRepository.save(role);
    } 
 
    @CachePut(value = "mysql:findById:role", keyGenerator = "objectId") 
    public Role update(Role role) {
        return roleRepository.save(role);
    } 
 
    @CacheEvict(value = "mysql:findById:role", keyGenerator = "simpleKey") 
    public void delete(Long id) {
        roleRepository.delete(id);
    } 
}
複製代碼
使用MongoDB

MongoDB是文檔型的NoSQL數據庫,具備大數據量、高併發等優點,但缺點是不能創建實體關係,並且也沒有事務管理機制。

MongoDB 也有像使用JPA那樣的資源庫,引入spring-data-mongodb和spring-boot-starter-hateoas依賴庫,這裏就不過多介紹了。

使用Neo4j

Neo4j是一個高性能的NoSQL圖數據庫,而且具有徹底事務特性,同時具有傳統關係型數據庫的優勢,又具有NOSQL數據庫優點。

Neo4j將結構化數據存儲在一張圖上,圖中每個節點的屬性表示數據的內容,每一條有向邊表示數據的關係。它沒有表結構的概念,它的數據用節點的屬性來表示。

舉個例子,如今有演員和電影兩個實體,它們的關係表現爲一個演員在一部電影中扮演一個角色。那麼就能夠建立演員和電影兩個節點實體,和一個角色關係實體。

Neo4j舉例

它更加形象和貼切地表現了實體之間的關係,並且這個實體-關係模型是能夠不通過任何轉換而直接存入數據庫的,這將很大程度上減輕設計工做和溝通成本。

像JPA使用了ORM同樣,Neo4j使用了對象-圖形映射OGM的方式來建模。

@RelationshipEntity(type = "ACTS_IN") 
public class Role { 
    @GraphId 
    Long id;
    String role;
    @StartNode 
    Actor actor;
    @EndNode 
    Movie movie;
 
    public Role() { 
    } 
 
    public Role(Actor actor, Movie movie, String name) {
        this.actor = actor;
        this.movie = movie;
        this.role = name;
    } 
}
複製代碼

從上面的介紹能夠看出,在Spring Boot框架中使用數據庫很是簡單、容易,主要得益於Spring Boot資源庫的強大功能,Spring Boot整合了第三方資源,把複雜的操做變成簡單的調用。

界面設計

本章使用Spring Boot框架設計Web顯示界面,使用MVC的概念將數據管理、事件控制、界面顯示進行分層處理,實現多層結構設計。使用過MVC框架的比較好理解,這裏就不過多說明了。

其中界面顯示使用Thymeleaf模板,以前沒接觸過,簡單說明下。Thymeleaf是現代化服務器端的Java模板引擎,不一樣與JSP和FreeMarker,Thymeleaf的語法更加接近HTML,而且也有不錯的擴展性。

提升數據庫訪問性能

使用關係型數據庫的應用系統的性能瓶頸最終仍是數據庫。本章經過如下幾種方式提升數據庫訪問性能:

  • 使用Druid
  • 擴展JPA功能
  • 使用Redis作緩存
使用Druid

Druid是一個關係型數據庫鏈接池,是阿里巴巴的一個開源項目,在監控、可擴展性、穩定性和性能方面具備明顯的優點。經過使用Druid鏈接池,能夠必定程度上提升數據庫的訪問性能。

擴展JPA功能

使用JPA,在資源庫接口定義中不但能夠按照其規則約定的方法聲明各類方法,還可使用註解@Query來定義一些簡單的查詢語句,優化SQL語句。

能夠經過自定義一個接口,繼承於JpaRepository,擴展已有的JPA接口。自定義接口必須在程序啓動時裝配,才能正常使用。而後,在JPA配置類中,經過@EnableJpaRepositories加載定義的裝配類。

public interface UserRepository extends ExpandJpaRepository<User, Long> {
    @Query("select t from User t where t.name =?1 and t.email =?2")
    User findByNameAndEmail(String name, String email);
 
    @Query("select t from User t where t.name like :name")
    Page<User> findByName(@Param("name") String name, Pageable pageRequest);
} 
複製代碼
使用Redis作緩存

前面「使用Redis」已經介紹。

安全設計

Web應用的安全管理,主要包括兩個方面的內容:一方面是用戶身份驗證,即用戶登陸的設計;另外一方面是用戶受權,即一個用戶在一個應用系統中可以執行哪些操做的權限管理。

權限管理的設計通常使用角色來管理,給一個用戶賦予哪些角色,用戶就具備哪些權限。本章主要使用spring-cloud-security來進行安全管理設計。

使用時,須要繼承spring-cloud-starter-parent,並引入spring-cloud-starter-security依賴。

關於系統的安全管理及各類設計,Spring Security已經大致上都實現了,只須要進行一些配置和引用,就可以正常使用了。具體實現就不在此重複描述了。

好多實現細節,我沒有展示出來,一方面會顯得篇幅太長,主次不鮮明,另外一方面做者把全部代碼都放到github了(github.com/chenfromsz)。 後續在公司項目中實踐好,我再談談本身的使用經驗。

情情說
相關文章
相關標籤/搜索