1. 程式人生 > >javaSpring面試題,安排

javaSpring面試題,安排

種類 屬性 ESS 階段 動作 自動調用 情況下 framework exp

收藏一些關於Spring框架的面試題,一方面是為了準備找工作的時候看面試題,另一方面,通過面試題的方式加深一些自己的框架的理論知識。

Beans
spring中Bean的作用域
singleton:
prototype:
request:
session:
global Session:
spring中Bean的生命周期
什麽是 spring bean?
spring 提供了哪些配置方式?
什麽是 spring 的內部 bean?
自動裝配有哪些方式
自動裝配有什麽局限
Spring中依賴註入方式
Spring Framework 中的模塊
Spring 應用程序的組件
Spring IOC 容器
spring 中的兩種 IOC 容器

IoC 的一些好處
Spring IoC 的實現機制
註解
基於註解的容器配置
如何在 spring 中啟動註解裝配?
@Component, @Controller, @Repository, @Service 有何區別?
@Required 註解有什麽用?
@Qualifier 註解有什麽用?
@RequestMapping 註解有什麽用?
數據訪問
spring DAO 有什麽用?
Spring DAO 拋出的異常
spring JDBC API 中存在哪些類?
spring 支持的事務管理類型
spring 支持哪些 ORM 框架
AOP
Aspect
切點(JoinPoint)
通知(Advice)
有哪些類型的通知(Advice)?
AOP 有哪些實現方式?
Spring AOP and AspectJ AOP 有什麽區別?
WebApplicationContext
Beans
spring中Bean的作用域
singleton:
Spring IoC容器中只會存在一個共享的Bean實例,無論有多少個Bean引用它,始終指向同一對象。Singleton作用域是Spring中的缺省作用域。

prototype:
每次通過Spring容器獲取prototype定義的bean時,容器都將創建一個新的Bean實例,每個Bean實例都有自己的屬性和狀態,而singleton全局只有一個對象。

request:
在一次Http請求中,容器會返回該Bean的同一實例。而對不同的Http請求則會產生新的Bean,而且該bean僅在當前Http Request內有效。

session:
在一次Http Session中,容器會返回該Bean的同一實例。而對不同的Session請求則會創建新的實例,該bean實例僅在當前Session內有效。

global Session:
在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。

spring中Bean的生命周期
實例化一個Bean,也就是我們通常說的new。
按照Spring上下文對實例化的Bean進行配置,也就是IOC註入。
如果這個Bean實現了BeanNameAware接口,會調用它實現的setBeanName(String beanId)方法,此處傳遞的是Spring配置文件中Bean的ID。
如果這個Bean實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(),傳遞的是Spring工廠本身(可以用這個方法獲取到其他Bean)。
如果這個Bean實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文。
如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時調用After方法,也可用於內存或緩存技術。
如果這個Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。
如果這個Bean關聯了BeanPostProcessor接口,將會調用postAfterInitialization(Object obj, String s)方法。
當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean接口,會調用其實現的destroy方法。
最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷毀方法。
什麽是 spring bean?
它們是構成用戶應用程序主幹的對象。
Bean 由 Spring IoC 容器管理。
它們由 Spring IoC 容器實例化,配置,裝配和管理。
Bean 是基於用戶提供給容器的配置元數據創建。
spring 提供了哪些配置方式?
基於 xml 配置

bean 所需的依賴項和服務在 XML 格式的配置文件中指定。這些配置文件通常包含許多 bean 定義和特定於應用程序的配置選項。它們通常以 bean 標簽開頭。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
<property name="name" value="Edureka"></property>
</bean>
基於註解配置

可以通過在相關的類,方法或字段聲明上使用註解,將 bean 配置為組件類本身,而不是使用 XML 來描述 bean 裝配。默認情況下,Spring 容器中未打開註解裝配。因此,您需要在使用它之前在 Spring 配置文件中啟用它。例如:

<beans>
<context:annotation-config/>

