'10分鐘詳解Spring全家桶“7大知識點”'

SQL 數據庫 Java JSON MongoDB Redis 人生第一份工作 JAVA高級程序員 2019-08-21
"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增加了用於異步響應式處理的WebFlux組件。

並不需要對所有的組件都詳細瞭解,只需重點了解最常用的幾個組件實現,以及知道每個組件用來實現哪一類功能。

圖中紅框是比較重要的組件,core組件是spring所有組件的核心;bean組件和context組件我剛才提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。

三、spring中機制和實現

"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增加了用於異步響應式處理的WebFlux組件。

並不需要對所有的組件都詳細瞭解,只需重點了解最常用的幾個組件實現,以及知道每個組件用來實現哪一類功能。

圖中紅框是比較重要的組件,core組件是spring所有組件的核心;bean組件和context組件我剛才提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。

三、spring中機制和實現

10分鐘詳解Spring全家桶“7大知識點”

▌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來處理自定義事件。

三、spring應用相關

"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增加了用於異步響應式處理的WebFlux組件。

並不需要對所有的組件都詳細瞭解,只需重點了解最常用的幾個組件實現,以及知道每個組件用來實現哪一類功能。

圖中紅框是比較重要的組件,core組件是spring所有組件的核心;bean組件和context組件我剛才提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。

三、spring中機制和實現

10分鐘詳解Spring全家桶“7大知識點”

▌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來處理自定義事件。

三、spring應用相關

10分鐘詳解Spring全家桶“7大知識點”

▌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的使用。

四、Spring的Context的初始化流程

"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增加了用於異步響應式處理的WebFlux組件。

並不需要對所有的組件都詳細瞭解,只需重點了解最常用的幾個組件實現,以及知道每個組件用來實現哪一類功能。

圖中紅框是比較重要的組件,core組件是spring所有組件的核心;bean組件和context組件我剛才提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。

三、spring中機制和實現

10分鐘詳解Spring全家桶“7大知識點”

▌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來處理自定義事件。

三、spring應用相關

10分鐘詳解Spring全家桶“7大知識點”

▌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的使用。

四、Spring的Context的初始化流程

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。不論哪種context,創建後都會調用到AbstractApplicationContext類的refresh方法,這個方法是我們要重點分析的。

refresh方法中,操作共分13步:

第1步:對刷新進行準備,包括設置開始時間、設置激活狀態、初始化context環境中的佔位符,這個動作根據子類的需求由子類來執行,然後驗證是否缺失必要的properties;

第2步:刷新並獲得內部的bean factory;

第3步:對bean factory進行準備工作,比如設置類加載器和後置處理器、配置不進行自動裝配的類型、註冊默認的環境bean;

第4步:為context的子類提供後置處理bean factory的擴展能力。如果子類想在bean定義加載完成後,開始初始化上下文之前做一些特殊邏輯,可以複寫這個方法;

第5步,執行context中註冊的bean factory後綴處理器;

注:這裡有兩種後置處理器,一種是可以註冊bean的後綴處理器,另一種是針對bean factory進行處理的後置處理器。執行的順序是,先按優先級執行可註冊bean的處理器,在按優先級執行鍼對beanfactory的處理器。

對springboot來說,這一步會進行註解bean definition的解析。流程如右面小框中所示,由ConfigurationClassPostProcessor觸發、由ClassPathBeanDefinitionScanner解析並註冊到bean factory。

第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框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增加了用於異步響應式處理的WebFlux組件。

並不需要對所有的組件都詳細瞭解,只需重點了解最常用的幾個組件實現,以及知道每個組件用來實現哪一類功能。

圖中紅框是比較重要的組件,core組件是spring所有組件的核心;bean組件和context組件我剛才提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。

三、spring中機制和實現

10分鐘詳解Spring全家桶“7大知識點”

▌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來處理自定義事件。

三、spring應用相關

10分鐘詳解Spring全家桶“7大知識點”

▌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的使用。

四、Spring的Context的初始化流程

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。不論哪種context,創建後都會調用到AbstractApplicationContext類的refresh方法,這個方法是我們要重點分析的。

refresh方法中,操作共分13步:

第1步:對刷新進行準備,包括設置開始時間、設置激活狀態、初始化context環境中的佔位符,這個動作根據子類的需求由子類來執行,然後驗證是否缺失必要的properties;

