溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

《深入實(shí)踐Spring Boot》閱讀筆記之一:基礎(chǔ)應(yīng)用開發(fā)

發(fā)布時(shí)間:2020-07-26 00:11:05 來源:網(wǎng)絡(luò) 閱讀:333 作者:情情說 欄目:開發(fā)技術(shù)

為了后續(xù)項(xiàng)目的應(yīng)用,想利用這2天看下《深入實(shí)踐Spring Boot》,這本書是17年雙十一期間在京東上買的,一直懶著沒看。這本書偏應(yīng)用,適合初學(xué)者看,正文內(nèi)容也就240多頁,看的會(huì)比較輕松。

目前,看完了第一部分,約占全書1/2內(nèi)容,計(jì)劃初七上班前看完這本書。我會(huì)分3篇文章進(jìn)行介紹,這篇文章首先介紹下這本書的整體結(jié)構(gòu),然后總結(jié)下第一部分的內(nèi)容。

我不會(huì)介紹具體的實(shí)現(xiàn)過程,只是把這本書想要講的內(nèi)容串起來,重點(diǎn)說明下我認(rèn)為重要的內(nèi)容。想深入了解的,可以直接看這本書,也可以通過文中的一些概念搜索相關(guān)的文章閱讀。

書籍整體結(jié)構(gòu)

Spring Boot 是在Spring框架基礎(chǔ)上創(chuàng)建的一個(gè)全新框架,其設(shè)計(jì)目的是簡化Spring應(yīng)用的搭建和開發(fā)過程,不但具有Spring的所有優(yōu)秀特性,而且具有如下顯著特點(diǎn):

  • 為Spring開發(fā)提供更加簡單的使用和快速開發(fā)的技巧;
  • 具有開箱即用的默認(rèn)配置功能,能根據(jù)項(xiàng)目依賴自動(dòng)配置;
  • 具有功能更加強(qiáng)大的服務(wù)體系,包括嵌入式服務(wù)、安全、性能指標(biāo)、監(jiān)控檢查等;
  • 可以不再需要XML配置,讓應(yīng)用更加輕巧和靈活;

2014年4月發(fā)布了1.0.0版本,目前有2個(gè)版本,v1最新版本為v1.5.10,v2最新版本為v2.0.0.RC1。

本書從技術(shù)、實(shí)踐和原理3個(gè)維度對Spring Boot進(jìn)行了系統(tǒng)且深入的講解,作者由淺入深逐步帶我們了解Spring Boot。

第一部分 - 技術(shù)維度

針對性地介紹了Spring Boot入門、數(shù)據(jù)庫的使用和訪問性能提升、界面設(shè)計(jì)、安全設(shè)計(jì)等重要技術(shù)知識,以實(shí)用性為主,幫助我們快速掌握Spring Boot開發(fā)方法和精髓,盡快融入生產(chǎn)實(shí)踐中。

第二部分 - 實(shí)踐維度

用生產(chǎn)環(huán)境中的實(shí)際案例講解如何使用Spring Boot開發(fā)分布式應(yīng)用和云應(yīng)用,以及如何用微服務(wù)構(gòu)建高可用的服務(wù)平臺(tái)。

第三部分 - 原理維度

從源碼層面著重分析了Spring Boot的程序加載、自動(dòng)配置、數(shù)據(jù)管理、S
pring Cloud的配置管理、發(fā)現(xiàn)服務(wù)和負(fù)載均衡服務(wù)等核心功能的實(shí)現(xiàn)原理,幫助我們更深刻理解Spring Boot開發(fā),掌握其精髓。

很喜歡作者的章節(jié)安排,以后學(xué)習(xí)新技術(shù)時(shí),可以按照這個(gè)思路去學(xué)習(xí)。

Spring Boot入門

本章主要介紹開發(fā)環(huán)境的配置,包括安裝JDK,安裝IDEA、安裝Maven、安裝Git客戶端,創(chuàng)建了一個(gè)簡單的項(xiàng)目,演示如何使用Spring Boot。

使用Spring Initializr創(chuàng)建項(xiàng)目

IDEA提供了可視化的界面創(chuàng)建各種類型的項(xiàng)目,可以通過Spring Initializr的方式,按要求創(chuàng)建Spring Boot項(xiàng)目。

《深入實(shí)踐Spring Boot》閱讀筆記之一:基礎(chǔ)應(yīng)用開發(fā)

一個(gè)簡單demo

項(xiàng)目創(chuàng)建完成后,會(huì)生成一個(gè)入口Applicaton類,進(jìn)行如下的修改,就可提供reset接口,供使用者訪問。

