Spring高頻面試題

Spring Boot的優勢和Spring的區別


Spring Boot優勢:

  1. 快速開發,提高了生產力,適合構建微服務系統
  2. 避免編寫大量的樣板代碼、註釋和xml配置
  3. springBoot集成了很多成熟的組件,如mybatis、redis和mongdb等

Spring Boot劣勢:

  1. 集成度太高,使用過程不容易瞭解底層,一旦出現bug很難發現問題根源。
  2. 已存在的spring項目難以轉化爲springboot項目。

Spring Boot JPA和MyBatis的區別


SpringBoot JPA和MyBatis是什麼

JPA和MyBatis都是ORM(object relational mapping)的一種實現框架,都對JDBC的一種封裝。

springboot jpa默認採用hibernate作爲ORM實現,它對JDBC進行了輕量級的對象封裝,它將POJO(java普通對象)與數據庫建立映射關係,可以自動生成sql語句。

MyBatis是一款優秀的持久化框架,支持定製化SQL、存儲過程以及高級映射。使用簡單的xml或註解來配置和映射原生信息,將POJO映射成數據庫中的記錄。

SpringBoot JPA和MyBatis區別

hibernate自動化更強,省去了大部分sql語句的編寫,採用面向對象的方式操作關係型數據庫,屬於更高級的框架。但是處理複雜業務時,靈活度差。

mybatis在sql語句編寫方面更加靈活自由(方便之後進行sql優化),採用面向關係的方式操作數據庫。

AOP原理


使用AOP的目的

將那些與業務無關,卻被多個業務模塊所共同調用的邏輯代碼封裝起來,減少系統的重複代碼,提高代碼的可維護性。

AOP使用場景

權限控制、日誌記錄、異常處理、數據校驗、事務管理等

AOP實現原理

AOP思想的實現一般是基於代理模式,主要的實現技術有Spring AOP和AspectJ

  1. AspectJ
    AspectJ採用的是靜態代理,在業務代碼編譯時將AOP代碼織入,相比Spring AOP動態代理技術,性能更好。

  2. Spring AOP
    Spring AOP採用的是動態代理,在運行期間對業務代碼進行增強。

    對於動態代理技術,Spring AOP提供了對JDK動態代理的支持和CGLIB的支持。

    JDK動態代理只能爲接口創建動態代理實例,不能對類創建動態代理。首先生成一個實現了代理接口的動態代理類,然後通過反射機制獲得動態代理類的構造函數並生成一個動態代理類的實例對象,在調用具體方法前調用invokeHandler方法來處理。

    如果目標對象的實現類沒有實現接口,Spring AOP將會採用CGLIB來生成AOP代理類。

Spring IOC原理


IOC原理:

在沒有引入IOC容器之前,對象A如果依賴於對象B,對象A要使用對象B的時候,就必須自己去創建對象B或者使用已經創建的對象B。無論創建還是使用對象B,控制權都在自己手上。

引入IOC容器後,對象A與對象B之間失去了直接聯繫,當對象A運行到需要使用對象B的時候,由IOC容器創建一個對象B注入到對象A中。

所以什麼是控制反轉,總結起來就是一句話,獲得依賴對象的控制權由自身轉移到了第三方容器上(IOC容器)

依賴注入是IOC原理實現的一種方式。
依賴注入:在IOC容器運行期間,將依賴關係動態注入到對象之中。

依賴注入(DI)的三種方式

  • 構造方法注入
  • setter方法注入
  • 基於註解的注入

Spring常用註解


  • @Component
    所有受Spring管理組件的通用形式,可以放在類的頭上,但是不推薦使用

  • @Controller(value=**)
    標識表現層的Bean,value可以指定Bean的名字

  • @Service(value=**)
    標識業務層的Bean,value同樣可以指定Bean的名字

  • @Repository
    標識數據訪問層的Bean,value同樣可以指定Bean的名字

  • @Scope(”singleton“)
    標識Bean對象的作用域,主要有以下幾種作用域:

    • singleton 單例模式——全局僅有一個實例
    • prototype 原型模式——每次獲取Bean的時候會有一個新實例
    • request ——每一次HTTP請求會生成一個新實例,僅在當前HTTP request內有效
    • session——每一次HTTP請求會生成一個新實例,僅在當前HTTP session內有效
  • @Autowired
    用來注入依賴,即裝配Bean,默認按照類型裝配(byType自動注入策略)

  • @Qualifier
    一般作爲@Autowired()的修飾用,@Autowired是根據類型進行自動裝配的。如果當Spring上下文中相同類型的bean不止存在一個時,就會拋出BeanCreationException異常,因此需要@Qualifier唯一標識出所要裝配的Bean對象。

  • @Resource
    同樣用來注入依賴,可以按照Bean對象的名稱(byName注入)或者類型(byType注入)進行裝配。如果沒有指定name和type,那麼先對name進行匹配,匹配失敗再對type進行匹配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章