基於 Java API 配置 Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現。 @Bean 註解扮演與 元素相同的角色。 @Configuration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關系。 @Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } } 什麽是 spring 的內部 bean? 只有將 bean 用作另一個 bean 的屬性時,才能將 bean 聲明為內部 bean。為了定義 bean,Spring 的基於 XML 的配置元數據在 或 中提供了 元素的使用。內部 bean 總是匿名的,它們總是作為原型。 例如,假設我們有一個 Student 類,其中引用了 Person 類。這裏我們將只創建一個 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 自動裝配有哪些方式 Spring 容器能夠自動裝配 bean。也就是說,可以通過檢查 BeanFactory 的內容讓 Spring 自動解析 bean 的協作者。 自動裝配的不同模式: no - 這是默認設置,表示沒有自動裝配。應使用顯式 bean 引用進行裝配。 byName - 它根據 bean 的名稱註入對象依賴項。它匹配並裝配其屬性與 XML 文件中由相同名稱定義的 bean。 byType - 它根據類型註入對象依賴項。如果屬性的類型與 XML 文件中的一個 bean 名稱匹配,則匹配並裝配屬性。 構造函數 - 它通過調用類的構造函數來註入依賴項。它有大量的參數。 autodetect - 首先容器嘗試通過構造函數使用 autowire 裝配,如果不能,則嘗試通過 byType 自動裝配。 自動裝配有什麽局限 覆蓋的可能性 - 您始終可以使用 和 設置指定依賴項,這將覆蓋自動裝配。 基本元數據類型 - 簡單屬性(如原數據類型,字符串和類)無法自動裝配。 令人困惑的性質 - 總是喜歡使用明確的裝配,因為自動裝配不太精確。 Spring中依賴註入方式 * 三種註入方式為:構造方法註入和設值註入以及接口註入 * 在 Spring Framework 中,僅使用構造函數和 setter 註入。 設值註入與傳統的JavaBean的寫法更相似,程序員更容易理解、接受,通過setter方式設定依賴關系顯得更加直觀、明顯; 對於復雜的依賴關系,如果采用構造註入,會導致構造器過於臃腫,難以閱讀。 Spring在創建Bean實例時,需要同時實例化其依賴的全部實例,因而會產生浪費。而使用設置註入,則避免這下問題; 在某些屬性可選的情況下,多參數的構造器更加笨拙,官方更鼓勵使用設值註入。 構造註入可以在構造器中決定依賴關系的註入順序,優先依賴的優先註入。 對於依賴關系無須變化的Bean,構造註入更有用處,因為沒有setter方法,所有的依賴關系全部在構造器內設定,因此,不用擔心後續代碼對依賴關系的破壞。 構造註入使依賴關系只能在構造器中設定,則只有組件的創建者才能改變組件的依賴關系。對組件的調用者而言,組件內部的依賴關系完全透明,更符合高內聚的原則。 javaSpring面試題,安排 Spring Framework 中的模塊 javaSpring面試題,安排 Spring 核心容器 – 該層基本上是 Spring Framework 的核心。它包含以下模塊: Spring Core Spring Bean SpEL (Spring Expression Language) Spring Context 數據訪問/集成 – 該層提供與數據庫交互的支持。它包含以下模塊: JDBC (Java DataBase Connectivity) ORM (Object Relational Mapping) OXM (Object XML Mappers) JMS (Java Messaging Service) Transaction Web – 該層提供了創建 Web 應用程序的支持。它包含以下模塊: Web Web – Servlet Web – Socket Web – Portlet AOP – 該層支持面向切面編程 Instrumentation – 該層為類檢測和類加載器實現提供支持。 Test – 該層為使用 JUnit 和 TestNG 進行測試提供支持。 Spring 應用程序的組件 Spring 應用一般有以下組件: 接口 - 定義功能。 Bean 類 - 它包含屬性,setter 和 getter 方法,函數等。 Spring 面向切面編程(AOP) - 提供面向切面編程的功能。 Bean 配置文件 - 包含類的信息以及如何配置它們。 用戶程序 - 它使用接口。 Spring IOC 容器 Spring 框架的核心是 Spring 容器。容器創建對象,將它們裝配在一起,配置它們並管理它們的完整生命周期。Spring 容器使用依賴註入來管理組成應用程序的組件。容器通過讀取提供的配置元數據來接收對象進行實例化,配置和組裝的指令。該元數據可以通過 XML,Java 註解或 Java 代碼提供。 javaSpring面試題,安排 spring 中的兩種 IOC 容器 BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類。它會在客戶端要求時實例化 bean。 ApplicationContext - ApplicationContext 接口擴展了 BeanFactory 接口。它在 BeanFactory 基礎上提供了一些額外的功能。 javaSpring面試題,安排 IoC 的一些好處 它將最小化應用程序中的代碼量。 它將使您的應用程序易於測試,因為它不需要單元測試用例中的任何單例或 JNDI 查找機制。 它以最小的影響和最少的侵入機制促進松耦合。 它支持即時的實例化和延遲加載服務。 Spring IoC 的實現機制 Spring 中的 IoC 的實現原理就是工廠模式加反射機制。 interface Fruit { public abstract void eat(); } class Apple implements Fruit { public void eat(){ System.out.println("Apple"); } } class Orange implements Fruit { public void eat(){ System.out.println("Orange"); } } class Factory { public static Fruit getInstance(String ClassName) { Fruit f=null; try { f=(Fruit)Class.forName(ClassName).newInstance(); } catch (Exception e) { e.printStackTrace(); } return f; } } class Client { public static void main(String[] a) { Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple"); if(f!=null){ f.eat(); } } } 註解 基於註解的容器配置 不使用 XML 來描述 bean 裝配,開發人員通過在相關的類,方法或字段聲明上使用註解將配置移動到組件類本身。它可以作為 XML 設置的替代方案。例如: Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現。 @Bean 註解扮演與元素相同的角色。 @Configuration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關系。 @Configuration public class StudentConfig { @Bean public StudentBean myStudent() { return new StudentBean(); } } 如何在 spring 中啟動註解裝配? 默認情況下,Spring 容器中未打開註解裝配。因此,要使用基於註解裝配,我們必須通過配置 @Component, @Controller, @Repository, @Service 有何區別? @Component:這將 java 類標記為 bean。它是任何 Spring 管理組件的通用構造型。spring 的組件掃描機制現在可以將其拾取並將其拉入應用程序環境中。 @Controller:這將一個類標記為 Spring Web MVC 控制器。標有它的 Bean 會自動導入到 IoC 容器中。 @Service:此註解是組件註解的特化。它不會對 @Component 註解提供任何其他行為。您可以在服務層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖。 @Repository:這個註解是具有類似用途和功能的 @Component 註解的特化。它為 DAO 提供了額外的好處。它將 DAO 導入 IoC 容器,並使未經檢查的異常有資格轉換為 Spring DataAccessException。 @Required 註解有什麽用? @Required 應用於 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; } } @Qualifier 註解有什麽用? 當您創建多個相同類型的 bean 並希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 註解和 @Autowired 通過指定應該裝配哪個確切的 bean 來消除歧義。 @RequestMapping 註解有什麽用? @RequestMapping 註解用於將特定 HTTP 請求方法映射到將處理相應請求的控制器中的特定類/方法。此註釋可應用於兩個級別: 類級別:映射請求的 URL 方法級別:映射 URL 以及 HTTP 請求方法 數據訪問 spring DAO 有什麽用? Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數據訪問技術更容易以一種統一的方式工作。這使得用戶容易在持久性技術之間切換。它還允許您在編寫代碼時,無需考慮捕獲每種技術不同的異常。 Spring DAO 拋出的異常 javaSpring面試題,安排 spring JDBC API 中存在哪些類? JdbcTemplate SimpleJdbcTemplate NamedParameterJdbcTemplate SimpleJdbcInsert SimpleJdbcCall spring 支持的事務管理類型 Spring 支持兩種類型的事務管理: 程序化事務管理:在此過程中,在編程的幫助下管理事務。它為您提供極大的靈活性,但維護起來非常困難。 聲明式事務管理:在此,事務管理與業務代碼分離。僅使用註解或基於 XML 的配置來管理事務。 spring 支持哪些 ORM 框架 Hibernate iBatis JPA JDO OJB AOP Aspect aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負責實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中. AOP 的工作重心在於如何將增強編織目標對象的連接點上, 這裏包含兩個工作: 如何通過 pointcut 和 advice 定位到特定的 joinpoint 上 如何在 advice 中編寫切面代碼. 使用 @Aspect 註解的類就是切面. 切點(JoinPoint) 程序運行中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理. 在 Spring AOP 中, join point 總是方法的執行點。 通知(Advice) 特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice。Spring AOP 使用一個 Advice 作為攔截器,在 JoinPoint “周圍”維護一系列的攔截器。 有哪些類型的通知(Advice)? Before - 這些類型的 Advice 在 joinpoint 方法之前執行,並使用 @Before 註解標記進行配置。 After Returning - 這些類型的 Advice 在連接點方法正常執行後執行,並使用@AfterReturning 註解標記進行配置。 After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出並使用 @AfterThrowing 註解標記配置時執行。 After (finally) - 這些類型的 Advice 在連接點方法之後執行,無論方法退出是正常還是異常返回,並使用 @After 註解標記進行配置。 Around - 這些類型的 Advice 在連接點之前和之後執行,並使用 @Around 註解標記進行配置。 AOP 有哪些實現方式? 實現 AOP 的技術,主要分為兩大類: 靜態代理 - 指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強;[①:編譯時編織(特殊編譯器實現)②:類加載時編織(特殊的類加載器實現)] 動態代理 - 在運行時在內存中“臨時”生成 AOP 動態代理類,因此也被稱為運行時增強。[①:JDK 動態代理 ②:CGLIB] Spring AOP and AspectJ AOP 有什麽區別? Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。 Spring AOP 僅支持方法級別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut。 WebApplicationContext WebApplicationContext 是 ApplicationContext 的擴展。它具有 Web 應用程序所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關聯的能力方面有所不同。

javaSpring面試題,安排