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

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

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

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

書籍整體結構

Spring Boot 是在Spring框架基礎上創建的一個全新框架,其設計目的是簡化Spring應用的搭建和開發過程,不但具有Spring的所有優秀特性,而且具有如下顯著特點:

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

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

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

第一部分 - 技術維度

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

第二部分 - 實踐維度

用生產環境中的實際案例講解如何使用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 Boot》閱讀筆記之一:基礎應用開發

實體持久化是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了(http://github.com/chenfromsz)。
後續在公司項目中實踐好,我再談談自己的使用經驗。

情情說

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