JavaEE
Spring
-
Spring是什麼?Spring自動裝配?Spring自動裝配的方式?
Spring架構是一個開放源代碼的J2EE應用程式架構,是針對bean的生命周期進行管理的輕量級容器(lightweight container)。Spring架構主要由七部分組成,分别是Spring Core、Spring AOP、Spring ORM、Spring DAO、Spring Context、Spring Web和 Spring Web MVC。
自動裝配就是讓應用程式上下文為你找出依賴項的過程。說的通俗一點,就是Spring會在上下文中自動查找,并自動給bean裝配與其關聯的屬性!
spring中實作自動裝配的方式有兩種,一種是通過xml檔案、另一種是通過注解。
-
請問什麼是IoC和DI?
①IoC(Inversion of Control,控制倒轉)。這是spring的核心,貫穿始終。所謂IoC,對于spring架構來說,就是由spring來負責控制對象的生命周期和對象間的關系。
②IoC的一個重點是在系統運作中,動态的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴注入)來實作的。
-
請說明一下springIOC原理是什麼?
IoC的一個重點是在系統運作中,動态的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴注入)來實作的。比如對象A需要操作資料庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring我們就隻需要告訴spring,A中需要一個Connection,至于這個Connection怎麼構造,何時構造,A不需要知道。在系統運作時,spring會在适當的時候制造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個對象之間關系的控制。A需要依賴 Connection才能正常運作,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實作的呢? Java 1.3之後一個重要特征是反射(reflection),它允許程式在運作的時候動态的生成對象、執行對象的方法、改變對象的屬性,spring就是通過反射來實作注入的。
-
請簡單說明一下依賴注入的方式有哪幾種?
1、Set注入 2、構造器注入 3、接口注入
- 請介紹一下bean的生命周期
Java面試題(四)JavaEE -
什麼是AOP?
AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向對象程式設計)的補充和完善。OOP引入封裝、繼承、多态等概念來建立一種對象層次結構,用于模拟公共行為的一個集合。不過OOP允許開發者定義縱向的關系,但并不适合定義橫向的關系。AOP技術恰恰相反,它利用一種稱為"橫切"的技術,剖解開封裝的對象内部,并将那些影響了多個類的公共行為封裝到一個可重用子產品,并将其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務子產品所共同調用的邏輯或責任封裝起來,便于減少系統的重複代碼,降低子產品之間的耦合度,并有利于未來的可操作性和可維護性。
-
請簡單談一下spring架構的優點都有哪些?
Spring是一個輕量級的DI和AOP容器架構,在項目的中的使用越來越廣泛,它的優點主要有以下幾點:
(1)Spring是一個非侵入式架構,其目标是使應用程式代碼對架構的依賴最小化,應用代碼可以在沒有Spring或者其他容器的情況運作。
(2)Spring提供了一個一緻的程式設計模型,使應用直接使用POJO開發,進而可以使運作環境隔離開來。
(3)Spring推動應用的設計風格向面向對象及面向接口程式設計轉變,提高了代碼的重用性和可測試性。
(4)Spring改進了結構體系的選擇,雖然作為應用平台,Spring可以幫助我們選擇不同的技術實作,比如從Hibernate切換到其他的ORM工具,從Struts切換到Spring MVC,盡管我們通常不會這麼做,但是我們在技術方案上選擇使用Spring作為應用平台,Spring至少為我們提供了這種可能性的選擇,進而降低了平台鎖定風險。
MyBatis
- mybatis架構原理?
Java面試題(四)JavaEE -
MyBatis中的動态SQL是什麼意思?
對于一些複雜的查詢,我們可能會指定多個查詢條件,但是這些條件可能存在也可能不存在,需要根據使用者指定的條件動态生成SQL語句。如果不使用持久層架構我們可能需要自己拼裝SQL語句,還好MyBatis提供了動态SQL的功能來解決這個問題。MyBatis中用于實作動态SQL的元素主要有:if、choose、trim、where、set、foreach
-
模糊查詢like裡#号和$号的差別?
#{}是使用預編譯(底層使用preparedStatement調用set方法來指派),會在參數前後加單引号,而 ${}是使用拼接的方式将 ${}替換為變量。建議使用#而不是 $符号避免SQL注入問題。
-
Mybatis的Xml映射檔案中,不同的Xml映射檔案,id是否可以重複?
不同的Xml映射檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,隻是最佳實踐而已。原因就是namespace+id是作為Map<String, MappedStatement>的key使用的,如果沒有namespace,就剩下id,那麼,id重複會導緻資料互相覆寫。有了namespace,自然id就可以重複,namespace不同,namespace+id自然也就不同。
-
Mybatis是如何進行分頁的?分頁插件的原理是什麼?
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非實體分頁,可以在sql内直接書寫帶有實體分頁的參數來完成實體分頁功能,也可以使用分頁插件來完成實體分頁。分頁插件的基本原理是使用Mybatis提供的插件接口,實作自定義插件,在插件的攔截方法内攔截待執行的sql,然後重寫sql,根據dialect方言,添加對應的實體分頁語句和實體分頁參數。
- 請說說MyBatis的工作原理
Java面試題(四)JavaEE - 在mapper中如何傳遞多個參數?
Java面試題(四)JavaEE - Spring MVC的工作原理是怎樣的?
Java面試題(四)JavaEE ①用戶端的所有請求都交給前端控制器DispatcherServlet來處理,它會負責調用系統的其他子產品來真正處理使用者的請求。
② DispatcherServlet收到請求後,将根據請求的資訊(包括URL、HTTP協定方法、請求頭、請求參數、Cookie等)以及HandlerMapping的配置找到處理該請求的Handler(任何一個對象都可以作為請求的Handler)。
③在這個地方Spring會通過HandlerAdapter對該處理器進行封裝。
④ HandlerAdapter是一個擴充卡,它用統一的接口對各種Handler中的方法進行調用。
⑤ Handler完成對使用者請求的處理後,會傳回一個ModelAndView對象給DispatcherServlet,ModelAndView顧名思義,包含了資料模型以及相應的視圖的資訊。
⑥ ModelAndView的視圖是邏輯視圖,DispatcherServlet還要借助ViewResolver完成從邏輯視圖到真實視圖對象的解析工作。
⑦ 當得到真正的視圖對象後,DispatcherServlet會利用視圖對象對模型資料進行渲染。
⑧ 用戶端得到響應,可能是一個普通的HTML頁面,也可以是XML或JSON字元串,還可以是一張圖檔或者一個PDF檔案。
-
請說明一下springmvc和spring-boot差別是什麼?
Spring 就像一個大家族,有衆多衍生産品例如 Boot,Security,JPA等等。但他們的基礎都是Spring 的 IOC 和 AOP,IOC提供了依賴注入的容器,而AOP解決了面向切面的程式設計,然後在此兩者的基礎上實作了其他衍生産品的進階功能;因為 Spring 的配置非常複雜,各種xml,properties處理起來比較繁瑣。于是為了簡化開發者的使用,Spring社群創造性地推出了Spring Boot,它遵循約定優于配置,極大降低了Spring使用門檻,但又不失Spring原本靈活強大的功能。
-
請說明一下Spring MVC注解的優點是什麼?
1、XML配置起來有時候冗長,此時注解可能是更好的選擇,如jpa的實體映射;注解在處理一些不變的中繼資料時有時候比XML友善的多,比如springmvc的資料綁定,如果用xml寫的代碼會多的多;
2、注解最大的好處就是簡化了XML配置;其實大部分注解一旦确定後很少會改變,是以在一些中小項目中使用注解反而提高了開發效率,是以沒必要一頭走到黑;
3、注解相對于XML的另一個好處是類型安全的,XML隻能在運作期才能發現問題。
-
SpringBoot自動裝配?原理?
springboot一大優勢就是省去了很多的配置,也就是說當springboot啟動的時候,springboot在内部就已經幫忙封裝好了,者其實就是springboot的自動裝配操作。
SpringBoot通過main方法啟動SpringApplication類的靜态方法run()來啟動項目。根據注釋的意思,run方法從一個使用了預設配置的指定資源啟動一個SpringApplication并傳回ApplicationContext對象。這個預設配置來源于@SpringBootApplication注解,這個注解是個複合注解,裡面還包含了其他注解。其中有三個注解是比較重要的:
(1)@SpringBootConfiguration:這個注解的底層是一個@Configuration注解,意思被@Configuration注解修飾的類是一個IOC容器,支援JavaConfig的方式來進行配置;
(2)@ComponentScan:這個就是掃描注解的意思,預設掃描目前類所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加載到IOC容器中;
(3)@EnableAutoConfiguration:這個注解表明啟動自動裝配,裡面包含連個比較重要的注解@AutoConfigurationPackage和@Import。