您好,登錄后才能下訂單哦!
為了后續項目的應用,想利用這2天看下《深入實踐Spring Boot》,這本書是17年雙十一期間在京東上買的,一直懶著沒看。這本書偏應用,適合初學者看,正文內容也就240多頁,看的會比較輕松。
目前,看完了第一部分,約占全書1/2內容,計劃初七上班前看完這本書。我會分3篇文章進行介紹,這篇文章首先介紹下這本書的整體結構,然后總結下第一部分的內容。
我不會介紹具體的實現過程,只是把這本書想要講的內容串起來,重點說明下我認為重要的內容。想深入了解的,可以直接看這本書,也可以通過文中的一些概念搜索相關的文章閱讀。
Spring Boot 是在Spring框架基礎上創建的一個全新框架,其設計目的是簡化Spring應用的搭建和開發過程,不但具有Spring的所有優秀特性,而且具有如下顯著特點:
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開發,掌握其精髓。
很喜歡作者的章節安排,以后學習新技術時,可以按照這個思路去學習。
本章主要介紹開發環境的配置,包括安裝JDK,安裝IDEA、安裝Maven、安裝Git客戶端,創建了一個簡單的項目,演示如何使用Spring Boot。
IDEA提供了可視化的界面創建各種類型的項目,可以通過Spring Initializr的方式,按要求創建Spring Boot項目。
項目創建完成后,會生成一個入口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打包即可。
可以在工程的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提供的便捷性。
對于傳統關系型數據庫來說,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沒有表結構的概念,所以要實現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是文檔型的NoSQL數據庫,具有大數據量、高并發等優勢,但缺點是不能建立實體關系,而且也沒有事務管理機制。
MongoDB 也有像使用JPA那樣的資源庫,引入spring-data-mongodb和spring-boot-starter-hateoas依賴庫,這里就不過多介紹了。
Neo4j是一個高性能的NoSQL圖數據庫,并且具備完全事務特性,同時具備傳統關系型數據庫的優點,又具備NOSQL數據庫優勢。
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是一個關系型數據庫連接池,是阿里巴巴的一個開源項目,在監控、可擴展性、穩定性和性能方面具有明顯的優勢。通過使用Druid連接池,可以一定程度上提高數據庫的訪問性能。
使用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」已經介紹。
Web應用的安全管理,主要包括兩個方面的內容:一方面是用戶身份驗證,即用戶登錄的設計;另一方面是用戶授權,即一個用戶在一個應用系統中能夠執行哪些操作的權限管理。
權限管理的設計一般使用角色來管理,給一個用戶賦予哪些角色,用戶就具有哪些權限。本章主要使用spring-cloud-security來進行安全管理設計。
使用時,需要繼承spring-cloud-starter-parent,并引入spring-cloud-starter-security依賴。
關于系統的安全管理及各種設計,Spring Security已經大體上都實現了,只需要進行一些配置和引用,就能夠正常使用了。具體實現就不在此重復描述了。
好多實現細節,我沒有展現出來,一方面會顯得篇幅太長,主次不鮮明,另一方面作者把所有代碼都放到github了(http://github.com/chenfromsz)。
后續在公司項目中實踐好,我再談談自己的使用經驗。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。