Java初級開發工程師面試題合集

相逢亦非晚發表於2020-12-14

一.多執行緒

什麼是多執行緒?

​ 多執行緒是指程式中包含多個流,即在一個程式中可以同時進行多個不同的執行緒來執行不同的任務

多執行緒的優劣?

​ 優點:可以提高CPU利用率, 提高了程式的效率, 單個程式可以建立多個不同的執行緒來完成各自的任務

​ 缺點:執行緒也是程式,需要佔據記憶體.多執行緒需要協調和管理,所以需要CPU跟蹤執行緒.

併發和並行的區別?

​ 併發:多個任務在同一個CPU上,按照細分的時間片段輪流交替執行.

​ 並行:單位時間內,多個處理器或者多核處理器同時處理多個任務,真正意義上的同時進行

併發程式設計三要素(怎麼保證多執行緒的執行緒安全,執行緒安全在哪些方面體現)?

​ 原子性:一個或多個操作, 要麼全部執行且不被打斷, 要麼就全部不執行

​ 可見性: 多個執行緒操作一個共享變數時, 其中一個變數修改後, 其他執行緒可以立刻看到修改結果

​ 有序性:程式的執行順序按照程式碼先後順序來執行

執行緒與程式的區別?

​ 根本區別:程式是作業系統資源分配的基本單元,執行緒是處理器任務排程和執行的基本單位

​ 包含關係:如果一個程式內有多個執行緒,則執行的過程不是一條線的,而是多條線(多執行緒),共同完成,執行緒是程式的一部分.

​ 記憶體分配:同一個程式的執行緒共享本程式的地址空間和資源,程式之間的地址空間和資源是相互獨立的.

守護執行緒:服務執行緒,準確的來說就是服務其他的執行緒

什麼是執行緒死鎖

​ 死鎖是指兩個或者以上的程式(執行緒)在執行過程中, 由於競爭資源或由於彼此通訊造成的一種堵塞現象,若無外力作用,都將無法進行推進,此時的系統處於死鎖狀態.

形成死鎖的條件及解決辦法

​ 互斥條件:一個資源只能被一個程式佔用,直到該程式被釋放

​ 請求與保持條件:一個執行緒請求被佔有資源而發生堵塞時,對以獲取資源保持不放

​ 不剝奪條件:執行緒以獲取的資源在未使用完之前不能被其他執行緒強行剝奪, 只有等自己使用完才釋放資源.

​ 迴圈等待條件: 發生死鎖時, 等待的執行緒必定形成一個環路, 死迴圈造成永久堵塞.

​ 解決辦法:一次申請所有資源. 佔有部分資源的執行緒嘗試申請其它資源, 申請不到,主動釋放它佔有的資源. 按順序來申請資源.

建立執行緒的四種方式

​ 繼承Thread類

​ 實現Runnable介面

​ 實現Callable介面

​ Executors工具類建立執行緒池

runnable和callable的區別:

  • runnable中的run()方法返回void,只是純粹執行run()方法中的程式碼
  • callable:中的call()方法有返回值,一個泛型,和Future,FutureTask配合可獲得非同步執行的結果

run()方法和start()方法有什麼區別

​ start()方法用於啟動執行緒, run()方法用於執行執行緒的執行程式碼, run()可以反覆呼叫, 而start() 方法只能被呼叫一次

​ 呼叫start()方法啟動執行緒可以使執行緒進入就緒狀態, 等待執行; run()方法只是thread的一個普通方法呼叫, 還是在主執行緒裡執行.

執行緒生命週期的6個狀態

​ 新建(NEW):初始化狀態,未啟動

​ 就緒(RUNNABLE):已經呼叫Thread 的start方法啟動了, 等待CPU排程, 就緒狀態

​ 銷燬(TERMINATED):死亡狀態, 已正常執行完run()中的方法,或者因為未捕捉的異常而終止run()方法了

​ 計時等待(TIMED_WAITING):睡眠狀態, 呼叫sleep(引數)或wait(引數)後執行緒進入計時休眠狀態,

​ 等待(WAITING):呼叫wait()方法, 釋放鎖進入無線等待狀態

​ 阻塞(BLOCKED):執行的執行緒執行wait()方法, 執行的執行緒獲取物件的同步鎖時, 同步鎖被別的執行緒佔用, 進入阻塞狀態.

sleep()和wait()有什麼區別

​ 相同:兩者都可以使執行緒進入等待狀態

​ 不同:sleep()是Thread類下的靜態方法, wait()是Object類下的方法

​ sleep()不釋放鎖, wait()釋放鎖