第2步:刷新並獲得內部的bean factory;

第3步:對bean factory進行準備工作,比如設置類加載器和後置處理器、配置不進行自動裝配的類型、註冊默認的環境bean;

第4步:為context的子類提供後置處理bean factory的擴展能力。如果子類想在bean定義加載完成後,開始初始化上下文之前做一些特殊邏輯,可以複寫這個方法;

第5步,執行context中註冊的bean factory後綴處理器;

注:這裡有兩種後置處理器,一種是可以註冊bean的後綴處理器,另一種是針對bean factory進行處理的後置處理器。執行的順序是,先按優先級執行可註冊bean的處理器,在按優先級執行鍼對beanfactory的處理器。

對springboot來說,這一步會進行註解bean definition的解析。流程如右面小框中所示,由ConfigurationClassPostProcessor觸發、由ClassPathBeanDefinitionScanner解析並註冊到bean factory。

第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的生命週期

10分鐘詳解Spring全家桶“7大知識點”

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 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增加了用於異步響應式處理的WebFlux組件。

並不需要對所有的組件都詳細瞭解,只需重點了解最常用的幾個組件實現,以及知道每個組件用來實現哪一類功能。

圖中紅框是比較重要的組件,core組件是spring所有組件的核心;bean組件和context組件我剛才提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。

三、spring中機制和實現

10分鐘詳解Spring全家桶“7大知識點”

▌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來處理自定義事件。

三、spring應用相關

10分鐘詳解Spring全家桶“7大知識點”

▌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的使用。

四、Spring的Context的初始化流程

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。不論哪種context,創建後都會調用到AbstractApplicationContext類的refresh方法,這個方法是我們要重點分析的。

refresh方法中,操作共分13步:

第1步:對刷新進行準備,包括設置開始時間、設置激活狀態、初始化context環境中的佔位符,這個動作根據子類的需求由子類來執行,然後驗證是否缺失必要的properties;

第2步:刷新並獲得內部的bean factory;

第3步:對bean factory進行準備工作,比如設置類加載器和後置處理器、配置不進行自動裝配的類型、註冊默認的環境bean;

第4步:為context的子類提供後置處理bean factory的擴展能力。如果子類想在bean定義加載完成後,開始初始化上下文之前做一些特殊邏輯,可以複寫這個方法;

第5步,執行context中註冊的bean factory後綴處理器;

注:這裡有兩種後置處理器,一種是可以註冊bean的後綴處理器,另一種是針對bean factory進行處理的後置處理器。執行的順序是,先按優先級執行可註冊bean的處理器,在按優先級執行鍼對beanfactory的處理器。

對springboot來說,這一步會進行註解bean definition的解析。流程如右面小框中所示,由ConfigurationClassPostProcessor觸發、由ClassPathBeanDefinitionScanner解析並註冊到bean factory。

第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的生命週期

10分鐘詳解Spring全家桶“7大知識點”

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擴展接口

10分鐘詳解Spring全家桶“7大知識點”

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的標準應用事件或者自定義事件。

七、springboot相關的知識點

"

Spring框架自誕生以來一直備受開發者青睞,有人親切的稱之為:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解決方案。

很多研發人員把spring看作心目中最好的java項目,沒有之一。

所以這是重點也是難點,工作中必須會,面試時肯定考。

那麼,今天花費10分鐘,梳理Spring框架相關知識。

Spring知識點-彙總

spring系列包含非常多的項目,可以滿足java開發中的方方面面。

先來看常用框架的知識點彙總,如圖:

10分鐘詳解Spring全家桶“7大知識點”

一、5個常用的spring框架

▌1.spring framework

也就是我們經常說的spring框架,包括了ioc依賴注入,Context上下文、bean管理、springmvc等眾多功能模塊,其它spring項目比如spring boot也會依賴spring框架。

▌2.spring boot

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大於配置,應用只需要很少的配置即可,簡化了應用開發模式。

▌3.Spring Data

是一個數據訪問及操作的工具集,封裝了多種數據源的操作能力,包括:jdbc、Redis、MongoDB等。

▌4.Spring Cloud

