Spring Framework 現(xiàn)在幾乎已成為 Java Web 開發(fā)的標(biāo)配框架。那么,作為 Java 程序員,你對 Spring 的主要技術(shù)點又掌握了多少呢?不妨用本文的問題來檢測一下。 1、一般問題1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5發(fā)布于 2007 年。這是第一個支持注解的版本。Spring 3.0發(fā)布于 2009 年。它完全利用了 Java5 中的改進,并為 JEE6 提供了支持。Spring 4.0發(fā)布于 2013 年。這是第一個完全支持 JAVA8 的版本。 1.2. 什么是 Spring Framework?
1.3. 列舉 Spring Framework 的優(yōu)點。
1.4. Spring Framework 有哪些不同的功能?
1.5. Spring Framework 中有多少個模塊,它們分別是什么?
1.6. 什么是 Spring 配置文件? Spring 配置文件是 XML 文件。該文件主要包含類信息。它描述了這些類是如何配置以及相互引入的。但是,XML 配置文件冗長且更加干凈。如果沒有正確規(guī)劃和編寫,那么在大項目中管理變得非常困難。 1.7. Spring 應(yīng)用程序有哪些不同組件? Spring 應(yīng)用一般有以下組件:
1.8. 使用 Spring 有哪些方式? 使用 Spring 有以下方式:
如果需要Java工程化、高性能及分布式、微服務(wù)、Spring,MyBatis,Netty源碼分析資料的朋友可以加Java進階群:838498680群里有阿里大牛直播講解技術(shù),以及大型互聯(lián)網(wǎng)公司架構(gòu)技術(shù)的視頻免費分享給大家。 2、依賴注入(Ioc)2.1. 什么是 Spring IOC 容器? Spring 框架的核心是 Spring 容器。容器創(chuàng)建對象,將它們裝配在一起,配置它們并管理它們的完整生命周期。Spring 容器使用依賴注入來管理組成應(yīng)用程序的組件。容器通過讀取提供的配置元數(shù)據(jù)來接收對象進行實例化,配置和組裝的指令。該元數(shù)據(jù)可以通過 XML,Java 注解或 Java 代碼提供。 2.2. 什么是依賴注入? 在依賴注入中,您不必創(chuàng)建對象,但必須描述如何創(chuàng)建它們。您不是直接在代碼中將組件和服務(wù)連接在一起,而是描述配置文件中哪些組件需要哪些服務(wù)。由 IoC 容器將它們裝配在一起。 2.3. 可以通過多少種方式完成依賴注入? 通常,依賴注入可以通過三種方式完成,即:
在 Spring Framework 中,僅使用構(gòu)造函數(shù)和 setter 注入。 2.4. 區(qū)分構(gòu)造函數(shù)注入和 setter 注入。 構(gòu)造函數(shù)注入setter 注入沒有部分注入有部分注入不會覆蓋 setter 屬性會覆蓋 setter 屬性任意修改都會創(chuàng)建一個新實例任意修改不會創(chuàng)建一個新實例適用于設(shè)置很多屬性適用于設(shè)置少量屬性 2.5. spring 中有多少種 IOC 容器?
2.6. 區(qū)分 BeanFactory 和 ApplicationContext。 BeanFactoryApplicationContext它使用懶加載它使用即時加載它使用語法顯式提供資源對象它自己創(chuàng)建和管理資源對象不支持國際化支持國際化不支持基于依賴的注解支持基于依賴的注解 2.7. 列舉 IoC 的一些好處。 IoC 的一些好處是:
2.8. Spring IoC 的實現(xiàn)機制。 Spring 中的 IoC 的實現(xiàn)原理就是工廠模式加反射機制。 示例: 3. Beans3.1. 什么是 spring bean?
3.2. spring 提供了哪些配置方式?
bean 所需的依賴項和服務(wù)在 XML 格式的配置文件中指定。這些配置文件通常包含許多 bean 定義和特定于應(yīng)用程序的配置選項。它們通常以 bean 標(biāo)簽開頭。例如:
您可以通過在相關(guān)的類,方法或字段聲明上使用注解,將 bean 配置為組件類本身,而不是使用 XML 來描述 bean 裝配。默認(rèn)情況下,Spring 容器中未打開注解裝配。因此,您需要在使用它之前在 Spring 配置文件中啟用它。例如:
Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現(xiàn)。
例如: @Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } } 復(fù)制代碼 3.3. spring 支持集中 bean scope? Spring bean 支持 5 種 scope:
僅當(dāng)用戶使用支持 Web 的 ApplicationContext 時,最后三個才可用。 3.4. spring bean 容器的生命周期是什么樣的? spring bean 容器的生命周期流程如下:
3.5. 什么是 spring 的內(nèi)部 bean? 只有將 bean 用作另一個 bean 的屬性時,才能將 bean 聲明為內(nèi)部 bean。為了定義 bean,Spring 的基于 XML 的配置元數(shù)據(jù)在 例如,假設(shè)我們有一個 Student 類,其中引用了 Person 類。這里我們將只創(chuàng)建一個 Person 類實例并在 Student 中使用它。 Student.java public class Student { private Person person; //Setters and Getters } public class Person { private String name; private String address; //Setters and Getters } bean.xml 3.6. 什么是 spring 裝配? 當(dāng) bean 在 Spring 容器中組合在一起時,它被稱為裝配或 bean 裝配。 Spring 容器需要知道需要什么 bean 以及容器應(yīng)該如何使用依賴注入來將 bean 綁定在一起,同時裝配 bean。 3.7. 自動裝配有哪些方式? Spring 容器能夠自動裝配 bean。也就是說,可以通過檢查 BeanFactory 的內(nèi)容讓 Spring 自動解析 bean 的協(xié)作者。 自動裝配的不同模式: no byName byType 構(gòu)造函數(shù) autodetect 3.8. 自動裝配有什么局限? 4.1. 什么是基于注解的容器配置? 不使用 XML 來描述 bean 裝配,開發(fā)人員通過在相關(guān)的類,方法或字段聲明上使用注解將配置移動到組件類本身。它可以作為 XML 設(shè)置的替代方案。例如: Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現(xiàn)。 例如: @Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } } 復(fù)制代碼 4.2. 如何在 spring 中啟動注解裝配? 默認(rèn)情況下,Spring 容器中未打開注解裝配。因此,要使用基于注解裝配,我們必須通過配置 4.3. @Component, @Controller, @Repository, @Service 有何區(qū)別? 4.4. @Required 注解有什么用? @Required 應(yīng)用于 bean 屬性 setter 方法。此注解僅指示必須在配置時使用 bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性。如果尚未填充受影響的 bean 屬性,則容器將拋出 BeanInitializationException。 示例: public class Employee { private String name; @Required public void setName(String name){ this.name=name; } public string getName(){ return name; } } 復(fù)制代碼 4.5. @Autowired 注解有什么用? @Autowired 可以更準(zhǔn)確地控制應(yīng)該在何處以及如何進行自動裝配。此注解用于在 setter 方法,構(gòu)造函數(shù),具有任意名稱或多個參數(shù)的屬性或方法上自動裝配 bean。默認(rèn)情況下,它是類型驅(qū)動的注入。 public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName(){ return name; } } 復(fù)制代碼 4.6. @Qualifier 注解有什么用? 當(dāng)您創(chuàng)建多個相同類型的 bean 并希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 注解和 @Autowired 通過指定應(yīng)該裝配哪個確切的 bean 來消除歧義。 例如,這里我們分別有兩個類,Employee 和 EmpAccount。在 EmpAccount 中,使用@Qualifier 指定了必須裝配 id 為 emp1 的 bean。 Employee.java public class Employee { private String name; @Autowired public void setName(String name) { this.name=name; } public string getName() { return name; } } EmpAccount.java public class EmpAccount { private Employee emp; @Autowired @Qualifier(emp1) public void showName() { System.out.println(“Employee name : ”+emp.getName); } } 復(fù)制代碼 4.7. @RequestMapping 注解有什么用? @RequestMapping 注解用于將特定 HTTP 請求方法映射到將處理相應(yīng)請求的控制器中的特定類/方法。此注釋可應(yīng)用于兩個級別: 如果需要Java工程化、高性能及分布式、微服務(wù)、Spring,MyBatis,Netty源碼分析資料的朋友可以加Java進階群:838498680群里有阿里大牛直播講解技術(shù),以及大型互聯(lián)網(wǎng)公司架構(gòu)技術(shù)的視頻免費分享給大家。 5.1. spring DAO 有什么用? Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數(shù)據(jù)訪問技術(shù)更容易以一種統(tǒng)一的方式工作。這使得用戶容易在持久性技術(shù)之間切換。它還允許您在編寫代碼時,無需考慮捕獲每種技術(shù)不同的異常。 5.2. 列舉 Spring DAO 拋出的異常。 5.3. spring JDBC API 中存在哪些類? 5.4. 使用 Spring 訪問 Hibernate 的方法有哪些? 我們可以通過兩種方式使用 Spring 訪問 Hibernate: 5.5. 列舉 spring 支持的事務(wù)管理類型 Spring 支持兩種類型的事務(wù)管理: 5.6. spring 支持哪些 ORM 框架? 6.1. 什么是 AOP? AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 面向?qū)ο缶幊? 相輔相成, 提供了與 OOP 不同的抽象軟件結(jié)構(gòu)的視角. 在 OOP 中, 我們以類(class)作為我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面) 6.2. 什么是 Aspect? aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負(fù)責(zé)實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中. AOP 的工作重心在于如何將增強編織目標(biāo)對象的連接點上, 這里包含兩個工作: 可以簡單地認(rèn)為, 使用 @Aspect 注解的類就是切面. 6.3. 什么是切點(JoinPoint) 程序運行中的一些時間點, 例如一個方法的執(zhí)行, 或者是一個異常的處理. 在 Spring AOP 中, join point 總是方法的執(zhí)行點。 6.4. 什么是通知(Advice)? 特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice。Spring AOP 使用一個 Advice 作為攔截器,在 JoinPoint “周圍”維護一系列的攔截器。 6.5. 有哪些類型的通知(Advice)? Before After Returning After Throwing After (finally) Around 6.6. 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處 concern 是我們想要在應(yīng)用程序的特定模塊中定義的行為。它可以定義為我們想要實現(xiàn)的功能。 cross-cutting concern 是一個適用于整個應(yīng)用的行為,這會影響整個應(yīng)用程序。例如,日志記錄,安全性和數(shù)據(jù)傳輸是應(yīng)用程序幾乎每個模塊都需要關(guān)注的問題,因此它們是跨領(lǐng)域的問題。 6.7. AOP 有哪些實現(xiàn)方式 實現(xiàn) AOP 的技術(shù),主要分為兩大類: 6.8. Spring AOP and AspectJ AOP 有什么區(qū)別? Spring AOP 基于動態(tài)代理方式實現(xiàn);AspectJ 基于靜態(tài)代理方式實現(xiàn)。 Spring AOP 僅支持方法級別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut。 6.9. 如何理解 Spring 中的代理? 將 Advice 應(yīng)用于目標(biāo)對象后創(chuàng)建的對象稱為代理。在客戶端對象的情況下,目標(biāo)對象和代理對象是相同的。 Advice + Target Object = Proxy 6.10. 什么是編織(Weaving)? 為了創(chuàng)建一個 advice 對象而鏈接一個 aspect 和其它應(yīng)用類型或?qū)ο螅Q為編織(Weaving)。在 Spring AOP 中,編織在運行時執(zhí)行。請參考下圖: 7.1. Spring MVC 框架有什么用? Spring Web MVC 框架提供 模型-視圖-控制器 架構(gòu)和隨時可用的組件,用于開發(fā)靈活且松散耦合的 Web 應(yīng)用程序。 MVC 模式有助于分離應(yīng)用程序的不同方面,如輸入邏輯,業(yè)務(wù)邏輯和 UI 邏輯,同時在所有這些元素之間提供松散耦合。 7.2. 描述一下 DispatcherServlet 的工作流程 DispatcherServlet 的工作流程可以用一幅圖來說明: -servlet.xml 7.3. 介紹一下 WebApplicationContext WebApplicationContext 是 ApplicationContext 的擴展。它具有 Web 應(yīng)用程序所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關(guān)聯(lián)的能力方面有所不同。 |
|