@SpringBootApplication
@RestController
public class BookPart1Application {

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

    public static void main(String[] args) {
        SpringApplication.run(BookPart1Application.class, args);
    }
}
運(yùn)行與發(fā)布

運(yùn)行Spring Boot項(xiàng)目很簡單,像普通項(xiàng)目一樣直接運(yùn)行即可。

如果要發(fā)布到線上Tomcat容器中,需要增加一個(gè)打包插件:spring-boot-maven-plugin,通過mvn package打包即可。

Spring Boot配置

可以在工程的resources文件夾中創(chuàng)建一個(gè)application.properties或application.yml文件,該文件會(huì)被發(fā)布在classpath中,被Spring Boot自動(dòng)讀取。 作者推薦使用application.yml文件,因?yàn)樗峁┙Y(jié)構(gòu)化及其嵌套的格式。

server:
  tomcat:
    uri-encoding: UTF-8
  port: 80
使用數(shù)據(jù)庫

使用數(shù)據(jù)庫是開發(fā)基本應(yīng)用的基礎(chǔ),Spring Boot 提供更加高層次上訪問數(shù)據(jù)庫。本章通過介紹使用MySQL、Redis、MongoDB、Neo4j來說明Spring Boot提供的便捷性。

使用MySQL

對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫來說,Spring Boot使用JPA資源庫來實(shí)現(xiàn)對數(shù)據(jù)庫的操作,JPA是為POJO提供持久化的標(biāo)準(zhǔn)規(guī)范,即將Java的普通對象通過對象關(guān)系映射持久化到數(shù)據(jù)庫中。

作者通過「實(shí)體建?!?> 「實(shí)體持久化」-> 「測試程序」的思路介紹MySQL的使用。

實(shí)體建模是通過注解描述與數(shù)據(jù)庫的對應(yīng)關(guān)系,包括實(shí)體的屬性、實(shí)體之間的關(guān)系。
《深入實(shí)踐Spring Boot》閱讀筆記之一:基礎(chǔ)應(yīng)用開發(fā)

實(shí)體持久化是Spring Data提供的強(qiáng)大功能,通過繼承于JPA資源庫JpaRepository接口,就可以對數(shù)據(jù)庫進(jìn)行增刪改查、分頁查詢和指定排序的字段等操作,不需要自己實(shí)現(xiàn)。

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還提供了一些自定義聲明方法的規(guī)則,這些方法也不用實(shí)現(xiàn),JPA將會(huì)代理實(shí)現(xiàn)這些方法,十分方便。

使用Redis

Redis沒有表結(jié)構(gòu)的概念,所以要實(shí)現(xiàn)MySQL數(shù)據(jù)庫表的數(shù)據(jù)在Redis中存取,必須做一些轉(zhuǎn)換,可以使用JSON格式的文本作為Redis與Java普通對象互相交換數(shù)據(jù)的存儲(chǔ)格式。

通過RedisTemplate可以很方便的操作Redis。

對于Redis的使用,還可以將注解方式(@Cacheable、@CachePut、@CacheEvict)與調(diào)用數(shù)據(jù)庫的方法相結(jié)合,就不用編寫redis操作服務(wù)類了,使用起來也更簡單。不過只能對簡單對象進(jìn)行相關(guān)操作,對于想實(shí)體User包含一定關(guān)系的復(fù)雜對象,或其他集合、列表對象,就不能使用簡單注解方式來實(shí)現(xiàn),還得使用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數(shù)據(jù)庫,具有大數(shù)據(jù)量、高并發(fā)等優(yōu)勢,但缺點(diǎn)是不能建立實(shí)體關(guān)系,而且也沒有事務(wù)管理機(jī)制。

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

使用Neo4j

Neo4j是一個(gè)高性能的NoSQL圖數(shù)據(jù)庫,并且具備完全事務(wù)特性,同時(shí)具備傳統(tǒng)關(guān)系型數(shù)據(jù)庫的優(yōu)點(diǎn),又具備NOSQL數(shù)據(jù)庫優(yōu)勢。

Neo4j將結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在一張圖上,圖中每一個(gè)節(jié)點(diǎn)的屬性表示數(shù)據(jù)的內(nèi)容,每一條有向邊表示數(shù)據(jù)的關(guān)系。它沒有表結(jié)構(gòu)的概念,它的數(shù)據(jù)用節(jié)點(diǎn)的屬性來表示。

