您好,登錄后才能下訂單哦!
為了后續(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)的文章閱讀。
Spring Boot 是在Spring框架基礎(chǔ)上創(chuàng)建的一個(gè)全新框架,其設(shè)計(jì)目的是簡化Spring應(yīng)用的搭建和開發(fā)過程,不但具有Spring的所有優(yōu)秀特性,而且具有如下顯著特點(diǎn):
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。
針對性地介紹了Spring Boot入門、數(shù)據(jù)庫的使用和訪問性能提升、界面設(shè)計(jì)、安全設(shè)計(jì)等重要技術(shù)知識,以實(shí)用性為主,幫助我們快速掌握Spring Boot開發(fā)方法和精髓,盡快融入生產(chǎn)實(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í)。
本章主要介紹開發(fā)環(huán)境的配置,包括安裝JDK,安裝IDEA、安裝Maven、安裝Git客戶端,創(chuàng)建了一個(gè)簡單的項(xiàng)目,演示如何使用Spring Boot。
IDEA提供了可視化的界面創(chuàng)建各種類型的項(xiàng)目,可以通過Spring Initializr的方式,按要求創(chuàng)建Spring Boot項(xiàng)目。
項(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)行Spring Boot項(xiàng)目很簡單,像普通項(xiàng)目一樣直接運(yùn)行即可。
如果要發(fā)布到線上Tomcat容器中,需要增加一個(gè)打包插件:spring-boot-maven-plugin,通過mvn package打包即可。
可以在工程的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ù)庫是開發(fā)基本應(yīng)用的基礎(chǔ),Spring Boot 提供更加高層次上訪問數(shù)據(jù)庫。本章通過介紹使用MySQL、Redis、MongoDB、Neo4j來說明Spring Boot提供的便捷性。
對于傳統(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 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沒有表結(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是文檔型的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是一個(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í)體。
它更加形象和貼切地表現(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)用。
本章使用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ò)展性。
使用關(guān)系型數(shù)據(jù)庫的應(yīng)用系統(tǒng)的性能瓶頸最終還是數(shù)據(jù)庫。本章通過以下幾種方式提高數(shù)據(jù)庫訪問性能:
Druid是一個(gè)關(guān)系型數(shù)據(jù)庫連接池,是阿里巴巴的一個(gè)開源項(xiàng)目,在監(jiān)控、可擴(kuò)展性、穩(wěn)定性和性能方面具有明顯的優(yōu)勢。通過使用Druid連接池,可以一定程度上提高數(shù)據(jù)庫的訪問性能。
使用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」已經(jīng)介紹。
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)。
免責(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)容。