Java經典面試題第四彈來啦!本節小編整理了關于Java開發架構常見的幾道面試題,希望大家多多練習,一起進步~
1.SpringMVC傳回值,使用SpringMVC的時候我看到兩種風格的開發,一種是控制層的方法傳回值類型主要是ModelAndView(就如我們的BSM項目),另外一種風格是傳回值Spring類型,在開發中要怎麼取舍?
從簡單來講就是ModelAndView,如果隻是做一個過渡,符合MVC标準設計,可能有人就會認為傳回ModelAndView需要執行個體化新對象太麻煩了,就直接傳回String。
MVC的設計角度在于你需要通過控制層傳輸相應的對象資訊給顯示層來進行顯示,而且業務層也會傳回Map資料,這個時候就希望可以把Map的資料直接傳遞到JSP裡面,這樣的話使用ModelAndView就很簡單。最關鍵的是ModelAndView整體的處理來講是很容易的,隻是一個跳轉的頁面路徑,以及相關的屬性設定,可以幫助一些基礎不牢固的人員不使用錯誤的屬性範圍,例如:request。(如果要想更好的了解細節,那麼就必須在項目之中感受。)
2.Hibernate是不是隻能與Struts2組合才好?我怎麼沒看到SpringMVC+Hibernate的組合?
Hibernate實作的是一個資料層的開發架構,資料層是不會與MVC層産生任何直接聯系,必須通過控制層與業務層來進行操作的處理後才可以使用。
最初的時候(2005)開始流行這個架構開發,使用最多的就是Struts1.X、Hibernate、Spring,而後就形成SSH的開發架構。現在的環境出現了改變,因為MyBatis出現之後會有人覺得Hibernate操作過于頻繁,而MyBatis的開發更加簡單。正因為如此,對于整體新項目設計而言就不會再過多的去考慮Hibernate了,基本上都是使用MyBatis開發架構。同時,在這個時期之後SpringMVC開始流行了,因為Struts畢竟需要與Spring整合,有人認為麻煩,現在對于開發就可能有如下幾種結構:
Struts 2.X+Hibernate+Spring;
Struts 2.X+MyBatis+Spring;
SpringMVC+Hibernate;
SpringMVC+MyBatis。
3.SSH整合
SSH整合實際上需要考慮到一個核心的問題:Struts之是以要整合到Spring之中主要是希望可以利用裡面的IOC&DI機制實作業務層接口對象的注入處理,如果不使用Spring去管理Struts,那麼無法直接利用容器注入的模式來實作業務層接口對象的配置,這樣整個的整合效果就會出現嚴重的問題。
從另外一個角度來講,雖然Struts支援Spring管理,但畢竟Spring屬于兩個開發架構,是以從2016年開始許多網際網路公司的開發都不再選擇使用Struts 2.x,但這并不表示Struts 2.x沒有人使用,許多傳統公司還在使用着。
4.ShiroRealm機制
Realm是幾乎所有的認證授權架構都具備的一個概念,Realm本身有兩層含義:
(1)進行使用者的認證處理:主要是進行使用者名或密碼的判斷,同時還可以判斷出該使用者是否被鎖定;
(2)使用者的授權處理:進行角色或權限認證,而且這裡的認證所需要的就是根據使用者名查詢角色或權限标記。對于授權處理需要一些特殊處理方式:授權的操作在實際檢測之中有兩類:
——實時授權檢測:修改了一個使用者的角色或權限之後該配置立即生效,而且立即影響到已登陸的使用者,這樣的操作需要頻繁進行資料庫的查詢處理,是以一般不建議使用;
——非實時授權檢測:因為使用者的角色和權限幾乎很少會被改動,是以這樣頻繁的進行資料庫的查詢,性能會比較差。在實際開發之中,會考慮在使用者第一次使用角色和權限的時候将資料資訊查詢出來。如果是單節點,會将授權資訊儲存在記憶體裡(EhCache),如果是分布式叢集,會将這些資訊儲存在Redis裡面,總之就一個原則,不要在使用者授權檢測的時候重複查詢資料庫即可。
總結:ShiroRealm有一套自己的Session,在WEB中該Session會在HttpSession裡面儲存資料,但使用者看不見這些。所有的授權處理一定要使用緩存,否則會影響程式性能。
5.Shiro中的Session與HttpSession的關系是什麼?
如果說你現在使用的不是WEB程式,而是一個Java程式,那麼Shiro中的認證與授權依然有效。可以得出一個結論:Shiro有一套自己維護的“Session”機制(不等同于HttpSession),如果要在WEB中應用,實際上就表示該Shiro Session要結合HttpSession一起使用,也就是說在Shiro Session中儲存的内容在WEB容器裡面實質上是儲存在了HttpSession裡面。
了解為:HttpSession中存在一個指定的Shiro屬性,Shiro在設計的時候考慮到了使用者的使用習慣,是以對于一些使用者的身份資訊,會将這些身份資訊儲存在Session裡面,使用者也可以直接利用Session屬性取得相關的身份資訊。
6.Shiro與Redis整合操作
前提是你的系統之中有多個WEB容器,并且使用了負載均衡,例如:Nginx。

如果要想實作Session資料的共享,那麼需要繼承一個預設的企業SsessionDAO管理器:
裡面就是針對Redis資料的CRUD操作。
如果要想實作緩存資料的共享(角色或者權限),那麼就去繼承一個預設的緩存管理器:
CacheManager、同時還需要去實作一個Cache的接口的子類才可以實作這樣的共享操作。
在整個流程之中你還需要考慮Tomcat的Session緩存。
如果想要實作緩存:需要知道Nginx、Shiro的具體操作類的方法、Jedis工具類、Redis使用,這樣才能去做叢集的Session的緩存處理過程。
更多專業知識,面試技巧就在面試一點通,持續更新中……
感謝浏覽~
本内容來源于
阿裡雲大學-Java面試技巧