舉個(gè)例子,現(xiàn)在有演員和電影兩個(gè)實(shí)體,它們的關(guān)系表現(xiàn)為一個(gè)演員在一部電影中扮演一個(gè)角色。那么就可以創(chuàng)建演員和電影兩個(gè)節(jié)點(diǎn)實(shí)體,和一個(gè)角色關(guān)系實(shí)體。
《深入實(shí)踐Spring Boot》閱讀筆記之一:基礎(chǔ)應(yīng)用開發(fā)

它更加形象和貼切地表現(xiàn)了實(shí)體之間的關(guān)系,而且這個(gè)實(shí)體-關(guān)系模型是可以不經(jīng)過任何轉(zhuǎn)換而直接存入數(shù)據(jù)庫的,這將很大程度上減輕設(shè)計(jì)工作和溝通成本。

像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框架中使用數(shù)據(jù)庫非常簡單、容易,主要得益于Spring Boot資源庫的強(qiáng)大功能,Spring Boot整合了第三方資源,把復(fù)雜的操作變成簡單的調(diào)用。

界面設(shè)計(jì)

本章使用Spring Boot框架設(shè)計(jì)Web顯示界面,使用MVC的概念將數(shù)據(jù)管理、事件控制、界面顯示進(jìn)行分層處理,實(shí)現(xiàn)多層結(jié)構(gòu)設(shè)計(jì)。使用過MVC框架的比較好理解,這里就不過多說明了。

其中界面顯示使用Thymeleaf模板,之前沒接觸過,簡單說明下。Thymeleaf是現(xiàn)代化服務(wù)器端的Java模板引擎,不同與JSP和FreeMarker,Thymeleaf的語法更加接近HTML,并且也有不錯(cuò)的擴(kuò)展性。

提高數(shù)據(jù)庫訪問性能

使用關(guān)系型數(shù)據(jù)庫的應(yīng)用系統(tǒng)的性能瓶頸最終還是數(shù)據(jù)庫。本章通過以下幾種方式提高數(shù)據(jù)庫訪問性能:

  • 使用Druid
  • 擴(kuò)展JPA功能
  • 使用Redis做緩存
使用Druid

Druid是一個(gè)關(guān)系型數(shù)據(jù)庫連接池,是阿里巴巴的一個(gè)開源項(xiàng)目,在監(jiān)控、可擴(kuò)展性、穩(wěn)定性和性能方面具有明顯的優(yōu)勢。通過使用Druid連接池,可以一定程度上提高數(shù)據(jù)庫的訪問性能。

擴(kuò)展JPA功能

使用JPA,在資源庫接口定義中不但可以按照其規(guī)則約定的方法聲明各種方法,還可以使用注解@Query來定義一些簡單的查詢語句,優(yōu)化SQL語句。

可以通過自定義一個(gè)接口,繼承于JpaRepository,擴(kuò)展已有的JPA接口。自定義接口必須在程序啟動(dòng)時(shí)裝配,才能正常使用。然后,在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」已經(jīng)介紹。

安全設(shè)計(jì)

Web應(yīng)用的安全管理,主要包括兩個(gè)方面的內(nèi)容:一方面是用戶身份驗(yàn)證,即用戶登錄的設(shè)計(jì);另一方面是用戶授權(quán),即一個(gè)用戶在一個(gè)應(yīng)用系統(tǒng)中能夠執(zhí)行哪些操作的權(quán)限管理。

權(quán)限管理的設(shè)計(jì)一般使用角色來管理,給一個(gè)用戶賦予哪些角色,用戶就具有哪些權(quán)限。本章主要使用spring-cloud-security來進(jìn)行安全管理設(shè)計(jì)。

使用時(shí),需要繼承spring-cloud-starter-parent,并引入spring-cloud-starter-security依賴。

關(guān)于系統(tǒng)的安全管理及各種設(shè)計(jì),Spring Security已經(jīng)大體上都實(shí)現(xiàn)了,只需要進(jìn)行一些配置和引用,就能夠正常使用了。具體實(shí)現(xiàn)就不在此重復(fù)描述了。

好多實(shí)現(xiàn)細(xì)節(jié),我沒有展現(xiàn)出來,一方面會(huì)顯得篇幅太長,主次不鮮明,另一方面作者把所有代碼都放到github了(http://github.com/chenfromsz)。
后續(xù)在公司項(xiàng)目中實(shí)踐好,我再談?wù)勛约旱氖褂媒?jīng)驗(yàn)。

《深入實(shí)踐Spring Boot》閱讀筆記之一:基礎(chǔ)應(yīng)用開發(fā)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI