1、解耦。(下降各個組件還有各層之間的耦合度)html
2、可使容器提供衆多的服務。(如:事務管理、日誌管理)前端
3、單例模式的支持。(容器提供單例模式的支持,開發人員不須要本身去編碼實現)java
4、AOP技術。(利用AOP能夠實現權限攔截等功能)web
5、容器提供衆多的輔助類。(這些輔助類能夠加快項目的應用開發)面試
6、輕鬆與其它框架整合、集成。spring
IOC(控制反轉):應用的自己不須要去建立和維護對象,而是交給它的外部容器去負責,這樣控制權就交給了外部容器,從而耦合在一塊兒。數據庫
(如:咱們知道,在java中,實例化對象有三種方法:類構造器、靜態工廠方法、實例工廠方法。在傳統的java開發模式中,咱們須要用new來建立或者getInstance等直接或間接調用構造方法來建立一個對象;而在spring開發模式中,spring使用工廠模式爲咱們建立了所須要的對象,咱們使用時,不須要本身去建立,而是直接去調用spring爲咱們所提供的對象便可,這就是控制反轉的思想。)編程
DI(依賴注入):運行期間,對象由外部容器動態的注入到組件中,讓Bean與Bean之間以配置文件組織在一塊兒,而不是以硬編碼的方式。(Spring使用JavaBean對象的Set方法或者帶參數的構造方法爲咱們建立所需對象時將其屬性自動設置成咱們須要的值的過程就是依賴注入的思想。)api
AOP(面向切面):開發人員只須要關心點或橫切典型的職責分界線的行爲(如:日誌和事務管理),進行模塊化。AOP原理是:Spring採用JDK的動態代理來實現。(在面向對象的思想中,咱們將事務縱向抽象成一個個的對象,而在spring的面向切面編程中,咱們將某些相似的方面橫向抽象成一個切面,對這些切面進行一些如:權限驗證、事務管理、日誌管理等公用操做過程就是面向切面編程的思想。)瀏覽器
(1)代理模式——Spring中AOP原理是:Spring採用JDK的動態代理來實現。
(2)單例模式——Spring的配置文件中定義Bean默認爲單例模式。
(3)前端控制器模式——Spring提供Dispatcherservlet來對請求進行分發。
(4)工廠模式——在工廠模式中,咱們建立對象是不會對客戶端暴露咱們建立的邏輯,而是提供一個共同的接口來指向新建立的對象。Spring中使用BeanFactory來建立對象的實例。
Spring支持兩種事務:一種是編程式事務,一種是聲明式事務。
編程式事務:這意味你經過編程的方式來管理事務,能夠給你帶來極大的靈活性,可是比較難以維護。
聲明式事務:這意味你能夠將業務代碼和事務管理分離,你只需用註解和xml配置來管理事務,具備良好的適應性。
它和數據庫事務同樣,必須服從ACID原則:原子性、一致性、隔離性、持久性。
通俗理解,事務是一組原子操做單元,從數據庫的角度來講,事務是一組SQL指令,要麼所有執行,要麼所有撤銷不執行。
(1)原子性:事務中最基本的操做單元,要麼所有成功,要麼所有失敗,而後回滾。
(2)一致性:保證事務在執行以前和執行以後數據庫都保持一致的狀態。
(3)隔離性:指的是併發環境下,當不一樣的事務同時操做相同的數據時,每一個事務都有各自完整數據空間。
(4)持久性:表示事務執行完畢後,數據庫的數據是永久保存在數據庫中的。
併發事務問題
(1)第一類丟失更新:撤銷一個事務時,把其餘事務已提交更新的數據覆蓋。
(2)髒讀:一個事務讀取到另外一個事務未提交的更新數據。
(3)幻讀和虛讀:一個事務執行兩次查詢,第二次結果集包含第一次中沒有或某些已經刪除的數據,形成兩次數據結果不一致;這是其中一個事務在這兩次查詢還在進行之中,插入或刪除形成的。
(4)不可重複讀:兩個事務同時讀取到同一條數據,此時恰好其中一個更新了數據,兩個結果相異,不可被信任。
(5)第二類丟失更新:在不可重複讀的狀況下。若是兩個事務都讀取同一行,而後兩個都進行了讀寫操做並提交,第一個事務所作的改變就會丟失。
package com.springboot.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @RequestMapping("/hello") public String Hello() { return "Hello 歡迎來到SpringBoot世界!"; } }
開發RESTful API 時,通常都會在Controller上加上@Controller註解,可是有時候加上@RestController,看了資料,說說他們的區別:
@RestController註解等價於@ResponseBody + @Controller。@RestController和@Controller的共同點是都用來表示Spring某個類是否能夠接收HTTP請求,兩者區別: @RestController沒法返回指定頁面,而@Controller能夠;前者能夠直接返回數據,後者須要@ResponseBody輔助。
① 是否能夠返回頁面
答:@RestController沒法返回指定頁面,而@Controller能夠。
解析:對於Controller, 若是隻是使用@RestController註解,則其方法沒法返回指定頁面,此時配置的視圖解析器 InternalResourceViewResolver不起做用,返回的內容就是 return 裏的內容。 若是須要返回到指定頁面,則須要用 @Controller配合視圖解析器InternalResourceViewResolver才行。
② 返回內容
若是須要返回JSON,XML或自定義mediaType內容到頁面,@RestController本身就能夠搞定,這個註解對於返回數據比較方便,由於它會自動將對象實體轉換爲JSON格式。而@Controller須要在對應的方法加上@ResponseBody註解。
@RequestMapping:是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的全部響應請求的方法都是以該地址做爲父路徑。
@SpringBootApplication:主程序註解,用來開啓springboot的各項能力。
-----------------------------------------------------------END----------------------------------------------------------------
qq:2931445528
微信:Y2931445528