一次筆試

一 .註解有什麼作用?請自定義一個註解
1.java註解是指附加在代碼中的一些元信息,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。
@Retention(RetentionPolicy.RUNTIME)
定義的這個註解是註解會在class字節碼文件中存在,在運行時可以通過反射獲取到。
@Target({ElementType.TYPE,ElementType.METHOD}) 

二.java是否存在內存泄露問題?若存在,請舉例說明什麼情況下會發送內存泄露?

  會。自己實現堆載的數據結構時有可能會出現內存泄露


三.簡述基於struts框架web應用的工作流程,並簡述在struts中mvc的表現方式?
  a在web應用啓動時,加載並初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各個配置對象中。
 b當ActionServlet接收到一個客戶請求時,首先檢索和用戶請求相匹配的ActionMapping實例,如果不存在,就返回用戶請求路徑無效信息。
 c.如ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中。
 d.根據配置信息決定是否需要表單驗證。如果需要驗證,就調用ActionForm的Validate()方法。如果ActionForm的Validate()方法返回null或返回一個不包含ActionMessage的ActionErrors對象,就表示表單驗證成功。
e.ActionServlet根據ActionMapping實例包含的映射信息決定將請求轉發給哪個Action。如果相應的Action實例不存在,就先創建這個實例,然後調用Action的execute()方法。
f.Action的execute()方法返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指向的JSP組件。
g.ActionForward對象指向的jsp組件生成動態網頁,返回給客戶。

四.說明控制反轉(IOC)和麪向切面編程(AOP)在spring中的應用
  spring 的優點?
1.降低了組件之間的耦合性 ,實現了軟件各層之間的解耦
2.可以使用容易提供的衆多服務,如事務管理,消息服務等
3.容器提供單例模式支持
4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監控等功能
5.容器提供了衆多的輔助類,能加快應用的開發
6.spring對於主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬於低侵入式設計,代碼的污染極低
8.獨立於各種應用服務器
9.spring的DI機制降低了業務對象替換的複雜性
10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可以自由選擇spring的部分或全部
什麼是DI機制?
依賴注入(Dependecy Injection)和控制反轉(Inversion of Control)是同一個概念,具體的講:當某個角色
需要另外一個角色協助的時候,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例。但在spring中
創建被調用者的工作不再由調用者來完成,因此稱爲控制反轉。創建被調用者的工作由spring來完成,然後注入調用者
因此也稱爲依賴注入。
spring以動態靈活的方式來管理對象 , 注入的兩種方式,設置注入和構造注入。
設置注入的優點:直觀,自然
構造注入的優點:可以在構造器中決定依賴關係的順序。
什麼是AOP?
面向切面編程(AOP)完善spring的依賴注入(DI),面向切面編程在spring中主要表現爲兩個方面
1.面向切面編程提供聲明式事務管理
2.spring支持用戶自定義的切面
面向切面編程(aop)是對面向對象編程(oop)的補充,
面向對象編程將程序分解成各個層次的對象,面向切面編程將程序運行過程分解成各個切面。
AOP從程序運行角度考慮程序的結構,提取業務處理過程的切面,oop是靜態的抽象,aop是動態的抽象,
是對應用執行過程中的步驟進行抽象,,從而獲得步驟之間的邏輯劃分。


