Java面試題5、框架
一、SpringMVC
-
SpringMVC 的工作原理 a. 使用者向伺服器傳送請求,請求被 springMVC 前端控制器 DispatchServlet 捕獲; b. DispatcherServle 對請求 URL 進行解析,得到請求資源識別符號(URL),然後根據該 URL 呼叫 HandlerMapping將請求對映到處理器 HandlerExcutionChain; c. DispatchServlet 根據獲得 Handler 選擇一個合適的 HandlerAdapter 介面卡處理; d. Handler 對資料處理完成以後將返回一個 ModelAndView()物件給 DisPatchServlet; e. Handler 返回的 ModelAndView()只是一個邏輯檢視並不是一個正式的檢視, DispatcherSevlet 通過ViewResolver 試圖解析器將邏輯檢視轉化為真正的檢視 View; h. DispatcherServle 通過 model 解析出 ModelAndView()中的引數進行解析最終展現出完整的 view 並返回給 客戶端;
-
SpringMVC 常用註解都有哪些? @requestMapping 用於請求 url 對映。 @RequestBody 註解實現接收 http 請求的 json 資料,將 json 資料轉換為 java 物件。 @ResponseBody 註解實現將 controller 方法返回物件轉化為 json 響應給客戶。
-
如何開啟註解處理器和介面卡? 我們在專案中一般會在 springmvc.xml 中通過開啟 mvc:annotation-driven來實現註解處理器和介面卡的開啟。
-
如何解決 get 和 post 亂碼問題? 解決 post 請求亂碼:我們可以在 web.xml 裡邊配置一個 CharacterEncodingFilter 過濾器。 設定為 utf-8. 解決 get 請求的亂碼:有兩種方法。對於 get 請求中文引數出現亂碼解決方法有兩個:
-
修改 tomcat 配置檔案新增編碼與工程編碼一致。
-
另 外 一 種 方 法 對 參 數 進 行 重 新 編 碼 String userName = New String(Request.getParameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);、
二、Spring
-
談談你對 Spring 的理解 Spring 是一個開源框架,為簡化企業級應用開發而生。Spring 可以是使簡單的 JavaBean 實現以前只有 EJB 才能實現的功能。Spring 是一個 IOC 和 AOP 容器框架。 Spring 容器的主要核心是: 控制反轉(IOC),傳統的 java 開發模式中,當需要一個物件時,我們會自己使用 new 或者 getInstance 等直接 或者間接呼叫構造方法建立一個物件。而在 spring 開發模式中,spring 容器使用了工廠模式為我們建立了所需要的對 象,不需要我們自己建立了,直接呼叫 spring 提供的物件就可以了,這是控制反轉的思想。 依賴注入(DI),spring 使用 javaBean 物件的 set 方法或者帶引數的構造方法為我們在建立所需物件時將其屬 性自動設定所需要的值的過程,就是依賴注入的思想。 面向切面程式設計(AOP),在面向物件程式設計(oop)思想中,我們將事物縱向抽成一個個的物件。而在面向切面程式設計 中,我們將一個個的物件某些類似的方面橫向抽成一個切面,對這個切面進行一些如許可權控制、事物管理,記錄日誌等公用操作處理的過程就是面向切面程式設計的思想。AOP 底層是動態代理,如果是介面採用 JDK 動態代理,如果是類採用CGLIB 方式實現動態代理。
-
Spring 中的設計模式
a. 單例模式——spring 中兩種代理方式,若目標物件實現了若干介面,spring 使用 jdk 的 java.lang.reflect.Proxy類代理。若目標兌現沒有實現任何介面,spring 使用 CGLIB 庫生成目標類的子類。 單例模式——在 spring 的配置檔案中設定 bean 預設為單例模式。 b. 模板方式模式——用來解決程式碼重複的問題。 比如:RestTemplate、JmsTemplate、JpaTemplate d. 前端控制器模式——spring 提供了前端控制器 DispatherServlet 來對請求進行分發。 e. 試圖幫助(view helper)——spring 提供了一系列的 JSP 標籤,高效巨集來幫助將分散的程式碼整合在試圖中。 f. 依賴注入——貫穿於 BeanFactory/ApplacationContext 介面的核心理念。 g. 工廠模式——在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用同一個介面來 指向新建立的物件。Spring 中使用 beanFactory 來建立物件的例項。
- Spring 的常用註解 Spring 在 2.5 版本以後開始支援註解的方式來配置依賴注入。可以用註解的方式來代替 xml 中 bean 的描述。注 解注入將會被容器在 XML 注入之前被處理,所以後者會覆蓋掉前者對於同一個屬性的處理結果。 註解裝配在 spring 中預設是關閉的。所以需要在 spring 的核心配置檔案中配置一下才能使用基於註解的裝配模 式。配置方式如下:<context:annotation-config /> 常用的註解: @Required:該註解應用於設值方法
@Autowired:該註解應用於有值設值方法、非設值方法、構造方法和變數。
@Qualifier:該註解和@Autowired 搭配使用,用於消除特定 bean 自動裝配的歧義。
-
簡單介紹一下 Spring bean 的生命週期 bean 定義:在配置檔案裡面用來進行定義。 bean 初始化:有兩種方式初始化: 1.在配置檔案中通過指定 init-method 屬性來完成 2.實現 org.springframwork.beans.factory.InitializingBean 介面 bean 呼叫:有三種方式可以得到 bean 例項,並進行呼叫 bean 銷燬:銷燬有兩種方式 1.使用配置檔案指定的 destroy-method 屬性 2.實現 org.springframwork.bean.factory.DisposeableBean 介面
-
Spring 結構圖
(1)核心容器:包括 Core、Beans、Context、EL 模組。
Core 模組:封裝了框架依賴的最底層部分,包括資源訪問、型別轉換及一些常用工具類。
Beans 模組:提供了框架的基礎部分,包括反轉控制和依賴注入。其中 Bean Factory 是容器核心,本質是“工廠
設計模式”的實現,而且無需程式設計實現“單例設計模式”,單例完全由容器控制,而且提倡面向介面程式設計,而非面向實 現程式設計;所有應用程式物件及物件間關係由框架管理,從而真正把你從程式邏輯中把維護物件之間的依賴關係提取出 來,所有這些依賴關係都由 BeanFactory 來維護。 Context 模組:以 Core 和 Beans 為基礎,整合 Beans 模組功能並新增資源繫結、資料驗證、國際化、Java EE 支援、容器生命週期、事件傳播等;核心介面是 ApplicationContext。
EL 模組:提供強大的表示式語言支援,支援訪問和修改屬性值,方法呼叫,支援訪問及修改陣列、容器和索引器, 命名變數,支援算數和邏輯運算,支援從 Spring 容器獲取 Bean,它也支援列表投影、選擇和一般的列表聚合等。 (2)AOP、Aspects 模組:
AOP 模組:Spring AOP 模組提供了符合 AOP Alliance 規範的面向方面的程式設計(aspect-oriented programming) 實現,提供比如日誌記錄、許可權控制、效能統計等通用功能和業務邏輯分離的技術,並且能動態的把這些功能新增到需 要的程式碼中;這樣各專其職,降低業務邏輯和通用功能的耦合。 Aspects 模組:提供了對 AspectJ 的整合,AspectJ 提供了比 Spring ASP 更強大的功能。 資料訪問/整合模組:該模組包括了 JDBC、ORM、OXM、JMS 和事務管理。 事務模組:該模組用於 Spring 管理事務,只要是 Spring 管理物件都能得到 Spring 管理事務的好處,無需在程式碼中進行事務控制了,而且支援程式設計和宣告性的事務管理。
JDBC 模組:提供了一個 JBDC 的樣例模板,使用這些模板能消除傳統冗長的 JDBC 編碼還有必須的事務控制,而 且能享受到 Spring 管理事務的好處。 ORM 模組:提供與流行的“物件-關係”對映框架的無縫整合,包括 Hibernate、JPA、MyBatis 等。而且可以使 用 Spring 事務管理,無需額外控制事務。 OXM 模組:提供了一個對 Object/XML 對映實現,將 java 物件對映成 XML 資料,或者將 XML 資料對映成 java物件,Object/XML 對映實現包括 JAXB、Castor、XMLBeans 和 XStream。 JMS 模組:用於 JMS(Java Messaging Service),提供一套 “訊息生產者、訊息消費者”模板用於更加簡單的使 用 JMS,JMS 用於用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。 Web/Remoting 模組:Web/Remoting 模組包含了 Web、Web-Servlet、Web-Struts、Web-Porlet 模組。 Web 模組:提供了基礎的 web 功能。例如多檔案上傳、整合 IoC 容器、遠端過程訪問(RMI、Hessian、Burlap)以及 Web Service 支援,並提供一個 RestTemplate 類來提供方便的 Restful services 訪問。 Web-Servlet 模組:提供了一個 Spring MVC Web 框架實現。Spring MVC 框架提供了基於註解的請求資源注 入、更簡單的資料繫結、資料驗證等及一套非常易用的 JSP 標籤,完全無縫與 Spring 其他技術協作。 Web-Struts 模組:提供了與 Struts 無縫整合,Struts1.x 和 Struts2.x 都支援 Test 模組: Spring 支援 Junit 和 TestNG 測試框架,而且還額外提供了一些基於 Spring 的測試功能,比如在測 試 Web 框架時,模擬 Http 請求的功能。
- Spring 能幫我們做什麼? a. Spring 能幫我們根據配置檔案建立及組裝物件之間的依賴關係。 Spring 根據配置檔案來進行建立及組裝物件間依賴關係,只需要改配置檔案即可
b. Spring 面向切面程式設計能幫助我們無耦合的實現日誌記錄,效能統計,安全控制。 Spring 面向切面程式設計能提供一種更好的方式來完成,一般通過配置方式,而且不需要在現有程式碼中新增任何額外程式碼,現有程式碼專注業務邏輯。
c. Spring 能非常簡單的幫我們管理資料庫事務。 採用 Spring,我們只需獲取連線,執行 SQL,其他事物相關的都交給 Spring 來管理了。
d. Spring 還能與第三方資料庫訪問框架(如 Hibernate、JPA)無縫整合,而且自己也提供了一套 JDBC 訪問模板,來方便資料庫訪問。
e. Spring 還能與第三方 Web(如 Struts、JSF)框架無縫整合,而且自己也提供了一套 Spring MVC框架,來方便 web 層搭建。
f. Spring 能方便的與 Java EE(如 Java Mail、任務排程)整合,與更多技術整合(比如快取框架)。
- 請描述一下 Spring 的事務
宣告式事務管理的定義:用在 Spring 配置檔案中宣告式的處理事務來代替程式碼式的處理事務。這樣的好處是,事務管理不侵入開發的元件,具體來說,業務邏輯物件就不會意識到正在事務管理之中,事實上也應該 如此,因為事務管理是屬於系統層面的服務,而不是業務邏輯的一部分,如果想要改變事務管理策劃的話,也 只需要在定義檔案中重新配置即可,這樣維護起來極其方便。 基於 TransactionInterceptor 的宣告式事務管理:兩個次要的屬性: transactionManager,用來 指定一個事務治理器,並將具體事務相關的操作請託給它;其他一個是 Properties 型別的 transactionAttributes 屬性,該屬性的每一個鍵值對中,鍵指定的是方法名,方法名可以行使萬用字元,而值就是表現呼應方法的所運用的事務屬性。
1.<beans…> 2… 3.<bean id=“transactionInterceptor” 4. class=“org.springframework.transaction.interceptor.TransactionInterceptor”> 5. 6. 7. 8. PROPAGATION_REQUIRED 9. 10. 11. 12.<bean id=“bankServiceTarget” 13. class=“footmark.spring.core.tx.declare.origin.BankServiceImpl”> 14. 15. 16.<bean id=“bankService” 17. class=“org.springframework.aop.framework.ProxyFactoryBean”> 18. 19. 20. 21. 22. 23. 24. 25… 26. 基於 TransactionProxyFactoryBean 的宣告式事務管理:設定配置檔案與先前比照簡化了許多。我們把這類設定配置檔案格式稱為 Spring 經典的宣告式事務治理
1.<beans…> 2… 3.<bean id=“bankServiceTarget” 4. class=“footmark.spring.core.tx.declare.classic.BankServiceImpl”> 5. 6. 7.<bean id=“bankService” 8. class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean”> 9. 10. 11. 12. 13. PROPAGATION_REQUIRED 14. 15. 16. 17… 18. 基於 名稱空間的宣告式事務治理:在前兩種方法的基礎上,Spring 2.x 引入了 名稱空間,連絡行使 名稱空間,帶給開發人員設定配備宣告式事務的全新體驗。
基於 @Transactional 的宣告式事務管理:Spring 2.x 還引入了基於 Annotation 的體式格式,具體次要觸及@Transactional 標註。@Transactional 可以浸染於介面、介面方法、類和類方法上。算作用於類上時,該類的一切public 方法將都具有該型別的事務屬性。
[email protected](propagation = Propagation.REQUIRED) 2. public boolean transfer(Long fromId, Long toId, double amount) { 3. return bankDao.transfer(fromId, toId, amount); 4.}
程式設計式事物管理的定義:在程式碼中顯式挪用 beginTransaction()、commit()、rollback()等事務治理相關的方法,這就是程式設計式事務管理。Spring 對事物的程式設計式管理有基於底層 API 的程式設計式管理和基於 TransactionTemplate 的程式設計式事務管理兩種方式。
基 於 底 層 API 的 編 程 式 管 理 : 憑 證 PlatformTransactionManager 、 TransactionDefinition 和TransactionStatus 三個焦點介面,來實現程式設計式事務管理。
5.Public class BankServiceImpl implements BancService{ 6.Private BanckDao bankDao; 7.private TransactionDefinition txDefinition; 8.private PlatformTransactionManager txManager; 9… 10. public boolean transfer(Long fromId, Long toId, double amount) { 11. TransactionStatus txStatus = txManager.getTransaction(txDefinition); 12.boolean result = false; 13.try { 14.result = bankDao.transfer(fromId, toId, amount); 15.txManager.commit(txStatus); 16.} catch (Exception e) { 17.result = false; 18.txManager.rollback(txStatus); 19.System.out.println(“Transfer Error!”); 20.} 21.return result; 22.} 23.}
基於 TransactionTemplate 的程式設計式事務管理:為了不損壞程式碼原有的條理性,避免出現每一個方法中都包括相同的啟動事物、提交、回滾事物樣板程式碼的現象,spring 提供了 transactionTemplate 模板來實現程式設計式事務管理。 1.public class BankServiceImpl implements BankService { 2.private BankDao bankDao; 3.private TransactionTemplate transactionTemplate; 4… 5.public boolean transfer(final Long fromId, final Long toId, final double amount) { 6.return (Boolean) transactionTemplate.execute(new TransactionCallback(){ 7.public Object doInTransaction(TransactionStatus status) { 8.Object result; 9.try { 10.result = bankDao.transfer(fromId, toId, amount); 11.} catch (Exception e) { 12.status.setRollbackOnly(); 13.result = false; 14.System.out.println(“Transfer Error!”); 15.} 16.return result; 17.} 18.}); 19.} 20.}
程式設計式事務與宣告式事務的區別: 1)程式設計式事務是自己寫事務處理的類,然後呼叫 2)宣告式事務是在配置檔案中配置,一般搭配在框架裡面使用!
- BeanFactory 常用的實現類有哪些?
Bean 工廠是工廠模式的一個實現,提供了控制反轉功能,用來把應用的配置和依賴從正真的應用程式碼中分離。常 用的 BeanFactory 有 DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等。 XMLBeanFactory,最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它根據 XML 檔案中的定義載入 beans。該容器從 XML 檔案讀取配置元資料並用它去建立一個完全配置的系統或應用。
- 解釋 Spring JDBC、Spring DAO 和 Spring ORM Spring-DAO 並非 Spring 的一個模組,它實際上是指示你寫 DAO 操作、寫好 DAO 操作的一些規範。因此, 對於訪問你的資料它 既沒有提供介面也沒有提供實現更 沒有提 供模 板。 在寫一 個 DAO 的時候 ,你應 該使 用 @Repository 對其進行註解,這樣底層技術(JDBC,Hibernate,JPA,等等)的相關異常才能一致性地翻譯為相應 的 DataAccessException 子類。
Spring-JDBC 提供了 Jdbc 模板類,它移除了連線程式碼以幫你專注於 SQL 查詢和相關引數。Spring-JDBC 還 提供了一個 JdbcDaoSupport,這樣你可以對你的 DAO 進行擴充套件開發。它主要定義了兩個屬性:一個 DataSource 和一個 JdbcTemplate,它們都可以用來實現 DAO 方法。JdbcDaoSupport 還提供了一個將 SQL 異常轉換為 Spring DataAccessExceptions 的異常翻譯器。
Spring-ORM 是一個囊括了很多持久層技術(JPA,JDO,Hibernate,iBatis)的總括模組。對於這些技術中的每一 個,Spring 都提供了整合類,這樣每一種技術都能夠在遵循 Spring 的配置原則下進行使用,並平穩地和 Spring 事務管理進行整合。
對 於 每 一 種 技 術 , 配 置 主 要 在 於 將 一 個 DataSource bean 注 入 到 某 種 SessionFactory 或 者 EntityManagerFactory 等 bean 中。純 JDBC 不需要這樣的一個整合類(JdbcTemplate 除外),因為 JDBC 僅依 賴於一個 DataSource。 如果你計劃使用一種 ORM 技術,比如 JPA 或者 Hibernate,那麼你就不需要 Spring-JDBC 模組了,你需要 的是這個 Spring-ORM 模組。
-
簡單介紹一下 Spring WEB 模組。 Spring 的 WEB 模組是構建在 application context 模組基礎之上,提供一個適合 web 應用的上下文。這個模組也包括支援多種面向 web 的任務,如透明地處理多個檔案上傳請求和程式級請求引數的繫結到你的業務物件。它也有對 Jakarta Struts 的支援。
-
Spring 配置檔案有什麼作用? Spring 配置檔案是個 XML 檔案,這個檔案包含了類資訊,描述瞭如何配置它們,以及如何相互呼叫
-
什麼是 Spring IOC 容器? IOC 控制反轉:Spring IOC 負責建立物件,管理物件。通過依賴注入(DI),裝配物件,配置物件,並且管理這些物件的整個生命週期。
-
IOC 的優點是什麼? IOC 或 依賴注入把應用的程式碼量降到最低。它使應用容易測試,單元測試不再需要單例和 JNDI 查詢機制。最小 的代價和最小的侵入性使鬆散耦合得以實現。IOC 容器支援載入服務時的餓漢式初始化和懶載入。
-
ApplicationContext 的實現類有哪些? FileSystemXmlApplicationContext :此容器從一個 XML 檔案中載入 beans 的定義,XML Bean 配置檔案的全 路徑名必須提供給它的建構函式。 ClassPathXmlApplicationContext:此容器也從一個 XML 檔案中載入 beans 的定義,這裡,你需要正確設定 classpath 因為這個容器將在 classpath 裡找 bean 配置。 WebXmlApplicationContext:此容器載入一個 XML 檔案,此檔案定義了一個 WEB 應用的所有 bean。