SpringBoot ,SpringMVC 和Spring
Spring Boot ,Spring MVC 和Spring的比較
1 . SpringFramework 最重要的特性是依賴注入。所有SpringModules不是依賴注入就是IOC控制反轉。當我們適當的使用DI和IOC可以開發鬆耦合應用。
2 . Spring Mvc是基於 Servlet 的一個 MVC 框架 ,提供一種分離式的方法來開發web應用,通過運用DispatcherServelet,MoudlAndView和ViewResolver 等等一些用 Spring 解耦的元件,將開發web變得簡單。
3 . Spring 最初利用“工廠模式”( DI )和“代理模式”( AOP )解耦應用元件
4 .Spring Boot實現了自動配置,降低了專案搭建的複雜度。Spring Boot提供一些非功能性特性。
自動配置
1. Spring和Spring Mvc的問題在於需要配置大量的引數
2. Spring檢視(CLASSPATH上可用的框架)已存在的應用程式的配置。在此基礎上,Spring Boot提供了配置應用程式和框架需要的基本配置,這既是Sping Boot的自動配置
Spring Boot Stater
1 . 啟動器是一套方便的依賴描述符,它可以放在自己的程式中。
名稱 | 描述 |
---|---|
spring-boot-starter | 核心Spring Boot starter,包括自動配置支援,日誌和YAML |
spring-boot-starter-actuator | 生產準備的特性,用於幫你監控和管理應用 |
spring-boot-starter-amqp | 對”高階訊息佇列協議”的支援,通過spring-rabbit實現 |
spring-boot-starter-aop | 對面向切面程式設計的支援,包括spring-aop和AspectJ |
spring-boot-starter-batch | 對Spring Batch的支援,包括HSQLDB資料庫 |
spring-boot-starter-cloud-connectors | 對Spring Cloud Connectors的支援,簡化在雲平臺下(例如,Cloud Foundry 和Heroku)服務的連線 |
spring-boot-starter-data-elasticsearch | 對Elasticsearch搜尋和分析引擎的支援,包括spring-data-elasticsearch |
spring-boot-starter-data-gemfire | 對GemFire分散式資料儲存的支援,包括spring-data-gemfire |
spring-boot-starter-data-jpa | 對”Java持久化API”的支援,包括spring-data-jpa,spring-orm和Hibernate |
spring-boot-starter-data-mongodb | 對MongoDB NOSQL資料庫的支援,包括spring-data-mongodb |
spring-boot-starter-data-rest | 對通過REST暴露Spring Data倉庫的支援,通過spring-data-rest-webmvc實現 |
spring-boot-starter-data-solr | 對Apache Solr搜尋平臺的支援,包括spring-data-solr |
fspring-boot-starter-freemarker | 對FreeMarker模板引擎的支援 |
spring-boot-starter-groovy-templates | 對Groovy模板引擎的支援 |
spring-boot-starter-hateoas | 對基於HATEOAS的RESTful服務的支援,通過spring-hateoas實現 |
spring-boot-starter-hornetq | 對”Java訊息服務API”的支援,通過HornetQ實現 |
spring-boot-starter-integration | 對普通spring-integration模組的支援 |
spring-boot-starter-jdbc | 對JDBC資料庫的支援 |
spring-boot-starter-jersey | 對Jersey RESTful Web服務框架的支援 |
spring-boot-starter-jta-atomikos | 對JTA分散式事務的支援,通過Atomikos實現 |
spring-boot-starter-jta-bitronix | 對JTA分散式事務的支援,通過Bitronix實現 |
spring-boot-starter-mail | 對javax.mail的支援 |
spring-boot-starter-mobile | 對spring-mobile的支援 |
spring-boot-starter-mustache | 對Mustache模板引擎的支援 |
spring-boot-starter-redis | 對REDIS鍵值資料儲存的支援,包括spring-redis |
spring-boot-starter-security | 對spring-security的支援 |
spring-boot-starter-social-facebook | 對spring-social-facebook的支援 |
spring-boot-starter-social-linkedin | 對spring-social-linkedin的支援 |
spring-boot-starter-social-twitter | 對spring-social-twitter的支援 |
spring-boot-starter-test | 對常用測試依賴的支援,包括JUnit, Hamcrest和Mockito,還有spring-test模組 |
spring-boot-starter-thymeleaf | 對Thymeleaf模板引擎的支援,包括和Spring的整合 |
spring-boot-starter-velocity | 對Velocity模板引擎的支援 |
spring-boot-starter-web | 對全棧web開發的支援,包括Tomcat和spring-webmvc |
spring-boot-starter-websocket | 對WebSocket開發的支援 |
spring-boot-starter-ws | 對Spring Web服務的支援 |
Spring-boot-maven-plugin
1. spring-boot-maven-plugin 提供一些像jar一樣打包執行應用程式的命令
Spring-boot-devtools
1. spring-boot-devtools的模組來使Spring Boot應用支援熱部署,提高開發者的開發效率
devtools的原理
深層原理是使用了兩個ClassLoader,一個Classloader載入那些不會改變的類(第三方Jar包),另一個ClassLoader載入會
更改的類,稱為restart ClassLoader,這樣在有程式碼更改的時候,原來的restart ClassLoader 被丟棄,重新建立一個restart ClassLoader,
由於需要載入的類相比較少,所以實現了較快的重啟時間。
Spring Date
1. Spring Date 的使命是在保證底層資料儲存特殊性的前提下,為資料訪問提供一個熟悉的,一致性的,基於Spring 的程式設計模型。並支援雲服務的開源框架。其主要目標是使得對資料的訪問變得方便快捷,並支援map-reduce框架和雲端計算資料服務,Spring Date提供了不受底層資料來源限制的Abstractions介面。
2. Spring Data 包含多個子專案:
Commons - 提供共享的基礎框架,適合各個子專案使用,支援跨資料庫持久化
JPA - 簡化建立 JPA 資料訪問層和跨儲存的持久層功能
Hadoop - 基於 Spring 的 Hadoop 作業配置和一個 POJO 程式設計模型的 MapReduce 作業
Key-Value - 集成了 Redis 和 Riak ,提供多個常用場景下的簡單封裝
Document - 整合文件資料庫:CouchDB 和 MongoDB 並提供基本的配置對映和資料庫支援
Graph - 整合 Neo4j 提供強大的基於 POJO 的程式設計模型
Graph Roo AddOn - Roo support for Neo4j
JDBC Extensions - 支援 Oracle RAD、高階佇列和高階資料型別
Mapping - 基於 Grails 的提供物件對映框架,支援不同的資料庫
Examples - 示例程式、文件和圖資料庫
Guidance - 高階文件
3. Spring Data JPA
1. 由Spring提供的一個用於簡化JPA開發的框架
2. 主要來看看Spring Data JPA提供的介面,也是Spring Data JPA的核心概念:
1:Repository:最頂層的介面,是一個空的介面,目的是為了統一所有Repository的型別,且能讓元件掃描的時候自動識別。
2:CrudRepository :是Repository的子介面,提供CRUD的功能
3:PagingAndSortingRepository:是CrudRepository的子介面,新增分頁和排序的功能
4:JpaRepository:是PagingAndSortingRepository的子介面,增加了一些實用的功能,比如:批量操作等。
5:JpaSpecificationExecutor:用來做負責查詢的介面
6:Specification:是Spring Data JPA提供的一個查詢規範,要做複雜的查詢,只需圍繞這個規範來設定查詢條件即可
4. Spring Data REST
Spring Date TEST可以用來發布關於Spring資料庫的HATEOAS RESTful 資源
RequestMapping 和GetMapping
1. RequestMapping具有類屬性的,可以進行GET,POST,PUT或其他的具有的請求的方法
2. GetMapping 是GET請求方法中一個特例,它只是RequestMapping的一個延續,目的是為了提高清晰度
JPA 和Hibernate
JPA 是一個規範或者介面
Hibernate是JPA的一個實現,當我們使用JPA的時候,我們使用javax.persistence
包中的註解和介面時,不用使用hibernate的匯入包。
SpringBoot 的註解
1. @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解。
其中@ComponentScan讓spring Boot掃描到Configuration類並把它加入到程式上下文。
@Configuration 等同於spring的XML配置檔案;使用Java程式碼可以檢查型別安全。
@EnableAutoConfiguration 自動配置。
@ComponentScan 元件掃描,可自動發現和裝配一些Bean。
@Component可配合CommandLineRunner使用,在程式啟動後執行一些基礎任務。
@RestController註解是@Controller和@ResponseBody的合集,表示這是個控制器bean,並且是將函式的返回值直 接填入HTTP響應體中,是REST風格的控制器。
@Autowired自動匯入。
@PathVariable獲取引數。
@JsonBackReference解決巢狀外鏈問題。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
@ResponseBody:表示該方法的返回結果直接寫入HTTP response body中,一般在非同步獲取資料時使用,用於構建RESTful的api。在使用@RequestMapping後,返回值通常解析為跳轉路徑,加上@responsebody後返回結果不會被解析為跳轉路徑,而是直接寫入HTTP response body中。比如非同步獲取json資料,加上@responsebody後,會直接返回json資料。該註解一般會配合@RequestMapping一起使用
@Controller:用於定義控制器類,在spring 專案中由控制器負責將使用者發來的URL請求轉發到對應的服務介面(service層),一般這個註解在類中,通常方法需要配合註解@RequestMapping
@RestController:用於標註控制層元件(如struts中的action),@ResponseBody和@Controller的合集。
JPA註解
@Entity:@Table(name=”“):表明這是一個實體類。一般用於jpa這兩個註解一般一塊使用,但是如果表名和實體類名相同的話,@Table可以省略
@MappedSuperClass:用在確定是父類的entity上。父類的屬性子類可以繼承。
@NoRepositoryBean:一般用作父類的repository,有這個註解,spring不會去例項化該repository。
@Column:如果欄位名與列名相同,則可以省略。
@Id:表示該屬性為主鍵。
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):表示主鍵生成策略是sequence(可以為Auto、IDENTITY、native等,Auto表示可在多個數據庫間切換),指定sequence的名字是repair_seq。
@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name為sequence的名稱,以便使用,sequenceName為資料庫的sequence名稱,兩個名稱可以一致。
@Transient:表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性。如果一個屬性並非資料庫表的欄位對映,就務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic。@Basic(fetch=FetchType.LAZY):標記可以指定實體屬性的載入方式
@JsonIgnore:作用是json序列化時將Java bean中的一些屬性忽略掉,序列化和反序列化都受影響。
@JoinColumn(name=”loginId”):一對一:本表中指向另一個表的外來鍵。一對多:另一個表指向本表的外來鍵。
@OneToOne、@OneToMany、@ManyToOne:對應hibernate配置檔案中的一對一,一對多,多對一。
全域性異常處理
@ControllerAdvice:包含@Component。可以被掃描到。統一處理異常。
@ExceptionHandler(Exception.class):用在方法上面表示遇到這個異常就執行以下方法。