aop框架具有的兩個特徵:
1.各個步驟之間的良好隔離性
2.源代碼無關性
DI 和 IOC 的區別
DI 和 IOC 
DI和IOC是差不多的概念。 
一個重要特徵是接口依賴,是把對象關係推遲到運行時去確定. 
DI是一個初始化實例的過程,分爲三種1.setter based 2.constructor based 3.interface based,在spring 中就是應用前兩種;但又不僅僅是初始化實例,而且是運用接口的概念去實現這種注入依賴。靜態地看,只是依賴一個接口,但實際運行起來,是依賴一個實現了該 接口的具體類。 
IOC就是面向接口編程的應用 
1.一個通常的做法(非面向接口編程的方法),對象A依賴對象B,B會作爲A的屬性,可以理解爲A直接控制B; 
2.IOC的做法,對象A依賴於接口C,而不直接依賴於實現了接口C的B,也就是A不能直接控制是哪個具體實現了C的B去做相應的事情,而是由我們控制可以由哪個實現了接口C的B去處理,也就是控制反過來了,是由B來決定了,而不是由A,實現就是面向接口編程。 
AOP 
AOP是動態代理的應用,將具體業務和相應的其它方面(比如日誌,權限之類的)劃分開來,業務不會知道還有沒有其它的功能來輔助,需要的話我就給他加上一個配置就可以,而不用去修改業務代碼。  
而權限和日誌則寫在其它的類advice中,只要在配置中說明在調用業務方法時(或前,或後,或別的),調用一下advice就OK了。很容易把一個方面,比如權限或日誌從業務代碼中剝離出來。 
在SPRING中,實現AOP的流程如下: 
1.定義業務接口 
2.定義業務實現類 
3.定義interceptor注入類 
4.配置Bean,設置class爲proxyFactoryBean 
    設置其三個屬性1.)proxyInterfaces爲1 
           2.)interceptorNames爲3 

           3.)target爲2


五.springMVC註解有哪些?分別有什麼作用?
  4個基本的
  @Component、@Repository @Service、@Controller
  看字面含義,很容易卻別出其中三個:
  @Controller 控制層,就是我們的action層
  @Service 業務邏輯層,就是我們的service或者manager層
  @Repository 持久層,就是我們常說的DAO層
  而@Component (字面意思就是組件),它在你確定不了事哪一個層的時候使用。
六.hibernate中的session的update()和saveOrUpdate()load()與get()有什麼區別?
  saveorupdate()如果傳入的對象在數據庫中有就做update操作,如果沒有就做save操作。
save()在數據庫中生成一條記錄,如果數據庫中有,會報錯說有重複的記錄。


hibernate中get方法和load方法的根本區別
如果你使用load方法,hibernate認爲該id對應的對象(數據庫記錄)在數據庫中是一定存在的,所以它可以放心的使用,
它可以放心的使用代理來延遲加載該對象。在用到對象中的其他屬性數據時才查詢數據庫,但是萬一數據庫中不存在該記錄,
那沒辦法,只能拋異常ObjectNotFoundException,所說的load方法拋異常是指在使用該對象的數據時,數據庫中不存在該數
據時拋異常,而不是在創建這個對象時。由於session中的緩存對於hibernate來說是個相當廉價的資源,所以在load時會先
查一下session緩存看看該id對應的對象是否存在,不存在則創建代理。所以如果你知道該id在數據庫中一定有對應記錄存
在就可以使用load方法來實現延遲加載。 

對於get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然後在二級緩存中查找,還沒有
就查數據庫,數據庫中沒有就返回null。 

雖然好多書中都這麼說:“get()永遠只返回實體類”,但實際上這是不正確的,get方法如果在session緩存中找到了該id對應
的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象延遲加載過,那麼返回的還是原先的
代理對象,而不是實體類對象,如果該代理對象還沒有加載實體數據(就是id以外的其他屬性數據),那麼它會查詢二級緩存或
者數據庫來加載數據,但是返回的還是代理對象,只不過已經加載了實體數據。 

前面已經講了,get方法首先查詢session緩存,沒有的話查詢二級緩存,最後查詢數據庫;反而load方法創建時首先查詢session緩存,
沒有就創建代理,實際使用數據時才查詢二級緩存和數據庫。 

總之對於get和load的根本區別,一句話,hibernate對於load方法認爲該數據在數據庫中一定存在,可以放心的使用代理來延遲加載

,如果在使用過程中發現了問題,就拋異常;而對於get方法,hibernate一定要獲取到真實的數據,否則返回null。

 

