Spring 全家桶,它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。Spring框架相關知識spring系列包含很是多的項目,能夠知足java開發中的方方面面。java
1、經常使用的5個spring框架1.springweb
framework面試
也就是咱們常常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等衆多功能模塊,其它spring項目好比spring boot也會依賴spring框架。spring
2.spring bootsql
它的目標是簡化Spring應用和服務的建立、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,能夠和spring cloud聯合部署。數據庫
SpringBoot的核心思想是約定大於配置,應用只須要不多的配置便可,簡化了應用開發模式。編程
3.Spring Dataapi
是一個數據訪問及操做的工具集,封裝了多種數據源的操做能力,包括:jdbc、Redis、MongoDB等。緩存
4.Spring Cloud安全
是一套完整的微服務解決方案,是一系列不一樣功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各類服務治理能力。好比sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等衆多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通訊。
主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,能夠快速實現常見安全模型,如單點登陸,令牌中繼和令牌交換。你能夠了解一下oauth2受權機制和jwt認證方式。oauth2是一種受權機制,規定了完備的受權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證明現,oauth2受權機制中就能夠應用jwt來做爲認證的具體實現方法。
2、Struts的具體做用
struts是曾經很是火爆的web組合ssh中的控制層。咱們知道web服務通常都採用MVC分層模型構建,就是model層負責內部數據模型,controller負責請求的分發控制,view層負責返回給用戶展現的視圖。struts實現的就是其中控制層的角色。
Struts採用Filter實現,針對類進行攔截,每次請求就會建立一個Action。使用struts的SSH組合已經逐漸被使用springMVC的SSM組合代替,也就是Spring-MVC+Spring+MyBatis的組合,一方面緣由是因爲struts對幾回安全漏洞的處理,讓你們對struts的信心受到影響;另外一方面,springmvc更加的靈活,不須要額外配置,不存在和spring整合等問題,使用更加方便,因此建議以SSM框架的學習爲主。
3、ORM框架ORM
就是對象關係匹配,是爲了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來講,就是把關係數據庫中的數據轉換成面向對象程序中的對象。
經常使用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。
它們的特色和區別以下:
Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,可以自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就能夠經過Hibernate提供的方法完成數據庫操做。Hibernate符合JPA規範,就是Java持久層API。
mybatis經過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,須要本身定義sql語句,不過更方便對sql語句進行優化。
總結起來:
4、Netty簡介
Netty是一個高性能的異步事件驅動的網絡通訊框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解
另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,通常不會在面試中出現,能夠做爲興趣簡單瞭解。
5、RPC服務
Motan、Dubbo、gRPC都是比較經常使用的高性能rpc框架,能夠提供完善的服務治理能力,java版本的通訊層都是基於前面提到的Netty實現。它們的特色稍後介紹。
6、其餘經常使用框架
jersy和restEasy都是能夠快速開發restful服務的框架。
和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用本身構建的API,是兩個不一樣的標準。
shiro框架是一個與spring security相似的開源的權限管理框架,用於訪問受權、認證、加密及會話管理。可以支持單機與分佈式session管理。
相比security,shiro更加簡單易用。
接下來看看一些知識點
1、spring基本概念Sping中的基本概念
涉及的流程與實現默認都是基於最新的5.x版本。
spring中的幾個重要概念以下:
1.IOC
IOC,就是控制反轉,如最左邊,拿公司招聘崗位來舉例:
假設一個公司有產品、研發、測試等崗位。若是是公司根據崗位要求,逐個安排人選,如圖中向下的箭頭,這是正向流程。若是反過來,不用公司來安排候選人,而是由第三方獵頭來匹配崗位和候選人,而後進行推薦,如圖中向上的箭頭,這就是控制反轉。
在spring中,對象的屬性是由對象本身建立的,就是正向流程;若是屬性不是對象建立,而是由spring來自動進行裝配,就是控制反轉。這裏的DI也就是依賴注入,就是實現控制反轉的方式。正向流程致使了對象於對象之間的高耦合,IOC能夠解決對象耦合的問題,有利於功能的複用,可以使程序的結構變得很是靈活。
2.context上下文和bean
spring進行IOC實現時使用的有兩個概念:context上下文和bean。如中間圖所示,全部被spring管理的、由spring建立的、用於依賴注入的對象,就叫作一個bean。
Spring建立並完成依賴注入後,全部bean統一放在一個叫作context的上下文中進行管理。
3.AOPAOP
就是面向切面編程。如右面的圖,通常程序執行流程是從controller層調用service層、而後service層調用DAO層訪問數據,最後在逐層返回結果。
這個是圖中向下箭頭所示的按程序執行順序的縱向處理。可是,一個系統中會有多個不一樣的服務,例如用戶服務、商品信息服務等等,每一個服務的controller層都須要驗證參數,都須要處理異常,若是按照圖中紅色的部分,對不一樣服務的縱向處理流程進行橫切,在每一個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每一個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。
AOP以功能進行劃分,對服務順序執行流程中的不一樣位置進行橫切,完成各服務共同須要實現的功能。
2、spring框架
Spring框架組件上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增長了用於異步響應式處理的WebFlux組件。
並不須要對全部的組件都詳細瞭解,只需重點了解最經常使用的幾個組件實現,以及知道每一個組件用來實現哪一類功能。
圖中紅框是比較重要的組件,core組件是spring全部組件的核心;bean組件和context組件我剛纔提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。
3、spring中機制和實現
1.AOP
AOP的實現是經過代理模式,在調用對象的某個方法時,執行插入的切面邏輯。實現的方式有動態代理也叫運行時加強,好比jdk代理、CGLIB;靜態代理是在編譯時進行織入或類加載時進行織入,好比AspectJ。
關於AOP還須要瞭解一下對應的Aspect、pointcut、advice等註解和具體使用方式。
2.placeHolder動態替換
主要須要瞭解替換髮生的時間,是在bean definition建立完成後,bean初始化以前,是經過實現BeanFactoryPostProcessor接口實現的。主要實現方式有PropertyPlaceholderConfigurer和PropertySourcesPlaceholderConfigurer。這兩個類實現邏輯不同,spring boot使用PropertySourcesPlaceholderConfigurer實現。
3.事務
須要瞭解spring 中對事務規定的隔離類型和事務傳播類型。要知道事務的隔離級別是由具體的數據庫來實現的,在數據庫部分我會詳細介紹。
事務的傳播類型,能夠重點了解最經常使用的REQUIRED和SUPPORTS類型。
4.核心接口類
ApplicationContext保存了ioc的整個應用上下文,能夠經過其中的beanfactory獲取到任意到bean;
BeanFactory主要的做用是根據bean definition來建立具體的bean;
BeanWrapper是對Bean的包裝,通常狀況下是在spring ioc內部使用,提供了訪問bean的屬性值、屬性編輯器註冊、類型轉換等功能,方便ioc容器用統一的方式來訪問bean的屬性;
FactoryBean經過getObject方法返回實際的bean對象,例如motan框架中referer對service的動態代理就是經過FactoryBean來實現的。
5.Scope
bean的scope是指bean的做用域,默認狀況下是單例模式,這也是使用最多的一種方式;多例模式,即每次從beanFactory中獲取bean都會建立一個新的bean。
request、session、global-session是在web服務中使用的scope,request每次請求都建立一個實例,session是在一個會話週期內保證只有一個實例。
global-session在5.x版本中已經不在使用,同時增長了Application和Websocket兩種scope,分別保證在一個ServletContext與一個WebSocket中只建立一個實例。
6.事件機制
spring的事件機制須要知道spring定義的五種標準事件,具體事件可見上圖,瞭解如何自定義事件和實現對應的applicationListener來處理自定義事件。
3、spring應用相關
1.經常使用註釋a.類型類註釋:
類型類註釋包括controller、service等,須要重點了解
其中component和bean註解的區別以下:
@Component註解在類上使用代表這個類是個組件類,須要Spring爲這個類建立bean。 @Bean註解使用在方法上,告訴Spring這個方法將會返回一個Bean對象,須要把返回的對象註冊到Spring的應用上下文中。
b.設置類註解
重點了解@Autowire和@Qualifier以及bytype、byname等不一樣的自動裝配機制。
c.web類註解
主要以瞭解爲主,關注@RequestMapping、@GetMapping、@PostMapping等路徑匹配註解,以及@PathVariable、@RequestParam 等參數獲取註解。
d.功能類註解
包括@ImportResource引用配置、@ComponentScan註解自動掃描、@Transactional事務註解等等,這裏不一一介紹了。
2.配置方式
須要瞭解配置spring的幾種方式,xml文件配置、註解配置和使用api進行配置。
自動裝配機制須要瞭解按類型匹配進行自動裝配,按bean名稱進行自動裝配,構造器中的自動裝配和自動檢測等主要的四種方式。
還須要瞭解一下list、set、map等集合類屬性的配置方式以及內部bean的使用。
4、Spring的Context的初始化流程
Spring Context初始化流程圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。不論哪一種context,建立後都會調用到AbstractApplicationContext類的refresh方法,這個方法是咱們要重點分析的。
refresh方法中,操做共分13步:
第1步:對刷新進行準備,包括設置開始時間、設置激活狀態、初始化context環境中的佔位符,這個動做根據子類的需求由子類來執行,而後驗證是否缺失必要的properties;
第2步:刷新並得到內部的bean factory;
第3步:對bean factory進行準備工做,好比設置類加載器和後置處理器、配置不進行自動裝配的類型、註冊默認的環境bean;
第4步:爲context的子類提供後置處理beanfactory的擴展能力。若是子類想在bean定義加載完成後,開始初始化上下文以前作一些特殊邏輯,能夠複寫這個方法;
第5步,執行context中註冊的beanfactory後綴處理器;
注:這裏有兩種後置處理器,一種是能夠註冊bean的後綴處理器,另外一種是針對bean factory進行處理的後置處理器。執行的順序是,先按優先級執行可註冊bean的處理器,在按優先級執行鍼對beanfactory的處理器。
對springboot來講,這一步會進行註解beandefinition的解析。流程如右面小框中所示,由ConfigurationClassPostProcessor觸發、由ClassPathBeanDefinitionScanner解析並註冊到beanfactory。
第6步:按優先級順序在beanfactory中註冊bean的後綴處理器,bean後置處理器能夠在bean初始化前、後執行處理;
第7步:初始化消息源,消息源用來支持消息的國際化;
第8步:初始化應用事件廣播器。事件廣播器用來向applicationListener通知各類應用產生的事件,是一個標準的觀察者模式;
第9步,是留給子類的擴展步驟,用來讓特定的context子類初始化其餘的bean;
第10步,把實現了ApplicationListener的bean註冊到事件廣播器,並對廣播器中的早期未廣播事件進行通知;
第11步,凍結全部bean描述信息的修改,實例化非延遲加載的單例bean;
第12步,完成上下文的刷新工做,調用LifecycleProcessor的onFresh()方法以及發佈ContextRefreshedEvent事件;
第13步:在finally中,執行第十三步,重置公共的緩存,好比ReflectionUtils中的緩存、AnnotationUtils中的緩存等等;
至此,spring的context初始化完成。這裏僅介紹了最主要的主流程,建議課後閱讀源碼來複習這個知識點,補全細節。
五:Spring中bean的生命週期
Spring中bean的生命週期面試中常常問到的bean的生命週期,先看綠色的部分,bean的建立過程:
第1步:調用bean的構造方法建立bean;
第2步:經過反射調用setter方法進行屬性的依賴注入;
第3步:若是實現BeanNameAware接口的話,會設置bean的name;
第4步:若是實現了BeanFactoryAware,會把bean factory設置給bean;
第5步:若是實現了ApplicationContextAware,會給bean設置ApplictionContext;
第6步:若是實現了BeanPostProcessor接口,則執行前置處理方法;
第7步:實現了InitializingBean接口的話,執行afterPropertiesSet方法;
第8步:執行自定義的init方法;
第9步:執行BeanPostProcessor接口的後置處理方法。
這時,就完成了bean的建立過程。
在使用完bean須要銷燬時,會先執行DisposableBean接口的destroy方法,而後在執行自定義的destroy方法。
這部分也建議閱讀源碼加深理解。
六:Spring擴展接口
Spring擴展接口對spring進行定製化功能擴展時,能夠選擇以下一些擴展點:
1.BeanFactoryPostProcessor是beanFactory後置處理器,支持在bean factory標準初始化完成後,對bean factory進行一些額外處理。
在講context初始化流程時介紹過,這時全部的bean的描述信息已經加載完畢,可是尚未進行bean初始化。例如前面提到的PropertyPlaceholderConfigurer,就是在這個擴展點上對bean屬性中的佔位符進行替換。
2.BeanDefinitionRegistryPostProcessor它擴展自BeanFactoryPostProcessor,在執行BeanFactoryPostProcessor的功能前,提供了能夠添加bean definition的能力,容許在初始化通常bean前,註冊額外的bean。
例如能夠在這裏根據bean的scope建立一個新的代理bean。
3.BeanPostProcessor提供了在bean初始化以前和以後插入自定義邏輯的能力。
與BeanFactoryPostProcessor的區別是處理的對象不一樣,BeanFactoryPostProcessor是對beanfactory進行處理,BeanPostProcessor是對bean進行處理。
注:上面這三個擴展點,能夠經過實現Ordered和PriorityOrdered接口來指定執行順序。實現PriorityOrdered接口的processor會先於實現Ordered接口的執行。
4.ApplicationContextAware能夠得到ApplicationContext及其中的bean,當須要在代碼中動態獲取bean時,能夠經過實現這個接口來實現。
5.InitializingBean能夠在bean初始化完成,全部屬性設置完成後執行特定邏輯,例如對自動裝配對屬性進行驗證等等。
6.DisposableBean用於在bean被銷燬前執行特定的邏輯,例如作一些回收工做等。
7.ApplicationListener用來監聽spring的標準應用事件或者自定義事件。
喜歡能夠加關注和喜歡哦