​ wait()常用語執行緒之間的通訊, sleep()常用語暫停執行.

如何在兩個執行緒之間共享資料?

​ 兩個執行緒之間共享變數即可實現共享資料. 一般來說共享變數要求變數本身是執行緒安全的, 然後再執行緒中對變數使用

什麼是執行緒安全?Servlet是執行緒安全的嗎?

​ 執行緒安全是指某個方法在多執行緒的環境下被呼叫時, 能夠正確處理多執行緒之間的共享變數, 使程式能正確完成.

​ Servlet不是執行緒安全的, 它是單例項多執行緒, 多個執行緒訪問一個方法時, 不能保證共享變數是安全的

什麼是執行緒池?

​ 提前常見若干個執行緒, 有任務需要處理, 執行緒池裡的執行緒就會處理任務, 處理完執行緒後執行緒並不會銷燬, 而是等待下一個任務,存放線上程池中.

​ Java提供了一個java.util.concurrent.Executor介面用於建立執行緒池

四種執行緒池的建立

​ newCachedThreadPool:建立一個可快取執行緒池

​ newFixedThreadPool:建立一個定長執行緒池,提交一個任務就建立,可控制執行緒最大併發數

​ newScheduledThreadPool:建立一個固定長度執行緒池, 支援定時及週期性執行任務

​ newSingleThreadExecutor:建立一個單執行緒化的執行緒池, 它只會用唯一的工作執行緒來執行任務

執行緒池的五種狀態?

  • Running
  • ShutDown
  • Stop
  • Tidying:
  • Terminated

執行緒池的優點?

​ 重用存在的執行緒, 減少物件建立銷燬的開銷

​ 可有效的控制最大併發執行緒數, 提高系統資源的使用率, 同時避免過多資源競爭, 避免堵塞

​ 提供定時執行, 定期執行, 但執行緒, 併發數控制等功能

什麼是樂觀鎖和悲觀鎖

​ 樂觀鎖:對併發間操作產生的執行緒安全問題持樂觀狀態, 將比較-替換這兩個動作作為一個原子去修改記憶體中的變數; 通過不加鎖來處理資源

​ 悲觀鎖: 每次對某資源進行操作時, 都會持有一個獨佔的鎖; 將資源鎖住, 等一個之前獲得鎖的執行緒釋放鎖後, 下一個執行緒才可以訪問

多執行緒同步有哪幾種方法?

​ Synchronized關鍵字:用來給方法,程式碼塊加鎖。共享物件頭。Java自帶,Jvm層面。非公平,適合少量程式碼同步問題

​ Lock鎖實現:共享某個變數。一個Java類。公平,適合大量同步程式碼同步問題

​ 分散式鎖:多個程式不在同一個系統中,使用分散式鎖控制多個程式對資源的訪問。

Synchronized的底層實現原理?

synchronized可以保證方法或者程式碼塊在執行時,同一時刻只有一個方法可以進入到臨界區,同時它還可以保證共享變數的記憶體可見性。

Java中每一個物件都可以作為鎖,這是synchronized實現同步的基礎:

  • 普通同步方法:鎖是當前例項物件
  • 靜態同步方法:鎖是當前類的class物件
  • 同步方法快:鎖是括號裡面的內容

二.集合框架

什麼是集合?

​ 集合可以看做是一種容器, 用來儲存物件資訊

陣列和集合的區別?

​ 陣列長度不可變,無法儲存有對映關係的資料, 集合用於儲存不確定的資料, 以及儲存具有對映關係的資料

​ 陣列元素可以使基本型別的值, 也可以是物件, 集合只能儲存物件

​ Java集合類主要有兩個介面Conllection和Map

​ Collection介面常用集合: ArrayList, LinkedList, HashSet, TreeSet, Vector

​ Map介面常用集合: HashMap, TreeMap

Collections和Collection的區別

Collections:是集合類的工具類提供了一系列靜態方法,用於對集合中元素進行排序、搜尋以及執行緒安全等各種操作。

Collection:集合的頂級介面

List, Set, Map的區別?

​ List: 有序, 可重複集合, 集合中每個元素都有對應順序索引

​ Set: 有序, 不可重複集合, 重複元素會覆蓋

​ Map: 鍵值對儲存, 無序, 元素不可重複,重複元素覆蓋

HashMap和Hashtable的區別?

​ 都是集合,底層雜湊演算法

區別:

  • HashMap執行緒不安全,效率高。可以儲存null鍵值對
  • Hashtable執行緒安全(每個方法中都加入了synchronized),效率低,不可以儲存null鍵值