七.hibernate中的java對象有幾種狀態。其相互關係如何(區別和相互轉換)

  在Hibernate中,對象有三種狀態:臨時狀態、持久狀態和遊離狀態。 臨時狀態:當new一個實體對象後,這個對象處於臨時狀態,即這個對象只是一個保存臨時數據的內存區域,如果沒有變量引用這個對象,則會被jre垃圾回收機制回收。這個對象所保存的數據與數據庫沒有任何關係,除非通過Session的save或者SaveOrUpdate把臨時對象與數據庫關聯,並把數據插入或者更新到數據庫,這個對象才轉換爲持久對象;持久狀態:持久化對象的實例在數據庫中有對應的記錄,並擁有一個持久化表示(ID)。對持久化對象進行delete操作後,數據庫中對應的記錄將被刪除,那麼持久化對象與數據庫記錄不再存在對應關係,持久化對象變成臨時狀態。持久化對象被修改變更後,不會馬上同步到數據庫,直到數據庫事務提交。在同步之前,持久化對象是髒的(Dirty)。遊離狀態:當Session進行了Close、Clear或者evict後,持久化對象雖然擁有持久化標識符和與數據庫對應記錄一致的值,但是因爲會話已經消失,對象不在持久化管理之內,所以處於遊離狀態(也叫:脫管狀態)。遊離狀態的對象與臨時狀態對象是十分相似的,只是它還含有持久化標識。


八.事物是什麼?有哪些屬性,並簡要說明這些屬性的含義
  什麼是事務
  事務是訪問數據庫的一個操作序列,數據庫應用系統通過事務集來完成對數據庫的存取。事務的正確執行使得數據庫從一種狀態轉換成另一種狀態。
 
  事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫。
 原子性。即不可分割性,事務要麼全部被執行,要麼就全部不被執行。如果事務的所有子事務全部提交成功,則所有的數據庫操作被提交,數據庫狀態發生轉換;如果有子事務失敗,則其他子事務的數據庫操作被回滾,即數據庫回到事務執行前的狀態,不會發生狀態轉換。
 一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀態。
隔離性。在事務正確提交之前,不允許把該事務對數據的任何改變提供給任何其他事務,即在事務正確提交之前,它可能的結果不應顯示給任何其他事務。
持久性。事務正確提交後,其結果將永久保存在數據庫中,即使在事務提交後有了其他故障,事務的處理結果也會得到保存。 


九.簡述在mysql中索引,主鍵,唯一索引,聯合索引的區別,對數據庫的性能有什麼影響(從讀寫2個方面)
  1)索引是一種特殊的文件,他們包含着對數表裏所有記錄的引用指針
  2)普通索引(由關鍵字key或者index定義的索引)的唯一任務是加快對數據的訪問速度
  3)普通索引允許被索引的數據列包含重複的值,如果能確定某個數列將只包含彼此不同的值,
    在爲這個數據創建索引的時候就應該爲關鍵字unique把他定義爲一個唯一索引,也就是說。    唯一索引可以保證數據的唯一性
  4)主鍵是一種特殊的索引,在一張表中只能定義一個主鍵索引,主鍵用於唯一標識一條記錄    ,使用關鍵字primary key來創建
  5)索引可以覆蓋多個數據列,如像index(columnA,columnB)索引
  6)索引可以極大的提高數據的查詢速度,但是會降低插入,刪除,更新表的速度,因爲在執行這些操作的時候。還要操作索引文件




十.有這樣一個需求:商品搜索結果列表需要按人氣(用戶每訪問一次商品詳情頁面就+1)活銷量排序;請分析技術上如何實現該需求?
   最開始的就是
數據庫有個人氣表 每次訪問就會更新 查詢的時候連表查詢
  還有就是用搜索引擎咯
優化
用redis緩存記錄人氣數   每幾小時持久化一次
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章