2018java程序员面试题整理
1.@PathVariable注解和@RequestParam注解的區別。
@RequestParam注解是獲取靜態URL傳入的參數
@PathVariable是獲取請求路徑中的變量作為參數
/需要和@RequestMapping("item/{itemId}") 配合使用
2.@Param注解和@RequestParam注解的區別。
@Parm ?指定request中必須包含某些參數值是,才讓該方法處理。
?注意@RequestMapping(value = "test", params = { "username","age!=10" })
@param一般標注在xxxmapper.Java文件中的 參數位置,代表給傳入的參數別名,一般用在傳入多個參數的時候,在xml文件中使用sql語句通過占#{} ?${}占位符來獲取
#{}防止sql注入?
@RequestParam ?value 請求的參數 ?defaultvalue
1.request.getParameter(“參數名”)?
2.用@RequestParam注解獲取
3.Servlet標準中的過濾器:Filter和SpringMVC中的攔截器:Interceptor有什么異同?
Filter:
在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。
根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數據。
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。
根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。
兩者的本質區別:
1、攔截器是基于java的反射機制的,而過濾器是基于函數回調?
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器依賴spring容器?
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用?
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能?
5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次?
?
執行順序 :過濾前 - 攔截前 - Action處理 - 攔截后 - 過濾后。
?
攔截器有前置/后置/完成三個方法,在沒有執行到處理器(controller)時不會只執行任何攔截器 比如我controller沒有/user路徑
多個執行順序 前1前2前3后3后2后1 完3 完2 完1
2 return false 前 1 前 2 完1 ?
(攔截了沒有到達處理器,都不會觸發后置)
前置方法為true時必定有完成方法
4.?在Mybatis環境中如何在SQL語句中引用接口方法傳入的參數?
一.?用Map,在方法體里,我們把多個參數存放在map里,然后在前面獲得它
二.?用ibatis中的@Param
5.?在Mybatis環境中如何在SQL語句中引用接口方法傳入的參數?
一.?用Map,在方法體里,我們把多個參數存放在map里,然后在前面獲得它
二.?用ibatis中的@Param
6.請介紹一下Maven依賴關系中的傳遞性現象。有什么限制。
??依賴是可以往下傳遞的;A依賴B;B工程依賴的其他模塊,A都可以使用;
??調整依賴的傳遞規則:
??1)、調整jar的依賴范圍:
???????默認:compile,依賴是傳遞的;非compile范圍的依賴不能傳遞;
??2)、設置這個jar是可選的;
???????<!-- 這個依賴是可選的;默認不傳遞下來 -->
???????<optional>true</optional>
3)、排除依賴:
?<exclusions>
?????<!-- 排除依賴 -->
?????<exclusion>
????????<artifactId>log4j</artifactId>
?????????<groupId>log4j</groupId>
?????</exclusion>
??</exclusions>
7.請介紹一下Maven依賴范圍中compile、test、provided這三種情況。
<!--compile:指:在編譯運行測試期間都可以使用這個jar,打包的時候會帶上這個jar ?-->
<!--test:主程序編譯的時候不通過,測試可以使用,打包不帶這個jar ?-->
<!--provided:(已提供) :基本和compile是一樣的,只是打包的時候不帶 -->
8.請介紹一下 Quartz 石英調度技術的使用方法,你在項目中是如何使用的?Job:任務(我們需要完成的事情);【要炸大本營】
JobDetail:任務詳情(任務怎么做,誰來做);
????????【執行任務需要的對象,數據信息等】【張三,50噸TNT】
????quartz:為了并發執行;
????Job(定義任務怎么執行的類)---JobDetail(當次執行的實例);
?
Trigger:觸發器;用來執行任務的;【炸藥的引信】
Scheduler:調度器;調度任務;【幫我們在指定時間觸發trigger】【中控臺】
????????????????scheduler.scheduleJob(job, trigger);
????????<dependency>
????????????<groupId>org.quartz-scheduler</groupId>
????????????<artifactId>quartz</artifactId>
????????</dependency>
有配置版和注解版 建議使用注解版
9請介紹一下事務的并發問題和隔離級別。
????在關系型數據庫中,事務的隔離性分為四個隔離級別,在解讀這四個級別前先介紹幾個關于讀數據的概念。
1)臟讀(Dirty Reads):所謂臟讀就是對臟數據(Drity Data)的讀取,而臟數據所指的就是未提交的數據。也就是說,一個事務正在對一條記錄做修改,在這個事務完成并提交之前,這條數據是處于待定狀態的(可能提交也可能回滾),這時,第二個事務來讀取這條沒有提交的數據,并據此做進一步的處理,就會產生未提交的數據依賴關系。這種現象被稱為臟讀。
2)不可重復讀(Non-Repeatable Reads):一個事務先后讀取同一條記錄,但兩次讀取的數據不同,我們稱之為不可重復讀。也就是說,這個事務在兩次讀取之間該數據被其它事務所修改。
3)幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為幻讀。
事務四個隔離級別對比:?隔離級別低,查詢效率高
1)讀未提交(Read Uncommitted):SELECT語句以非鎖定方式被執行,所以有可能讀到臟數據,隔離級別最低。?
2)讀已提交(Read Committed):只能讀取到已經提交的數據。即解決了臟讀,但未解決不可重復讀。
3)可重復讀(Repeated Read):在同一個事務內的查詢都是事務開始時刻一致的,InnoDB的默認級別。在SQL標準中,該隔離級別消除了不可重復讀,但是還存在幻讀。
4)串行話(Serializable):完全的串行化讀,所有SELECT語句都被隱式的轉換成SELECT ... LOCK IN SHARE MODE,即讀取使用表級共享鎖,讀寫相互都會阻塞。隔離級別最高。?
Mysql ?四種都支持 默認可重復讀
Oracle 支持串行化和讀已提交
10.請說說你對事務傳播行為的理解。
1: PROPAGATION_REQUIRED ???默認的
假如當前正要執行的事務不在另外一個事務里,那么就起一個新的事務
比如說,ServiceB.methodB的事務級別定義為PROPAGATION_REQUIRED, 那么由于執行ServiceA.methodA的時候,ServiceA.methodA已經起了事務,這時調用ServiceB.methodB,ServiceB.methodB看到自己已經運行在ServiceA.methodA的事務內部,就不再起新的事務。 而假如ServiceA.methodA運行的時候發現自己沒有在事務中,他就會為自己分配一個事務。這樣,在ServiceA.methodA或者在ServiceB.methodB內的任何地方出現異常,事務都會被回滾。即使ServiceB.methodB的事務已經被提交,但是ServiceA.methodA在接下來fail要回滾,ServiceB.methodB也要回滾
?2: ??PROPAGATION_SUPPORTS
如果當前在事務中,即以事務的形式運行,如果當前不再一個事務中,那么就以非事務的形式運行這就跟平常用的普通非事務的代碼只有一點點區別了。不理這個,因為我也沒有覺得有什么區別
3: ??PROPAGATION_REQUIRES_NEW
這個就比較繞口了。比如我們設計ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_REQUIRES_NEW,那么當執行到ServiceB.methodB的時候,ServiceA.methodA所在的事務就會掛起,ServiceB.methodB會起一個新的事務,等待ServiceB.methodB的事務完成以后,他才繼續執行。
他與PROPAGATION_REQUIRED 的事務區別在于事務的回滾程度了。因為ServiceB.methodB是新起一個事務,那么就是存在兩個不同的事務。如果ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB是不會回滾的。如果ServiceB.methodB失敗回滾,如果他拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務仍然可能提交。
其余的事務一百年可能遇見一次
總結
以上是生活随笔為你收集整理的2018java程序员面试题整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LAMP架构简述
- 下一篇: ibm刀片服务器虚拟化,刀片服务器内置虚