HashMap的資料結構

​ jdk1.7: HashMap實際上是一個陣列和連結串列結構的雜湊表

​ jdkq.8: 連結串列中的元素超過了8個後, 會將連結串列轉換為紅黑樹

HashSet的實現原理?

  • HashSet底層有HashMap實現
  • HashSet值存放於HashMap的key上
  • HashMap的value值統一為present

ArrayList和LinkLIst的區別?

ArrayList底層資料結構是陣列

LinkList底層資料結構是連結串列

List轉換為陣列:ArrayList的toArray方法

陣列轉換為List:呼叫Arrays的asList方法

ArrayList和Vector的區別?

  • Vector是同步的,ArrayList不是。執行緒安全, 資料增長原來的2倍
  • ArrayList是同步的,不會過載,比Vector快。非執行緒安全, 資料增長沒有明確規定, 原始碼來看是增長原來的1.5倍

哪些集合是執行緒安全的?

  • vector:執行緒安全,效率低
  • HashTable:執行緒安全
  • statck:堆疊類,先進後出

三.網路程式設計

TCP與UDP的區別

​ TCP:傳輸控制協議, 為應用程式提供可靠的通訊連線,適合一次傳輸大批資料的情況,面向連線的協議

​ UDP: 使用者資料包協議, 提供無連線通訊, 且不對傳送包進行可靠的保證

​ TCP為可靠的連線, UDP為不可靠的連線

​ TCP佔有系統資源較多, UDP佔有系統資源少

​ TCP保證資料準確性, UDP可能丟包, TCP保證資料順序,UDP不保證

三次握手,四次揮手詳細過程及作用

建立連線:

​ 一次握手: 客戶端傳送syn包到伺服器,等待伺服器確認

​ 二次握手: 伺服器收到syn包, 確認客戶的syn, 同時自己傳送syn + ACK包給客戶端並進入等待

​ 三次握手: 客戶端收到伺服器的SYN + ACK包, 完成三次握手, 開始傳送資料

​ 三次握手完成後, 客戶端與伺服器才正式開始傳送資料

斷開連線:

​ 一次揮手:主動關閉方傳送FIN用來關閉主動方到被動關閉方的資料傳送

​ 二次揮手: 被動關閉方收到FIN包後, 傳送一個ACK給對方

​ 三次揮手: 被動關閉方傳送一個FIN,用來關閉被動關閉方到主動關閉方的資料傳送

​ 四次揮手: 主動關閉方收到FIN後, 傳送一個ACK給被動關閉方

四層網路模型和七層網路模型

四層網路模型:

​ 應用層:應用程式間溝通的層

​ 傳輸層:負責傳輸資料,並確認資料已送達並接收

​ 網際網路絡層: 負責提供基本的資料封包傳送功能

​ 網路介面層:對實際的網路媒體的管理, 定義如何使用實際網路

OSI七層網路模型:

​ 物理層, 資料鏈路層, 網路層, 傳輸層, 會話層, 表示層, 應用層

什麼是Socket?

​ Socket: 用於描述IP地址和埠, 可以用來實現不同虛擬機器或者計算機之間的通訊, 在Internet上的主機一般執行了多個服務軟體, 每種服務開啟一個Socket, 並繫結到一個埠上, 不同埠對應不同的服務.

IO流

IO流是用來處理裝置之間傳輸資料,下載檔案,上傳檔案。

​ 按照流向分,可以分為輸入流和輸出流

​ 按照操作單元分,可以分為位元組流和字元流

​ 按照角色劃分為節點流和處理流

輸入流:程式從輸入流中讀取資料,

輸出流:程式向輸出流寫入資料。程式將資料輸出到外界。

BIO,NIO,AIO的區別?

  • BIO:block IO同步阻塞式IO,傳統IO,併發處理能力低
  • NIO:Non IO同步非阻塞IO,客戶端和伺服器通過Channel(通道)通訊,實現了多路複用
  • AIO:Asynchronous IO是NO的升級,NIO2,實現了非同步非阻塞IO,非同步IO的操作基於事件和回撥機制。

四.網路協議

​ 網路協議:計算機網路要有條不紊的交換資料, 就必須遵守一些實現約定好的規則, 這些規則被稱為網路協議.

​ 網路層協議: IP協議, ICMP協議, ARP協議, RARP協議

​ 傳輸層協議: TCP協議, UDP協會

​ 應用層協議: FTP, TeInet, SMTP, HTTP, RIP, NFS, DNS

什麼是HTTP, HTTP與HTTPS的區別?

