說說SPRing? Spring的核心是控制反轉、依賴注入,Aop(面向切面)相當于把每個bean與bean之間的關系交給第 三方容器進行管理. 說SpringIOC、SpringAOP? SpringIOC ,其實就是依賴注入、控制反轉。相當于把每個bean與bean之間的關系交給第三方容器管理。而這個容器就是spring SpringAOP 面向切面的編程,或AOP,是一種編程技術,允許程序模塊化橫向切割關注點,或橫切典型的責任劃分,如日志和事務管理。 SpringAop 就是用 java的動態(tài)代理
Spring的底層實現(xiàn)機制是什么? 使用Demo4j(解析xml)+Java反射機制 Demo4j 其實就是解析XML。使用反射機制實例化bean。
SpringAOP用到了什么代理? JDK動態(tài)代理:對實現(xiàn)了接口的類生成代理 CGLib代理機制:對類生成代理 動態(tài)代理與靜態(tài)代理區(qū)別? 靜態(tài)代理:由程序員創(chuàng)建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。 動態(tài)代理:在程序運行時,運用反射機制動態(tài)創(chuàng)建而成。 Spring注入有那些方式? Set注入 構造器注入 靜態(tài)工廠的方法注入 實例工廠的方法注入 Spring有那些注解? @Autowired(按類型注入) @Service(標示為注入為服務層) @Resource(按名稱注入) @Controller(標識控制器bean id) @RequestMapping(表示映射URL路徑) 簡述Spring的優(yōu)缺點? Spring 的優(yōu)點?? 1.降低了組件之間的耦合性 ,實現(xiàn)了軟件各層之間的解耦 2.可以使用容易提供的眾多服務,如事務管理,消息服務等 3.容器提供單例模式支持 4.容器提供了AOP技術,利用它很容易實現(xiàn)如權限攔截,運行期監(jiān)控等功能 5.容器提供了眾多的輔助類,能加快應用的開發(fā) 6.spring對于主流的應用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring屬于低侵入式設計,代碼的污染極低 8.獨立于各種應用服務器 9.spring的DI機制降低了業(yè)務對象替換的復雜性 10.Spring的高度開放性,并不強制應用完全依賴于Spring,開發(fā)者可以自由選擇spring的部分或全部 缺點: 使用到了大量反射機制。反射機制非常占內存, SpringMVC工程流程 1. 用戶向服務器發(fā)送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲; 2. DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI)。然后根據(jù)該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最后以HandlerExecutionChain對象的形式返回; 3. DispatcherServlet 根據(jù)獲得的Handler,選擇一個合適的HandlerAdapter。(附注:如果成功獲得HandlerAdapter后,此時將開始執(zhí)行攔截器的preHandler(…)方法) 4. 提取Request中的模型數(shù)據(jù),填充Handler入參,開始執(zhí)行Handler(Controller)。 在填充Handler的入參過程中,根據(jù)你的配置,Spring將幫你做一些額外的工作: HttpMessageConveter: 將請求消息(如Json、xml等數(shù)據(jù))轉換成一個對象,將對象轉換為指定的響應信息 數(shù)據(jù)轉換:對請求消息進行數(shù)據(jù)轉換。如String轉換成Integer、Double等 數(shù)據(jù)根式化:對請求消息進行數(shù)據(jù)格式化。 如將字符串轉換成格式化數(shù)字或格式化日期等 數(shù)據(jù)驗證: 驗證數(shù)據(jù)的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中 5. Handler執(zhí)行完成后,向DispatcherServlet 返回一個ModelAndView對象; 6. 根據(jù)返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經注冊到Spring容器中的ViewResolver)返回給DispatcherServlet ; 7. ViewResolver 結合Model和View,來渲染視圖 8. 將渲染結果返回給客戶端。
SpringMVC工作流程描述 為什么SpringMVC只使用一個Servlet(DispatcherServlet)來處理所有請求? 詳細見J2EE設計模式-前端控制模式 Spring為什么要結合使用HandlerMapping以及HandlerAdapter來處理Handler? 符合面向對象中的單一職責原則,代碼架構清晰,便于維護,最重要的是代碼可復用性高。如HandlerAdapter可能會被用于處理多種Handler。
Hibernate面試題 什么是Hibernate? hibernate是一個基于ORM持久框架,可以讓程序員以面向對象的思想操作數(shù)據(jù)庫,提高生產效率. 什么是ORM? orm不過是一種思想,對象關系映射。是對象關系模型,如hibernate,讓你以面向對象的方式去編程。封裝了JDBC.
說一下orm與jdbc的區(qū)別? jdbc只是一個java操作數(shù)據(jù)庫的規(guī)范接口而已 orm不過是一種思想,對象關系映射。 ORM:是對象關系模型,如hibernate,讓你以面向對象的方式去編程。封裝了JDBC. JDBC:是從底層訪問數(shù)據(jù)庫服務器。一般銀行,金融行業(yè)為了安全起見,直接用JDBC訪問 Hibernate中get和load有什么不同之處? load :找不到數(shù)據(jù)的話會拋出org.hibernate.ObjectNotFoundException異常。此時hibernate會使用延遲加載加載機制 get找不到的話會返回null。 如果查詢不到數(shù)據(jù),get 會返回 null,但是不會報錯, load 如果查詢不到數(shù)據(jù),則報錯ObjectNotFoundException 使用get 去查詢數(shù)據(jù),(先到一級/二級)會立即向db發(fā)出查詢請求(select …), 如果你使用的是 load查詢數(shù)據(jù),(先到一級、二級))即使查詢到對象,返回的是一個代理對象,如果后面沒有使用查詢結果,它不會真的向數(shù)據(jù)庫發(fā)select ,當程序員使用查詢結果的時候才真的發(fā)出select ,這個現(xiàn)象我們稱為懶加載(lazy) hibernate的三種狀態(tài)? 在Hibernate中,對象有三種狀態(tài):臨 時狀態(tài)(Transient)、持久狀態(tài)(Persistent)和游離狀態(tài)(Detached)。 處于持久態(tài)的對象也稱為 PO(PersistenceObject),臨時對象和游離對象也稱為VO(ValueObject).
hibernate的懶加載? 有幾種禁用方法 在Hibernate框架中,當我們要訪問的數(shù)據(jù)量過大時,明顯用緩存不太合適, 因為內存容量有限 ,為了減少并發(fā)量,減少系統(tǒng)資源的消耗,這時Hibernate用懶加載機制來彌補這種缺陷,但是這只是彌補而不是用了懶加載總體性能就提高了。 我們所說的懶加載也被稱為延遲加載,它在查詢的時候不會立刻訪問數(shù)據(jù)庫,而是返回代理對象,當真正去使用對象的時候才會訪問數(shù)據(jù)庫。 1.使用代理對象:Hibernate.initialize(“代理對象”); 2.在需要禁用懶加載的映射文件中顯示的加入lazy = “false” 3.使用opensessionInView【需要借助于過濾器】 需要在web.xml文件中配置 hibernate有幾種查詢方式? 1、 屬性查詢2、 參數(shù)查詢、命名參數(shù)查詢3、 關聯(lián)查詢4、 分頁查詢5、 統(tǒng)計函數(shù) Hibernate的優(yōu)缺點? 1.Hibernate的優(yōu)缺點: 優(yōu)點:1、程序更加面向對象; 2、提高了生產率; 3、方便移植(修改配置文件); 4、無侵入性。 缺點: 1、效率比JDBC略差; 2、不適合批量操作。 Hibernate的緩存機制 Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存。 1.Hibernate一級緩存又稱為“Session的緩存”。 Session內置不能被卸載,Session的緩存是事務范圍的緩存(Session對象的生命周期通常對應一個數(shù)據(jù)庫事務或者一個應用事務)。 一級緩存中,持久化類的每個實例都具有唯一的OID。 2.Hibernate二級緩存又稱為“SessionFactory的緩存”。 由于SessionFactory對象的生命周期和應用程序的整個過程對應,因此Hibernate二級緩存是進程范圍或者集群范圍的緩存,有可能出現(xiàn)并發(fā)問題,因此需要采用適當?shù)牟l(fā)訪問策略,該策略為被緩存的數(shù)據(jù)提供了事務隔離級別。 第二級緩存是可選的,是一個可配置的插件,默認下SessionFactory不會啟用這個插件。 Hibernate提供了org.hibernate.cache.CacheProvider接口,它充當緩存插件與Hibernate之間的適配器。 Hibernate延遲加載? 1) Hibernate2延遲加載實現(xiàn):a)實體對象 b)集合(Collection) 2) Hibernate3 提供了屬性的延遲加載功能 當Hibernate在查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在與內存中,當程序真正對數(shù)據(jù)的操作時,對象才存在與內存中,就實現(xiàn)了延遲加載,他節(jié)省了服務器的內存開銷,從而提高了服務器的性能。 Hibernate工作原理及為什么要用? 原理: 1) 讀取并解析配置文件 2) 讀取并解析映射信息 3) 創(chuàng)建SessionFactory 4) 打開Sesssion 5) 創(chuàng)建事務Transation 6) 持久化操作 7) 提交事務 8) 關閉Session 9) 關閉SesstionFactory 為什么要用: 1) 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復性代碼。 2) Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作 3) hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現(xiàn)透明性。 4) hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數(shù)據(jù)庫,從一對一到多對多的各種復雜關系。
什么是Mybatis? Mybatis的前生是ibatis,最后升級版本后名稱叫mybatis。mybatis是以純sql操作數(shù)據(jù)。 Mybatis與Hibernate區(qū)別? Hibernate是面向對象的思想操作數(shù)據(jù)生成Sql語句,而mybatis是以純sql操作數(shù)據(jù) 相對于mybatis容易優(yōu)化.擴展性好,但是移植性差。 設計模式部分 你熟悉那些設計模式? 總共有23種設計模式 總體來說設計模式分為三大類: 創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。 行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、訪問者模式、中介者模式、解釋器模式。 企業(yè)面試的時候,面試官非常喜歡考單例,而且非常喜歡考手寫單例。 什么是單例?單例有那些寫法? 單例分類:懶漢式單例、餓漢式單例 單例模式有以下特點: 1、單例類只能有一個實例。 2、單例類必須自己創(chuàng)建自己的唯一實例。 3、單例類必須給所有其他對象提供這一實例。 ①懶漢式單例 1.//懶漢式單例類.在第一次調用的時候實例化自己 2.public class Singleton { 3. private Singleton() {} 4. private static Singleton single=null; 5. //靜態(tài)工廠方法 6. public static Singleton getInstance () { 7. if (single == null) { 8. single = new Singleton(); 9. } 10. return single; 11. } 12.} ②餓漢式單例 13.//餓漢式單例類.在類初始化時,已經自行實例化 14.public class Singleton1 { 15. private Singleton1() {} 16. private static final Singleton1 single = new Singleton1(); 17. //靜態(tài)工廠方法 18. public static Singleton1 getInstance() { 19. return single; 20. } 21.} 懶漢式與餓漢式區(qū)別? 從名字上來說,餓漢和懶漢, 餓漢就是類一旦加載,就把單例初始化完成,保證getInstance的時候,單例是已經存在的了, 而懶漢比較懶,只有當調用getInstance的時候,才回去初始化這個單例。 另外從以下兩點再區(qū)分以下這兩種方式:
1、線程安全: 餓漢式天生就是線程安全的,可以直接用于多線程而不會出現(xiàn)問題, 懶漢式本身是非線程安全的,為了實現(xiàn)線程安全有幾種寫法,分別是上面的1、2、3,這三種實現(xiàn)在資源加載和性能方面有些區(qū)別。
2、資源加載和性能: 餓漢式在類創(chuàng)建的同時就實例化一個靜態(tài)對象出來,不管之后會不會使用這個單例,都會占據(jù)一定的內存,但是相應的,在第一次調用時速度也會更快,因為其資源已經初始化完成, 而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候才會實例化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之后就和餓漢式一樣了。
新聞熱點
疑難解答