目錄:
- 為什么要使用 spring?
- 解釋一下什么是 aop?
- 解釋一下什么是 ioc?
- spring 有哪些主要模塊?
- spring 常用的注入方式有哪些?
- spring 中的 bean 是線程安全的嗎?
- spring 支持幾種 bean 的作用域?
- spring 自動裝配 bean 有哪些方式?
- spring 事務實現方式有哪些?
- 說一下 spring 的事務隔離?
- 說一下 spring mvc 運行流程?
- spring mvc 有哪些組件?
- @RequestMapping 的作用是什么?
- @Autowired 的作用是什么?
- 什么是 spring boot?
- 為什么要用 spring boot?
- spring boot 核心配置文件是什么?
- spring boot 配置文件有哪幾種類型?它們有什么區別?
- jpa 和 hibernate 有什么區別?
- 什么是 spring cloud?
- SpringCloud與Dubbo的比較
- Eureka和Zookeeper都可以提供服務注冊與發現的功能,請說說兩個的區別。
- spring cloud 斷路器的作用是什么?
- spring cloud 的核心組件有哪些?
為什么要使用 spring?
也就是說使用Spring有什么好處:
- 方便解耦,簡化開發:Spring通過IOC容器解耦對象之間的依賴關系;如A對象初始化時需要依賴B對象,在使用Spring前每次初始化A對象時都需要傳入B對象,如果哪一天A對象的初始化改了,那么引用A對象的所有地方都需要改,這樣會非常麻煩。而將對象交給Spring管理的話,就只需要修改對應的配置文件就可以了。
- AOP、聲明事務、單元測試等等支持。
- 方便集成各種優秀的框架:Spring不排斥各種優秀的框架,相反它還可以降級框架使用的難度,如Struts、Hibernate、Mybatis等等。
- 非常經典的學習范例:Spring的源碼設計精妙、結構清晰、匠心獨具,靈活應用了各種設計模式,如果你想提高自己的Java水平,那么學習Spring的源碼會給你帶來意想不到的效果。
- 等等。
解釋一下什么是 aop?
面向切面編程,這種編程思想是在程序中找到一個切面,並將具有通用功能的業務流程抽取並單獨封裝;如日志的打印、事務、統計接口響應時間等等。
解釋一下什么是 ioc?
IOC:控制反轉,將程序中的對象交給Spring維護,而不是開發者維護。其核心思想就是資源不由使用資源的雙方管理,而是交由第三方平台管理。
這樣帶來了很多好處:
- 資源集中管理,實現資源的可配和易管理。
- 降低了使用資源雙方的依賴程序,也就是耦合度。
IOC思想的具體實現方法便是DI(依賴注入),也就是說依賴關系不是預定好的,而是由容器在運行期間定將依賴關系注入到組件中。
spring 有哪些主要模塊?
Spring Code:核心類庫,主要實現IOC功能,並且其它功能都依賴此庫。
AOP:提供了AOP功能,並提供常用的攔截器等等。
ORM:提供常用的ORM框架輔助支持,如Hibernate、ibatis,它本身並不實現ORM,而是對ORM框架進行封裝和管理。
DAO:提供JDBC支持,允許JDBC使用Spring資源,並統一管理事務。
WEB:提供常用Web框架,如Struts、JSF。
Context:提供Bean訪問方式。
MVC:Spring實現了一套輕量級的MVC實現,相對於Struts來說Spring MVC更加簡潔。
spring 常用的注入方式有哪些?
構造方法注入:可結合lombok使用,簡化對象的聲明。
setter方法注入:通過對象set方法注入屬性。
基於注解注入:@Component、@Controller、@Service、@Repository這幾種方式目前僅是語意上的差別。
spring 中的 bean 是線程安全的嗎?
這取決於你的bean是否是有狀態的;
默認情況下Spring的bean都是單例的,所以就一般業務開發中bean都是無狀態的(比如DAO層),所以是線程安全的。
但你的bean是有狀態的話(比如你要在bean中存儲某些數據),就需要將bean的scope改成prototype,讓每次請求都相當於重新new一個bean,這樣就是線程安全的了。
spring 支持幾種 bean 的作用域?
singleton:單例,也是默認的作用域。
prototype:原型,每次創建一個新的bean。
request:每次Http請求創建一個新的bean。
session:一個會話享用一個bean。
global-session:所有會話共享一個bean。
spring 自動裝配 bean 有哪些方式?
1、隱式的bean發現機制或自動注入
- @AutoWired:根據類型注入bean。
- @Autowired + @Qualifier:若有相同類型,根據名稱注入。
- @Resources:Java中根據名稱注入的注解。
2、java config或xml:@Bean或xml
spring 事務實現方式有哪些?
編程式事務:通過在代碼中調用commit、rollback等事務管理相關方法。
聲明式事務:通過在xml中聲明那些函數需要啟用事務。
基於注解的聲明式事務:@Transaction(rollbackFor = xxxException.class)
說一下 spring 的事務隔離?
1、事務隔離的幾個概念
- 臟讀:事務修改數據后還未提交,此時另一個事務也訪問了這個數據,此時讀出來的數據較臟讀。
- 不可重復讀:一個事務內讀了多次數據(具有兩份數據),但其它事務在第一個事務的兩份數據讀取之間(讀第一份數據和第二份數據之間的時間差內)修改了數據,此時第一個事務的前后兩次結果會不一致,這樣的情況稱為不可重復讀。
- 幻讀:當事務不獨立執行時發生的一種現象,當第一個事務涉及到全表修改,第二個事務插入一行新數據,此時便會發生操作第一個事務的用戶發現表中還有未修改的數據,就像發生幻覺一樣。
2、Spring支持五種事務設置:
- DEFAULT:默認,由DBA指定。
- READ_UNCOMMITTED:會出現臟讀、不可重復讀、幻讀(隔離級別最低,但並發性能最高)。
- READ_COMMINTTED:不出現不可重復讀、幻讀(鎖定正在讀取的行)。
- REPEATABLE_READ:會出現幻讀(鎖定所讀取的所有行)。
- SERIALIZABLE:所有情況不會發生(鎖表)。
說一下 spring mvc 運行流程?
1、用戶請求首先會經過DispatchServlet,DispatchServlet接收到請求后會將請求信息交給處理映射器(HandlerMapping)。
2、HandlerMapping會根據請求的url找到對應處理器(Handler),並返回一個執行鏈。
3、DispatchServlet拿到執行鏈后再請求處理適配器(HandlerAdapter)來調用相應的Handler處理,然后返回ModelAndView給DispatchServlet。
4、DispatchServlet將ModelAndView請求視圖解析器(ViewReslover)解析,並返回具體的View。
5、DispatchServlet對View進行渲染視圖。
6、DispatchServlet將頁面響應給用戶。
參考:https://www.cnblogs.com/gxc6/p/9544563.html
spring mvc 有哪些組件?
- DispatcherServlet:前端控制器;用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
- HandlerMapping:處理器映射器;HandlerMapping負責根據用戶請求url找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,注解方式等。
- Handler:處理器;Handler是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。由於Handler涉及到具體的用戶業務請求,所以一般情況需要程序員根據業務需求開發Handler。
- HandlAdapter:處理器適配器;通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
- ViewResolver:視圖解析器;View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最后對View進行渲染將處理結果通過頁面展示給用戶。
- View:視圖;springmvc框架提供了很多的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。我們最常用的視圖就是jsp。一般情況下需要通過頁面標簽或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。
參考:https://www.cnblogs.com/gxc6/p/9544563.html
@RequestMapping 的作用是什么?
@RequestMapping用於表示Controller層的請求地址,它可以標注在類或方法上。
標注在類上:此類下所有的方法都具有標注的父路徑。
標注在方法上:此方法的路徑。
@RequestMapping屬性:
- value:訪問路徑值。
- method:請求方式,有GET、POST、PUT、DELETE等等。
- consumes、produces:分別表示請求和響應的數據格式,如application/json、text/html。
- params、headers:表示請求中必須包含某參數或某請求頭。
@Autowired 的作用是什么?
根據類型注入一個bean,還可以配合@Qualifier完成根據名稱注入一個bean。
什么是 spring boot?
SpringBoot是Spring體系下的一個子項目,其主要目的適用於簡化Spring項目搭建的過程,從而使開發人員不需要定義樣板化的配置。
為什么要用 spring boot?
1、簡化Spring項目搭建的過程,節省成本。
2、SpringBoot整合了各式的框架,降低了其它框架使用的成本
3、簡化部署成本,內置Tomcat,可以把下面打成war包,通過java -jar一鍵部署。
4、簡化監控成本,SpringBoot提供了actuator。
spring boot 核心配置文件是什么?
application和bootstrap。
application:主要用於SpringBoot項目的自動化配置。
bootstrap:使用SpringCloud時使用,bootstrap加載優先於application,主要用於加載額外的配置信息,如遠端git配置。
spring boot 配置文件有哪幾種類型?它們有什么區別?
properties、yml。
區別:書寫各式不一樣,properties需要配置的全稱,而yml可用:號、空格這些標准來簡化properties這種格式。
SpringData Jpa和Hibernate有什么區別?
1、SpringData Jpa是JPA數據訪問的抽象,Hibernate是JPA的一個實現。
2、使用SpringData的話你可以使用Hibernate、Eclipse Link或其它任何實現了JPA的框架。
什么是 spring cloud?
SpringCloud是一個微服務框架,而微服務其實就是一種架構模式、架構風格,從字面意思來看就知道它提倡的是將單一應用程序划分成一組小的服務,每個服務都運行在自己的進程中。
服務之間采用輕量級的restful通信,每個服務都圍繞着自己的業務進行構建,可以選擇合適的語言、存儲方式,這極大的增強了服務的靈活性。
微服務的優缺點:
- 優點:
- 易理解:每個服務都足夠內聚,這樣的業務代碼易理解。
- 開發簡單、效率高:一個服務可能就是專一的做一件事,開發簡單、效率高。
- 靈活性好:每個服務都可以使用不同的語言、存儲方式、技術棧,開發或部署階段都是獨立的。
- 缺點:
- 運維成本高:不僅是開發人員要處理分布式系統的復雜性,運維人員也需要管理多個機器與服務。
- 服務通信成本、數據一致性、系統測試集成、性能監控等等。
SpringCloud與Dubbo的比較:
背景:SpringCloud是Apache旗下的Spring體系下的微服務解決方案,Dubbo是阿里體系下的分布式服務治理框架。
服務的調用:SpringCloud通過輕量級的Rest API調用,Dubbo通過RPC遠程調用。
服務發現:SpringCloud使用Netflix下的Eureka作為服務發現,當然也可以用其它的服務發現,如ZK,但我們一般不會這樣做;Dubbo使用第三方Zookeeper作為注冊中心。
網關:SpringCloud使用Netflix下的Zuul,Dubbo需要使用其它第三方技術整合等等。
Eureka和Zookeeper都可以提供服務注冊與發現的功能,請說說兩個的區別。
著名CAP理論指出,一個分布式系統不可能同時滿足C(一致性)、A(可用性)、P(分區容錯性)。
由於分區容錯性在分布式系統中是必須要保證的,因此我們只能在A和C之間進行權衡;
1、Eureka保證AP,Zookeeper保證CP。
2、由於作為注冊中心可用性的需求要高於一致性,所以eureka貌似要比zookeeper更合理一些。
spring cloud 斷路器的作用是什么?
斷路器類似於電路中的保險絲,當保險絲燒斷時會短暫的斷開供電,讓整個電路處於安全。
SpringCloud斷路器也是同理,它可以有效的保護服務,使服務鏈路不因為一個服務的問題導致整個服務的癱瘓;不僅如此,它還提供了優雅的降級和熔斷機制,以及請求合並、請求緩存。
spring cloud 的核心組件有哪些?
- 服務開發:Spring、SpringBoot、SpringMVC。
- 服務配置:Netflix Archaius、SpringCloud Config、Alibaba Diamond。
- 服務發現:Netflix Eureka、Zookeeper。
- 負載均衡:Netflix Ribbon、Nginx。
- 服務熔斷:Netflix Hystrix。
- 服務調用:Rest、RPC等等:
- 服務接口調用:Netflix Feign。
- 服務網關:Netflix Zuul。
- 消息總線:SpringCloud Bus,可采用RabbitMQ、Kafka等等。