是一套完整的微服務解決方案,是一系列不同功能的微服務框架的集合。Spring Cloud基於Spring Boot,簡化了分佈式系統的開發,集成了服務發現、配置管理、消息總線、負載均衡、斷路器、數據監控等各種服務治理能力。比如sleuth提供了全鏈路追蹤能力,Netflix套件提供了hystrix熔斷器、zuul網關等眾多的治理組件。config組件提供了動態配置能力,bus組件支持使用RabbitMQ、kafka、Activemq等消息隊列,實現分佈式服務之間的事件通信。

▌5. Spring Security

主要用於快速構建安全的應用程序和服務,在Spring Boot和Spring Security OAuth2的基礎上,可以快速實現常見安全模型,如單點登錄,令牌中繼和令牌交換。你可以瞭解一下oauth2授權機制和jwt認證方式。oauth2是一種授權機制,規定了完備的授權、認證流程。JWT全稱是JSON Web Token,是一種把認證信息包含在token中的認證實現,oauth2授權機制中就可以應用jwt來作為認證的具體實現方法。

二、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框架的學習為主。

三、常用的ORM框架

ORM就是對象關係匹配,是為了解決面向對象與關係數據庫存在的互不匹配的問題。簡單來說,就是把關係數據庫中的數據轉換成面向對象程序中的對象。

常用的ORM框架有Hibernate和MyBatis,也就是ssh組合和ssm組合中的h與m。

它們的特點和區別如下:

Hibernate對數據庫結構提供了完整的封裝,實現了POJO對象與數據庫表之間的映射,能夠自動生成並執行SQL語句。只要定義了POJO 到數據庫表的映射關係,就可以通過Hibernate提供的方法完成數據庫操作。Hibernate符合JPA規範,就是Java持久層API。

mybatis通過映射配置文件,將SQL所需的參數和返回的結果字段映射到指定對象,mybatis不會自動生成sql,需要自己定義sql語句,不過更方便對sql語句進行優化。

總結起來:

1.hibernate配置要比mybatis複雜的多,學習成本也比mybatis高。mybatis,簡單、高效、靈活,但是需要自己維護sql;

2.hibernate功能強大、全自動、適配不同數據庫,但是非常複雜,靈活性稍差。

四、Netty簡介

Netty是一個高性能的異步事件驅動的網絡通信框架,Netty對JDK原生NIO進行封裝,簡化了網絡服務的開發。下文會詳細講解

另外,同類型的框架還有mina、grizzly,不過目前使用的相對較少,一般不會在面試中出現,可以作為興趣簡單瞭解。

五、RPC服務

Motan、Dubbo、gRPC都是比較常用的高性能rpc框架,可以提供完善的服務治理能力,java版本的通信層都是基於前面提到的Netty實現。它們的特點稍後介紹。

六、其他常用框架

jersy和restEasy都是可以快速開發restful服務的框架。

和springmvc相比,這兩個框架都是基於jax-rs標準,而springmvcs基於servlet,使用自己構建的API,是兩個不同的標準。

shiro框架是一個與spring security類似的開源的權限管理框架,用於訪問授權、認證、加密及會話管理。能夠支持單機與分佈式session管理。

相比security,shiro更加簡單易用。

本篇文章將重點闡述Spring相關知識點,其他框架請期待下一篇

Spring知識點-詳解

一、spring基本概念

10分鐘詳解Spring全家桶“7大知識點”

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.AOP

AOP就是面向切面編程。如右面的圖,一般程序執行流程是從controller層調用service層、然後service層調用DAO層訪問數據,最後在逐層返回結果。

這個是圖中向下箭頭所示的按程序執行順序的縱向處理。但是,一個系統中會有多個不同的服務,例如用戶服務、商品信息服務等等,每個服務的controller層都需要驗證參數,都需要處理異常,如果按照圖中紅色的部分,對不同服務的縱向處理流程進行橫切,在每個切面上完成通用的功能,例如身份認證、驗證參數、處理異常等等、這樣就不用在每個服務中都寫相同的邏輯了,這就是AOP思想解決的問題。

AOP以功能進行劃分,對服務順序執行流程中的不同位置進行橫切,完成各服務共同需要實現的功能。

二、spring框架

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

上圖列出了spring框架主要包含的組件。這張圖來自spring4.x的文檔。目前最新的5.x版本中右面的portlet組件已經被廢棄掉,同時增加了用於異步響應式處理的WebFlux組件。

並不需要對所有的組件都詳細瞭解,只需重點了解最常用的幾個組件實現,以及知道每個組件用來實現哪一類功能。

