不是吧阿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事務隔離級別和事務傳播屬性
隔離級別:
-
DEFAULT (預設) 這是一個PlatfromTransactionManager預設的隔離級別,使用資料庫預設的事務隔離級別。另外四個與JDBC的隔離級別相對應。
-
READ_UNCOMMITTED (讀未提交) 這是事務最低的隔離級別,它允許另外一個事務可以看到這個事務未提交的資料。這種隔離級別會產生髒讀,不可重複讀和幻像讀。
-
READ_COMMITTED (讀已提交) 保證一個事務修改的資料提交後才能被另外一個事務讀取,另外一個事務不能讀取該事務未提交的資料。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。
-
REPEATABLE_READ (可重複讀) 這種事務隔離級別可以防止髒讀、不可重複讀,但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的資料外,還保證了不可重複讀。
-
SERIALIZABLE(序列化) 這是花費最高代價但是最可靠的事務隔離級別,事務被處理為順序執行。除了防止髒讀、不可重複讀外,還避免了幻像讀。
Spring事務傳播屬性(Propagation):
-
REQUIRED(預設屬性) 如果存在一個事務,則支援當前事務。如果沒有事務則開啟一個新的事務。 被設定成這個級別時,會為每一個被呼叫的方法建立一個邏輯事務域。如果前面的方法已經建立了事務,那麼後面的方法支援當前的事務,如果當前沒有事務會重新建立事務。
-
MANDATORY 支援當前事務,如果當前沒有事務,就丟擲異常。
-
NEVER 以非事務方式執行,如果當前存在事務,則丟擲異常。
-
NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
-
REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。
-
SUPPORTS 支援當前事務,如果當前沒有事務,就以非事務方式執行。
-
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註解的自動配置功能。