1. 程式人生 > 其它 >不是吧阿sir(2),這篇文章可以滿足你80%日常工作

不是吧阿sir(2),這篇文章可以滿足你80%日常工作

不是吧阿sir(2),這篇文章可以滿足你80%日常工作

死亡:容器銷燬,物件消亡

總結:單例物件的生命週期和容器相同

多例物件: prototype

出生: 使用物件時spring框架為我們建立

活著:物件只要是在使用過程中就一直活著

死亡:當物件長時間不用且沒有其它物件引用時,由java的垃圾回收機制回收

白嫖資料

4、Bean作用域?預設什麼級別?是否執行緒安全?Spring如何保障執行緒安全的?

| 名稱 | |

| --- | --- |

| singleton | 單例物件,預設值的作用域 |

| prototype | 每次獲取都會建立?個新的 bean 例項 |

| request | 每?次HTTP請求都會產??個新的bean,該bean僅在當前HTTP request內有效。 |

| session | 在一次 HTTP session 中,容器將返回同一個例項 |

global-session 將物件存入到web專案叢集的session域中,若不存在叢集,則global session相當於session

預設作用域是singleton,多個執行緒訪問同一個bean時會存線上程不安全問題

保障執行緒安全方法:

在Bean物件中儘量避免定義可變的成員變數(不太現實)。

在類中定義?個ThreadLocal成員變數,將需要的可變成員變數儲存在 ThreadLocal 中

ThreadLocal:

? 每個執行緒中都有一個自己的ThreadLocalMap類物件,可以將執行緒自己的物件保持到其中,各管各的,執行緒可以正確的訪問到自己的物件。

? 將一個共用的ThreadLocal靜態例項作為key,將不同物件的引用儲存到不同執行緒的ThreadLocalMap中,然後線上程執行的各處通過這個靜態ThreadLocal例項的get()方法取得自己執行緒儲存的那個物件,避免了將這個物件作為引數傳遞的麻煩。

5、Spring事務隔離級別和事務傳播屬性

隔離級別:

  1. DEFAULT (預設) 這是一個PlatfromTransactionManager預設的隔離級別,使用資料庫預設的事務隔離級別。另外四個與JDBC的隔離級別相對應。

  2. READ_UNCOMMITTED (讀未提交) 這是事務最低的隔離級別,它允許另外一個事務可以看到這個事務未提交的資料。這種隔離級別會產生髒讀,不可重複讀和幻像讀。

  3. READ_COMMITTED (讀已提交) 保證一個事務修改的資料提交後才能被另外一個事務讀取,另外一個事務不能讀取該事務未提交的資料。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。

  4. REPEATABLE_READ (可重複讀) 這種事務隔離級別可以防止髒讀、不可重複讀,但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的資料外,還保證了不可重複讀。

  5. SERIALIZABLE(序列化) 這是花費最高代價但是最可靠的事務隔離級別,事務被處理為順序執行。除了防止髒讀、不可重複讀外,還避免了幻像讀。

Spring事務傳播屬性(Propagation):

  1. REQUIRED(預設屬性) 如果存在一個事務,則支援當前事務。如果沒有事務則開啟一個新的事務。 被設定成這個級別時,會為每一個被呼叫的方法建立一個邏輯事務域。如果前面的方法已經建立了事務,那麼後面的方法支援當前的事務,如果當前沒有事務會重新建立事務。

  2. MANDATORY 支援當前事務,如果當前沒有事務,就丟擲異常。

  3. NEVER 以非事務方式執行,如果當前存在事務,則丟擲異常。

  4. NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

  5. REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。

  6. SUPPORTS 支援當前事務,如果當前沒有事務,就以非事務方式執行。

  7. NESTED 支援當前事務,新增Savepoint點,與當前事務同步提交或回滾。 巢狀事務一個非常重要的概念就是內層事務依賴於外層事務。外層事務失敗時,會回滾內層事務所做的動作。而內層事務操作失敗並不會引起外層事務的回滾。

6、Spring以及Spring MVC常見註解

Spring部分:

? 宣告bean的註解

? @Component 通?的註解,可標註任意類為 Spring 元件

白嫖資料

? @Service 在業務邏輯層使用(service層)

? @Repository 在資料訪問層使用(dao層)

? @Controller 在展現層使用,控制器的宣告(controller層)

? 注入bean的註解

? @Autowired:可以對類成員變數、方法、構造方法進行標註

? 預設按照型別注入,若要按照名稱注入,需要搭配**@Qualifier**註解一起使用

? @Resource:預設按照名稱來裝配注入

Spring MVC部分:

? @Controller 宣告該類為SpringMVC中的Controller

? @RequestMapping 用於對映Web請求

? @ResponseBody 支援將返回值放在response內,而不是一個頁面,通常使用者返回json資料

? @RequestBody 允許request的引數在request體中,而不是在直接連線在地址後面。

? @PathVariable 用於接收路徑引數,比如@RequestMapping("/hello/{name}")申明的路徑,將註解放在引數中前,即可獲取該值,通常作為Restful的介面實現方法。

7、@autowired和@resource的區別?

@Autowired:可以對類成員變數、方法、構造方法進行標註

? 預設按照型別注入,若要按照名稱注入,需要搭配**@Qualifier**註解一起使用

@Resource:預設按照名稱來裝配注入

8、mybatis如何防止sql注入?$和#的區別是什麼?傳入表名用哪個?

防止sql注入:

? 在編寫mybatis的對映語句時,儘量採用“#{xxx}”這樣的格式

和$區別:

| # | $ |

| --- | --- |

| 相當於對資料加上雙引號 | 相當於直接顯示資料 |

| 很大程度上防止SQL注入 | 無法防止SQL注入 |

| #{xxx},使用的是PreparedStatement,會有型別轉換,比較安全 | ${xxx},使用字串拼接,容易SQL注入 |

? 簡單的說就是#{}是經過預編譯的,是安全的,${}是未經過預編譯的,僅僅是取變數的值,是非安全的,存在SQL注入。

要實現動態傳入表名、列名,需要做如下修改:

新增屬性statementType=“STATEMENT”,同時sql裡的屬有變數取值都改成${xxxx}

9、Spring MVC工作原理

客戶端(瀏覽器)傳送請求,直接請求到 DispatcherServlet 。

DispatcherServlet 根據請求資訊調? HandlerMapping ,解析請求對應的 Handler 。

解析到對應的 Handler (也就是 Controller 控制器)後,開始由HandlerAdapter 介面卡處理。

HandlerAdapter 會根據 Handler 來調?真正的處理器開處理請求,並處理相應的業務邏輯。

處理器處理完業務後,會返回?個 ModelAndView 物件, Model 是返回的資料物件

ViewResolver 會根據邏輯 View 查詢實際的 View 。

DispaterServlet 把返回的 Model 傳給 View (檢視渲染)。

把 View 返回給請求者(瀏覽器)

10、SpringBoot自動配置的原理是什麼?介紹SpringBootApplication註解.

啟動類:


@SpringBootApplication

public class JpaApplication {

    public static void main(String[] args) {

        SpringApplication.run(JpaApplication.class, args);

    }

} 

白嫖資料

它主要載入了@SpringBootApplication註解主配置類,這個@SpringBootApplication註解主配置類裡邊最主要的功能就是SpringBoot開啟了一個@EnableAutoConfiguration註解的自動配置功能。

執行緒、資料庫、演算法、JVM、分散式、微服務、框架、Spring相關知識

一線網際網路P7面試集錦+各種大廠面試集錦

資料領取方式:戳這裡

學習筆記以及面試真題解析