​ HTTP:(Hyper Text Transfer Protocol 超文字傳輸協議) 埠80, 執行在TCP上, 明文傳輸, 短連線, 客戶端與服務端都無法驗證對方身份

​ HTTPS: 埠443, 新增了加密和認證機制的HTTP

Session, COokie, Token的區別

​ HTTP協議本身是無狀態的, 即伺服器無法判斷使用者身份

​ cookie: web伺服器儲存在使用者瀏覽器上的小檔案(key-value格式), 包含使用者相關資訊.

​ session: 瀏覽器和伺服器會話過程中, 伺服器分配的一塊儲存空間.存放在伺服器上

​ token: 伺服器生成的一串字串, 作為客戶端請求的一個令牌, 第一次登陸後, 伺服器生成一個token將此token返回給客戶端, 客戶端請求攜帶token請求資料即可. 適用於前後端分離專案.

五.Redis

什麼是Redis?為什麼要用redis?

​ Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高效能非關係型(NoSQL)的鍵值對資料庫。

​ 高效能和高併發:直接操作記憶體,速度快。資料結構簡單,對資料操作也簡單。採用單執行緒,不存在加鎖釋放鎖的操作,不會導致死鎖。能接受的請求遠大於直接訪問資料庫。

Redis支援的資料型別有哪些?

​ Redis 可以儲存鍵和五種不同型別的值之間的對映。鍵的型別只能為字串,值支援五種資料型別:字串(String)、列表(List)、集合(Set)、雜湊表(Hash)(內部是HashMap,成員較少以一維陣列儲存,成員增多轉成HashMap)、有序集合(zset)。

Redis的優缺點有哪些?

優點:讀寫效能優異,支援資料持久化,支援事務,資料結構豐富,支援主從複製

缺點:

​ 資料庫容量收到實體記憶體的限制。

​ Redis不具備自動容錯和恢復功能

​ 較難支援線上擴容

什麼是Redis持久化?Redis有哪些持久化方式?

持久化:把記憶體中的資料寫入到磁碟中,放置伺服器當機導致記憶體資料丟失。

方式:RDB(預設Redis DataBase) 和 AOF(Append-only file)

比較:

​ AOF 檔案比 RDB 更新頻率高,優先使用aof還原資料

​ AOF 比 RDB 更安全

快取異常

  • 快取雪崩:

​ 快取雪崩指快取同一時間大面積的失效,所以,後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉

​ 解決方案:

​ 1.快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。

​ 2.給每一個快取資料增加相應的快取標記,記錄快取的是否失效,如果快取標記失效,則更新資料快取

​ 3.一般併發量不是特別多的時候,使用最多的解決方案是加鎖排隊

  • 快取穿透:

​ 快取穿透值快取和資料庫中都沒有的資料,導致所有請求都落到資料庫上

​ 解決方案:

​ 1.介面層增加校驗

​ 2…對一定不存在的key進行過濾,可以把所有可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。

  • 快取擊穿:

​ 快取中沒有但資料庫中有的資料,由於併發使用者多,同時讀取快取未讀取到資料,同時去資料庫讀取資料,資料庫壓力過大。

​ 解決方案:

​ 1.熱點資料永不過期

​ 2.加互斥鎖

  • 快取預熱:

​ 相關快取資料直接載入到快取系統

​ 解決方案:

​ 1.定時快取重新整理

​ 2.資料量不大,可以專案啟動自動載入

  • 快取降級:

​ 服務出現問題,不影響核心服務,對其他服務進行降級處理。

Redis儲存過程

  1. 首先建立與Redis伺服器端的連線
  2. 用set方法將字串存放到redis中
  3. set可以用覆蓋的方式修改已存在的值
  4. get方法可以讀取存入的值,delete方法可以儲存存入的值

Redis叢集

六.Nginx

什麼是Nginx?

​ Nginx是一個web伺服器和方向代理伺服器,用於HTTPHTTPSSMTPPOP3IMAP協議。

Nginx的優點有哪些?

​ 佔記憶體小,可實現高併發連線,處理響應快

​ 可實現http伺服器、虛擬主機、方向代理、負載均衡

​ Nginx配置簡單

​ Nginx內建的健康檢查功能

Nginx處理請求?

​ nginx接收一個請求後,首先由listen和server_name指令匹配server模組,再匹配server模組裡的location,location就是實際地址