圖中紅框是比較重要的組件,core組件是spring所有組件的核心;bean組件和context組件我剛才提到了,是實現IOC和依賴注入的基礎;AOP組件用來實現面向切面編程;web組件包括springmvc是web服務的控制層實現。

三、spring中機制和實現

10分鐘詳解Spring全家桶“7大知識點”

▌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來處理自定義事件。

三、spring應用相關

10分鐘詳解Spring全家桶“7大知識點”

▌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的使用。

四、Spring的Context的初始化流程

10分鐘詳解Spring全家桶“7大知識點”

Spring框架組件

圖中左上角是三種類型的context,xml配置方式的context、springboot的context和web服務的context。不論哪種context,創建後都會調用到AbstractApplicationContext類的refresh方法,這個方法是我們要重點分析的。

refresh方法中,操作共分13步:

第1步:對刷新進行準備,包括設置開始時間、設置激活狀態、初始化context環境中的佔位符,這個動作根據子類的需求由子類來執行,然後驗證是否缺失必要的properties;

第2步:刷新並獲得內部的bean factory;

第3步:對bean factory進行準備工作,比如設置類加載器和後置處理器、配置不進行自動裝配的類型、註冊默認的環境bean;

第4步:為context的子類提供後置處理bean factory的擴展能力。如果子類想在bean定義加載完成後,開始初始化上下文之前做一些特殊邏輯,可以複寫這個方法;

第5步,執行context中註冊的bean factory後綴處理器;

注:這裡有兩種後置處理器,一種是可以註冊bean的後綴處理器,另一種是針對bean factory進行處理的後置處理器。執行的順序是,先按優先級執行可註冊bean的處理器,在按優先級執行鍼對beanfactory的處理器。

對springboot來說,這一步會進行註解bean definition的解析。流程如右面小框中所示,由ConfigurationClassPostProcessor觸發、由ClassPathBeanDefinitionScanner解析並註冊到bean factory。

第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的生命週期

10分鐘詳解Spring全家桶“7大知識點”

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擴展接口

10分鐘詳解Spring全家桶“7大知識點”

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的標準應用事件或者自定義事件。

七、springboot相關的知識點

10分鐘詳解Spring全家桶“7大知識點”

▌1.啟動流程

主要步驟首先要配置environment,然後準備context上下文,包括執行applicationContext的後置處理、初始化initializer、通知listener處理contextPrepared和contextLoaded事件。最後執行refreshContext,也就是前面介紹過的AbstractApplicationContext類的refresh方法。

▌2.配置文件

然後要知道在Spring Boot中有兩種上下文,一種是bootstrap, 另外一種是application。

bootstrap是應用程序的父上下文,也就是說bootstrap會先於applicaton加載。bootstrap主要用於從額外的資源來加載配置信息,還可以在本地外部配置文件中解密屬性。bootstrap裡面的屬性會優先加載,默認也不能被本地相同配置覆蓋。

▌3.註解

@SpringBootApplication包含了@ComponentScan、@EnableAutoConfiguration、@SpringBootConfiguration三個註解

而@SpringBootConfiguration註解包含了@Configuration註解。也就是springboot的自動配置功能。

@Conditional註解就是控制自動配置的生效條件的註解,例如bean或class存在、不存在時進行配置,當滿足條件時進行配置等等。

▌4.特色模塊

  • starter是springboot提供的無縫集成功能的一種方式,使用某個功能時開發者不需要關注各種依賴庫的處理,不需要具體的配置信息,由Spring Boot自動配置進行bean的創建。例如需要使用web功能時,只需要在依賴中引入spring-boot-starter-web即可。
  • actuator是用來對應用程序進行監視和管理,通過restful api請求來監管、審計、收集應用的運行情況。
  • devtools提供了一系列開發工具的支持,來提高開發效率。例如熱部署能力等。
  • CLI就是命令行接口,是一個命令行工具,支持使用Groovy腳本,可以快速搭建spring原型項目。

以上為Spring框架需要掌握的內容,前面提到的核心機制、核心流程,建議閱讀源碼加深理解。

關注作者:JAVA高級程序員

我會不定期在微頭條發放:(Java工程化、分佈式架構、高併發、高性能、深入淺出、微服務架構、Spring、MyBatis、Netty、源碼分析)等技術學習資料,以及Java進階學習路線圖。

"

相關推薦

推薦中...