server {            					# 第一個Server區塊開始,表示一個獨立的虛擬主機站點
    listen       80;      				# 提供服務的埠,預設80
    server_name  localhost;       		# 提供服務的域名主機名
    location / {            			# 第一個location區塊開始
        root   html;       				# 站點的根目錄,相當於Nginx的安裝目錄
        index  index.html index.htm;     # 預設的首頁檔案,多個用空格分開
         }          					# 第一個location區塊結果

正向代理和反向代理是什麼?

​ 1.正向代理:一個人傳送請求直接到達目標的伺服器

​ 2.反向代理:請求統一被Nginx接收,nginx反向代理伺服器接收到後,按照一定規則分發給後端的業務處理伺服器進行處理

使用反向代理伺服器的優點是什麼?

​ 可以隱藏源伺服器的存在和特徵,充當網際網路雲和web伺服器之間的中間層

反向代理負載均衡是什麼?

​ 單臺伺服器不能滿足使用者的請求時,需要用多臺伺服器叢集可以使用nginx做反向代理。並且多臺伺服器可以平均分擔負載,不會應為某臺伺服器負載高當機而某臺伺服器閒置的情況。

負載均衡演算法怎麼實現?策略有哪些?

​ 當使用者訪問時,先訪問到一個轉發伺服器,再由轉發伺服器將訪問分發到壓力更小的伺服器。

策略:

​ 1.輪詢:每個請求按時間順序逐一分配到不同的後端伺服器

upstream backserver { 
    server 192.168.0.12; 
    server 192.168.0.13; 
} 

​ 2.權重:weight值越大分配到的訪問率越高。

upstream backserver { 
    server 192.168.0.12 weight=2; 
    server 192.168.0.13 weight=8; 
} 

​ 3.ip_hash(IP繫結)每個請求按訪問IP的雜湊結果分配,使來自同一個IP的訪客固定訪問一臺後端伺服器,有效解決動態網頁存在的session共享問題

upstream backserver { 
    ip_hash; 
    server 192.168.0.12:88; 
    server 192.168.0.13:80; 
} 

​ 4.fair

​ 5.url雜湊:地址繫結

七.jdk1.8特性

  1. Iterator迭代器介面中的forEach()方法:將遍歷邏輯與業務邏輯分離
    • Iterator迭代器是一個物件,工作內容是遍歷並選擇序列中的物件。可以實現對容器的遍歷
    • 迭代器的使用:使用Iterator()方法返回一個Iterator,通過next()返回第一個元素。用hasNext判斷容器中是否還有其他元素。
  2. 介面中可以有靜態方法和預設方法
  3. java Stream API: 集合批量資料操作
  4. 新的時間Api: java.time,簡化java中使用時間的過程

八.Spring框架

什麼是spring

​ 輕量級的控制反轉,面向切面的容器框架

​ 輕量級的Java開發框架,為了解決企業級應用開發的業務邏輯層和其他層的耦合問題

​ spring功能底層依賴它的核心特性:依賴注入(DI)和面向切面程式設計(AOP)

通過依賴注入和麵向介面實現鬆耦合,基於切面和慣例進行宣告式程式設計,通過切面和模板減少樣板式程式碼。

Spring框架的核心

​ IOC(控制反轉)和AOP(面向切面)和DI(依賴注入)

Spring模組

​ spring core:提供了框架的基本組成部分,包括IOC和DI功能

​ spring beans: 提供了BeanFactory,Spring將管理物件稱為Bean

​ spring context: 提供了框架式的物件訪問方法

​ spring jdbc: 提供了一個JDBC的抽象層,簡化JDBC

​ spring aop: 提供了面向切面的程式設計實現,可以自定義攔截器,切點等

​ spring Web : 提供了針對web開發的整合特性

Spring框架中用到了哪些設計模式?

​ 1.工廠模式: BeanFactory,用來建立簡單物件的例項

​ 2.單例模式: Bean預設為單例模式

​ 3.代理模式: Spring的AOP功能

Spring常用註解:

  • 宣告bean的註解
    • @Component
    • @Service
    • @Respository
    • @Controller
  • 注入bean的註解
    • @Autowired(Spring提供)
    • @Resource(Java自帶)
  • Java配置類相關注解
    • @Configuration:宣告當前類是配置類,相當於xml形式的Spring配置
    • @Bean:註解在方法上,宣告當前方法的返回值是一個bean
    • @Configuration:宣告當前類是配置類,內部組合了@Component註解
    • @ComponentScan:用於對Component進行掃描
  • 事務註解
    • @Transaction
  • mvc常用註解
    • @Controller
    • @RequestMapping:用於對映web請求,包括訪問路徑和引數
    • @ResponseBody:支援將返回值放在response內,而不是一個頁面,通常使用者返回json資料
    • @RequestBody
    • @PathVariable用於接收路徑引數,比如@RequestMapping(“/hello/{name}”)申明的路徑,將註解放在引數中前,即可獲取該值,通常作為Restful的介面實現方法。
    • @RequestController

Spring框架的好處

​ 1.輕量:Spring 是輕量的,基本的版本大約2MB。

​ 2.控制反轉:Spring通過控制反轉實現了鬆散耦合,物件們給出它們的依賴,而不是建立或查詢依賴的物件們。

​ 3.面向切面的程式設計(AOP):Spring支援面向切面的程式設計,並且把應用業務邏輯和系統服務分開。

​ 4.容器:Spring 包含並管理應用中物件的生命週期和配置。

​ 5.MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。

​ 6.事務管理:Spring 提供一個持續的事務管理介面,可以擴充套件到上至本地事務下至全域性事務(JTA)。

​ 7.異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO丟擲的)轉化為一致的unchecked 異常。

什麼是Spring IOC容器?

​ Spring IOC 負責建立物件,管理物件(通過依賴注入(DI),裝配物件,配置物件,並且管理這些物件的整個生命週期。

ApplicationContext通常的實現是什麼?

  • FileSystemXmlApplicationContext :此容器從一個XML檔案中載入beans的定義,XML Bean 配置檔案的全路徑名必須提供給它的建構函式。
  • ClassPathXmlApplicationContext:此容器也從一個XML檔案中載入beans的定義,這裡,你需要正確設定classpath因為這個容器將在classpath裡找bean配置。
  • WebXmlApplicationContext:此容器載入一個XML檔案,此檔案定義了一個WEB應用的所有bean。

DI(依賴注入方式)

​ 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列引數,每個引數代表一個對其他類的依賴。

​ Setter方法注入:Setter方法注入是容器通過呼叫無參構造器或無參static工廠 方法例項化bean之後,呼叫該bean的setter方法,即實現了基於setter的依賴注入。

​ 介面注入:對於介面注入來說,如果被注入物件想要 IoC 容器為其注入依賴物件,就必須實現某個介面,這個介面提供了一個方法,用來為其注入依賴物件。但是從注入方式的使用來說,介面注入是現在不提倡的一種方式,基本處於"退役"狀態,因為它強制被注入實現物件不必要的依賴。

什麼是Spring beans?

​ Spring beans 是那些形成Spring應用的主幹的java物件。它們被Spring IOC容器初始化,裝配,和管理。這些beans通過容器中配置的後設資料建立。比如,以XML檔案中 的形式定義。

​ 一個Spring Bean 的定義包含容器必知的所有配置後設資料,包括如何建立一個bean,它的生命週期詳情及它的依賴。

怎麼給Spring容器提供配置後設資料?

​ XML配置檔案。

​ 基於註解的配置。

​ 基於java的配置。

Spring框架中bean的生命週期?

  • Spring容器 從XML 檔案中讀取bean的定義,並例項化bean。
  • Spring根據bean的定義填充所有的屬性。
  • 如果bean實現了BeanNameAware 介面,Spring 傳遞bean 的ID 到 setBeanName方法。
  • 如果Bean 實現了 BeanFactoryAware 介面, Spring傳遞beanfactory 給setBeanFactory 方法。
  • 如果有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內呼叫它們。
  • 如果bean實現IntializingBean了,呼叫它的afterPropertySet方法,如果bean宣告瞭初始化方法,呼叫此初始化方法。
  • 如果有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被呼叫。
  • 如果bean實現了 DisposableBean,它將呼叫destroy()方法。

解釋不同方式的自動裝配?

  • no:預設的方式是不進行自動裝配,通過顯式設定ref 屬性來進行裝配。
  • byName:通過引數名 自動裝配,Spring容器在配置檔案中發現bean的autowire屬性被設定成byname,之後容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
  • byType::通過引數型別自動裝配,Spring容器在配置檔案中發現bean的autowire屬性被設定成byType,之後容器試圖匹配、裝配和該bean的屬性具有相同型別的bean。如果有多個bean符合條件,則丟擲錯誤。
  • constructor:這個方式類似於byType, 但是要提供給構造器引數,如果沒有確定的帶引數的構造器引數型別,將會丟擲異常。
  • autodetect:首先嚐試使用constructor來自動裝配,如果無法工作,則使用byType方式。

自動裝配的侷限性

  • 重寫: 你仍需用 和 配置來定義依賴,意味著總要重寫自動裝配。
  • 基本資料型別:你不能自動裝配簡單的屬性,如基本資料型別,String字串,和類。
  • 模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。

Spring MVC概述?

​ Spring提供的web框架。

​ 主要由DispatcherServlet,處理對映器,處理器(控制器),檢視解析器,檢視組成。

核心

​ 處理器對映:選擇使用哪個處理器來處理請求

​ 檢視解析器:選擇結果應該如何渲染

執行原理

​ 1.Http請求:客戶提交請求到DispatcherServlet

​ 2.尋找處理器:DispatcherServlet控制器查詢一個或多個handlerMapping,找到處理的Controller

​ 3.呼叫處理器:DispatcherServlet請求提交到Controller

​ 4.呼叫業務處理和返回結果:Controller呼叫業務處理邏輯後,返回ModelAndView

​ 5.處理檢視對映並返回模型:DispatcherServlet查詢一個或多個ViewResoler檢視解析器,找到ModelAndView指定的檢視。

​ 6.Http響應:檢視負責將結果顯示到客戶端。

SpringBoot

SpringBoot是什麼?

精簡了配置的Spring,使用約定優於配置的原則

SpringBoot啟動

  • java-jar方式啟動
  • spring-boot-plugin方式啟動,命令列進入專案所在目錄,輸入命令mvn spring-boot:run啟動

SpringBoot優缺點,特性,常用註解

優點

  • 簡化了依賴的管理,父依賴可以對幾乎所有引入的依賴進行版本的統一管理
  • 簡化部署,省去了打包部署的過程
  • 簡化監控,

特性

  • 自動配置
    • 整合MyBatis時,無需自己配置MapperScannerConfigurer即可實現對映器的注入

常用註解

  • @SpringBootApplication:包含Configuration,@EnableAutoConfiguration,@ComponentScan,用於主類上
  • @RestController:包含@Controller,@ResponseBody
  • @Configuration:Bean配置的資訊源
  • @Bean:放在方法上面,產生一個bean交給Spring管理
  • @ConfigurationProperties:讀取配置檔案中的配置資訊。

SpringBoot依賴

  • 父依賴:spring-boot-starter-parent
  • web依賴:spring-boot-starter-web
  • 測試環境相關依賴:spring-boot-starter-test

SpringBoot整合RabbitMQ

  • 引入依賴spring-cloud-stream-binder-rabbit
  • 配置與RabbitMQ的伺服器的連線
  • 注入RabbitTemplate的類的例項
  • 使用RabbitTemplate完成RabbitMQ客戶端與伺服器的互動

九.行業分類

傳統軟體行業(傳統專案)

  • OA辦公自動化系統
  • ERP企業資源管理系統
  • CRM客戶關係管理系統
  • CMS內容管理系統
    • App資訊管理系統
    • 宿舍管理系統…

網際網路軟體(網際網路專案)

  • 電商平臺(天貓,京東…)
  • 社交平臺(QQ,微信…)
  • 網路遊戲(LOL…)
  • 短視訊平臺
  • 金融類平臺
  • 保險
  • 醫療

十.架構

單體式架構:

​ 部署單一

​ 技術單一

​ 系統錯誤隔離性差

​ 系統可擴充套件性差

微服務架構

​ 專案複雜度降低

​ 團隊界限明確

​ 擴充套件靈活,併發承受能力強

​ 運維成本較高,複雜性提高。

單體式架構專案提升效能較為困難,需要對整體模組進行提升,較為困難

微服務架構拆分成了獨立的模組,擴充套件較為簡單。

設計原則:

​ 圍繞業務切分(粗粒度拆分)

​ 單一職責

​ 誰建立,誰負責

微服務常見術語

​ Provider和Consumer

​ Provider:服務提供者,提供資料服務,(部分Service和DAO的集合)

​ Consumer:服務消費者,消費資料服務(Controller和部分Service集合)

​ RPC和Restful

​ RPC:遠端過程呼叫(遠端過程呼叫的形式/(自己的協議)來實現資料傳輸)

​ Resuful:一種HTTP協議風格(GET:查詢;POST:新增;PUT:修改;DELETE:刪除)

​ 註冊中心(為了解決不同服務,分散式專案之間的地址獲取問題)

分散式系統:

​ 分開部署

​ 問題:

​ 分散式session

​ 分散式鎖

​ 分散式事務

微服務系統:

​ 對專案業務單元的拆分(細粒度的拆分)

十一.Dubbo

什麼是Dubbo?

​ 高效能,輕量級的Java RPC框架,提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,服務自動註冊和發現。

​ Dubbo不是完整的微服務解決方案,只能說是基於Dubbo可以有一套微服務解決方案。

Dubbo中的角色節點

Provider:暴露服務的服務提供方

Consumer:呼叫遠端服務的服務消費方

Registry:服務註冊與發現的註冊中心(推薦使用zookeeper)

Monitor:統計服務的呼叫次數和呼叫時間的監控中心

Container:服務執行伺服器

Dubbo配置方式:

​ 1.Spring配置方式

​ 2.Java API配置方式

service:服務配置

reference:引用配置

protocol:協議配置

application:應用配置

module:模組配置

registry:註冊中心配置

monitor:監控中心配置

provider:提供方配置

consumer:消費方配置

method:方法配置

argument:引數配置

Dubbo優點?

​ 1.面向介面代理的高效能RPC呼叫

​ 2.智慧負載均衡

​ 3.服務自動註冊與發現

​ 4.高度可擴充套件能力

​ 5.執行期流量排程

​ 6.視覺化的服務治理與運維

十二.Spring Cloud

什麼是Spring Cloud?

​ Spring Cloud是一套完整的微服務解決方案。

​ Spring公司基於Netflix(網飛)開源的一套微服務元件來進行Spring Cloud開發。

​ Spring Boot是為了更好的服務微服務專案。

十三.MyBatis

MyBatis配置檔案及其作用?

  1. properties:引入資料庫屬性檔案
  2. setting:MyBatis配置檔案
  3. typeAliases:別名配置
  4. environments:配置執行環境
  5. transactionManager:事務管理器
  6. DataSource:配置資料來源:連線池
  7. mappers:引入mapper對映檔案

十四.Java web

Servlet

Servlet:(Server Applet)執行在伺服器上的一個小程式,用來處理伺服器請求

jsp和Servlet有什麼區別?

jsp善於表現於頁面展示,Servlet善於邏輯控制

jsp是Servlet的簡化,Servlet是一個完整的Java類。

jsp的4種作用域?

  • page
  • request
  • session
  • application

常見異常型別

  • NullPointException
  • SQLException
  • IndexOutOfBoundsException
  • NumberFormatException
  • FileNotFoundException
  • IOException
  • ClassCastException
  • ArithmeticException

十五.MySQL

什麼是索引

  • 索引是一種資料結構,幫助我們快速檢索資料庫中的資料。

索引資料結構?

Hash索引和B+Tree索引

Hash索引適合等值查詢,無法進行範圍查詢。

Hash索引無法利用索引完成排序。

Hash索引不支援多列聯合索引的最左側匹配規則

資料庫儲存過程

大資料的四V和三高

  • 大資料的典型特徵
    • 高可擴
    • 高效能
    • 高併發
  • 四V
    • Volume:資料體量大
    • Variety:資料型別繁多
    • Value:價值密度低
    • Velocity:處理速度快

十六.MQ

什麼是訊息中介軟體?

​ 訊息佇列是非同步rpc的主要手段之一。

什麼是訊息佇列

​ 訊息佇列是一種可以儲存,傳遞訊息的容器,常用語分散式系統中減輕伺服器壓力,有順序

MQ的好處

​ 通過非同步處理提高系統效能和削峰,降低耦合性

流行的MQ

  • RabbitMQ
  • RocketMQ
  • Kafka
  • ActiveMQ

ActiveMQ的通訊方式

  • publish(釋出)-subscribe(訂閱)釋出-訂閱方式
  • point-to-point(點對點方式)

RPC是什麼?

  • rpc:遠端過程呼叫

RPC核心

  • 遠端提供者需要以某種形式服務呼叫相關的資訊,包括但不限於服務介面定義,資料結構,或者中介軟體的服務定義檔案。
  • 遠端代理物件:服務呼叫者用的服務實際上是遠端服務的本地代理。
  • 通訊:rpc框架與具體的協議無關
  • 序列化:遠端通訊,需要將物件轉換為二進位制流進行傳輸。

分散式

什麼是分散式事務?常見的解決方案

  • 分散式事務:將一個操作中涉及到的所有資料庫例項的資料庫操作捆綁為一個整體進行管理,執行成功,操作中的所有就資料庫例項的資料庫操作均被提交,遇到錯誤且必須取消或回滾,所有涉及到的資料庫操作都需恢復到操作前的狀態,所有資料均清除。

專案中Redis實現分散式鎖

  • 驗證前端的重複請求,通過redis過濾。每次請求先在redis中檢索有沒有這個key,來驗證是否一定時間內重複提交。
  • 秒殺系統,Redis是單執行緒,防止出現資料庫爆破。
  • 全域性增量ID生成

相關文章