2020 最新Spring面試題

Spring面試題

1、不同版本的 Spring Framework 有哪些主要功能?

Version Feature
Spring 2.5 發佈於 2007 年。這是第一個支持註解的版本。
Spring 3.0 發佈於 2009 年。它完全利用了 Java5 中的改進,併爲 JEE6 提供了支 持
Spring 4.0 發佈於 2013 年。這是第一個完全支持 JAVA8 的版本。
Spring 5.0 Spring Framework 5.0的最大特點之一是響應式編程(Reactive Programming)。 響應式編程核心功能和對響應式endpoints的支持可通過Spring Framework 5.0中獲得。

2、什麼是 Spring Framework?

Spring 是一個開源應用框架,旨在降低應用程序開發的複雜度。它是輕量級、鬆散耦合的。它具有分層體系結構,允許用戶選擇組件,同時還爲 J2EE 應用程序開發提供了一個有凝聚力的框架。它可以集成其他框架,如 Structs、Hibernate、EJB 等,所以又稱爲框架的框架。

3、列舉 Spring Framework 的優點。

由於 Spring Frameworks 的分層架構,用戶可以自由選擇自己需要的組件。Spring Framework 支持 POJO(Plain Old Java Object) 編程,從而具備持續集成和可測試性。由於依賴注入和控制反轉,JDBC 得以簡化。它是開源免費的。

4、Spring Framework 有哪些不同的功能?

輕量級 - Spring 在代碼量和透明度方面都很輕便。IOC - 控制反轉 AOP - 面向切面編程可以將應用業務邏輯和系統服務分離,以實現高內聚。容器 - Spring 負責創建和管理對象(Bean)的生命週期和配置。MVC - 對 web 應用提供了高度可配置性,其他框架的集成也十分方便。事務管理 - 提供了用於事務管理的通用抽象層。Spring 的事務支持也可用於容器較少的環境。JDBC 異常 - Spring的 JDBC 抽象層提供了一個異常層次結構,簡化了錯誤處理策略。

5、Spring Framework 中有多少個模塊,它們分別是什麼?

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 進行測試提供支持。

幾個雜項模塊:

Messaging – 該模塊爲 STOMP 提供支持。它還支持註解編程模型,該模型用於從 WebSocket 客戶端路由和處理 STOMP 消息。Aspects – 該模塊爲與 AspectJ 的集成提供支持。

6、什麼是 Spring 配置文件?

Spring 配置文件是 XML 文件。該文件主要包含類信息。它描述了這些類是如何配置以及相互引入的。但是,XML 配置文件冗長且更加乾淨。如果沒有正確規劃和編寫,那麼在大項目中管理變得非常困難

7、Spring 應用程序有哪些不同組件?

Spring 應用一般有以下組件:
 接口 - 定義功能。
 Bean 類 - 它包含屬性,setter 和 getter 方法,函數等。
 Spring 面向切面編程(AOP) - 提供面向切面編程的功能。
 Bean 配置文件 - 包含類的信息以及如何配置它們。
 用戶程序 - 它使用接口。

8、使用 Spring 有哪些方式?

使用 Spring 有以下方式:
 作爲一個成熟的 Spring Web 應用程序。

作爲第三方 Web 框架,使用 Spring Frameworks 中間層。
 用於遠程使用。
 作爲企業級 Java Bean,它可以包裝現有的 POJO(Plain Old Java Objects)。

9、什麼是 Spring IOC 容器?

Spring 框架的核心是 Spring 容器。容器創建對象,將它們裝配在一起,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程序的組件。容器通過讀取提供的配置元數據來接收對象進行實例化,配置和組裝的指令。該元數據可以通過 XML,Java 註解或 Java 代碼提供。

10、什麼是依賴注入?

在依賴注入中,您不必創建對象,但必須描述如何創建它們。您不是直接在代碼中將組件和服務連接在一起,而是描述配置文件中哪些組件需要哪些服務。由 IoC容器將它們裝配在一起。

11、可以通過多少種方式完成依賴注入?

通常,依賴注入可以通過三種方式完成,即:
 構造函數注入
 setter 注入
 接口注入
在 Spring Framework 中,僅使用構造函數和 setter 注入。

12、區分構造函數注入和 setter 注入

構造函數注入 setter 注入
沒有部分注入 有部分注入
不會覆蓋 setter 屬性 會覆蓋 setter 屬性
任意修改都會創建一個新實例 任意修改不會創建一個新實例
適用於設置很多屬性 適用於設置少量屬性

13、spring 中有多少種 IOC 容器?

BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類。它會在客戶端要求時實例化 bean。
ApplicationContext - ApplicationContext 接口擴展了 BeanFactory 接口。它在 BeanFactory 基礎上提供了一些額外的功能。

14、區分 BeanFactory 和 ApplicationContext。

BeanFactory ApplicationContext
它使用懶加載 它使用即時加載
它使用語法顯式提供資源對象 它自己創建和管理資源對象
不支持國際化 支持國際化
不支持基於依賴的註解 支持基於依賴的註解

15、列舉 IoC 的一些好處。

IoC 的一些好處是:
 它將最小化應用程序中的代碼量。
 它將使您的應用程序易於測試,因爲它不需要單元測試用例中的任何單例或 JNDI 查找機制。
 它以最小的影響和最少的侵入機制促進松耦合。
 它支持即時的實例化和延遲加載服務。

16、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();
		}
	}
}

17、什麼是 spring bean?

 它們是構成用戶應用程序主幹的對象。
 Bean 由 Spring IoC 容器管理。
 它們由 Spring IoC 容器實例化,配置,裝配和管理。
 Bean 是基於用戶提供給容器的配置元數據創建。

18、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/>
    <!-- bean definitions go here -->
</beans>

基於 Java API 配置
Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現。
1、 @Bean 註解扮演與 元素相同的角色。
2、 @Configuration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關係。

例如:

@Configuration
public class StudentConfig {
    @Bean
    public StudentBean myStudent() {
    	return new StudentBean();
    }
}

19、spring 支持集中 bean scope?

Spring bean 支持 5 種 scope:
Singleton - 每個 Spring IoC 容器僅有一個單實例。Prototype - 每次請求都會產生一個新的實例。Request - 每一次 HTTP 請求都會產生一個新的實例,並且該 bean 僅在當前 HTTP 請求內有效。Session - 每一次 HTTP 請求都會產生一個新的 bean,同時該 bean 僅在當前 HTTP session 內有效。Global-session - 類似於標準的 HTTP Session 作用域,不過它僅僅在基於portlet 的 web 應用中才有意義。Portlet 規範定義了全局 Session 的概念,
它被所有構成某個 portlet web 應用的各種不同的 portlet 所共享。在 globalsession 作用域中定義的 bean 被限定於全局 portlet Session 的生命週期範圍內。如果你在 web 中使用 global session 作用域來標識 bean,那麼 web會自動當成 session 類型來使用。

僅當用戶使用支持 Web 的 ApplicationContext 時,最後三個纔可用。

20、spring bean 容器的生命週期是什麼樣的?

spring bean 容器的生命週期流程如下:
1、Spring 容器根據配置中的 bean 定義中實例化 bean。

2、Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置。

3、如果 bean 實現BeanNameAware 接口,則工廠通過傳遞 bean 的 ID 來調用setBeanName()。

4、如果 bean 實現 BeanFactoryAware 接口,工廠通過傳遞自身的實例來調用 setBeanFactory()。

5、如果存在與 bean 關聯的任何BeanPostProcessors,則調用 preProcessBeforeInitialization() 方法。

6、如果爲 bean 指定了 init 方法( 的 init-method 屬性),那麼將調用它。

7、最後,如果存在與 bean 關聯的任何 BeanPostProcessors,則將調用 postProcessAfterInitialization() 方法。8、如果 bean 實現DisposableBean 接口,當 spring 容器關閉時,會調用 destory()。

9、如果爲bean 指定了 destroy 方法( 的 destroy-method 屬性),那麼將調用它。

21、什麼是 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

<bean id=“StudentBean" class="com.edureka.Student">
    <property name="person">
   	 	<!--This is inner bean -->
        <bean class="com.edureka.Person">
        <property name="name" value=“Scott"></property>
        <property name="address" value=
        “Bangalore"></property>
        </bean>
	</property>
</bean>

22、什麼是 spring 裝配

當 bean 在 Spring 容器中組合在一起時,它被稱爲裝配或 bean 裝配。Spring容器需要知道需要什麼 bean 以及容器應該如何使用依賴注入來將 bean 綁定在一起,同時裝配 bean。

23、自動裝配有哪些方式?

Spring 容器能夠自動裝配 bean。也就是說,可以通過檢查 BeanFactory 的內容讓 Spring 自動解析 bean 的協作者。
自動裝配的不同模式:
no - 這是默認設置,表示沒有自動裝配。應使用顯式 bean 引用進行裝配。byName - 它根據 bean 的名稱注入對象依賴項。它匹配並裝配其屬性與 XML文件中由相同名稱定義的 bean。byType - 它根據類型注入對象依賴項。如果屬性的類型與 XML 文件中的一個 bean 名稱匹配,則匹配並裝配屬性。構造函數- 它通過調用類的構造函數來注入依賴項。它有大量的參數。autodetect - 首先容器嘗試通過構造函數使用 autowire 裝配,如果不能,則嘗試通過 byType 自動裝配

24、自動裝配有什麼侷限?

覆蓋的可能性 - 您始終可以使用 和 設置指定依賴項,這將覆蓋自動裝配。基本元數據類型 - 簡單屬性(如原數據類型,字符串和類)無法自動裝配。令人困惑的性質 - 總是喜歡使用明確的裝配,因爲自動裝配不太精確。

25、什麼是基於註解的容器配置

不使用 XML 來描述 bean 裝配,開發人員通過在相關的類,方法或字段聲明上使用註解將配置移動到組件類本身。它可以作爲 XML 設置的替代方案。例如:Spring 的 Java 配置是通過使用 @Bean 和 @Configuration 來實現。 @Bean 註解扮演與 元素相同的角色。 @Configuration 類允許通過簡單地調
用同一個類中的其他 @Bean 方法來定義 bean 間依賴關係。
例如

@Configuration
public class StudentConfig {
    @Bean
    public StudentBean myStudent() {
    	return new StudentBean();
    }
}

26、如何在 spring 中啓動註解裝配?

默認情況下,Spring 容器中未打開註解裝配。因此,要使用基於註解裝配,我們必須通過配置 <context:annotation-config/> 元素在 Spring 配置文件中啓用它。

27、@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。

28、@Required 註解有什麼用?

@Required 應用於 bean 屬性 setter 方法。此註解僅指示必須在配置時使用bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性。如果尚未填充受影響的 bean 屬性,則容器將拋出 eanInitializationException。

示例:

public class Employee {
    private String name;
    @Required
    public void setName(String name){
    	this.name=name;
    } 
    public string getName(){
    	return name;
    }
}

29、@Autowired 註解有什麼用?

@Autowired 可以更準確地控制應該在何處以及如何進行自動裝配。此註解用於在 setter 方法,構造函數,具有任意名稱或多個參數的屬性或方法上自動裝配bean。默認情況下,它是類型驅動的注入。

public class Employee {
    private String name;
    @Autowired
    public void setName(String name) {
    	this.name=name;
    } 
    public string getName(){
    	return name;
    }
}

30、@Qualifier 註解有什麼用?

當您創建多個相同類型的 bean 並希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 註解和 @Autowired 通過指定應該裝配哪個確切的 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);
    }
}

31、@RequestMapping 註解有什麼用?

@RequestMapping 註解用於將特定 HTTP 請求方法映射到將處理相應請求的
控制器中的特定類/方法。此註釋可應用於兩個級別:
類級別:映射請求的 URL 方法級別:映射 URL 以及 HTTP 請求方法

32、spring DAO 有什麼用?

Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數據訪問技術更容易以一種統一的方式工作。這使得用戶容易在持久性技術之間切換。它還允許您在編寫代碼時,無需考慮捕獲每種技術不同的異常。

33、列舉 Spring DAO 拋出的異常。

34、spring JDBC API 中存在哪些類?

 JdbcTemplate
 SimpleJdbcTemplate
 NamedParameterJdbcTemplate
 SimpleJdbcInsert

 SimpleJdbcCall

35、使用 Spring 訪問 Hibernate 的方法有哪些?

我們可以通過兩種方式使用 Spring 訪問 Hibernate:
1、 使用 Hibernate 模板和回調進行控制反轉
2、 擴展 HibernateDAOSupport 並應用 AOP 攔截器節點

36、列舉 spring 支持的事務管理類型

Spring 支持兩種類型的事務管理:
1、 程序化事務管理:在此過程中,在編程的幫助下管理事務。它爲您提供極大的靈活性,但維護起來非常困難。
2、 聲明式事務管理:在此,事務管理與業務代碼分離。僅使用註解或基於 XML的配置來管理事務。

37、spring 支持哪些 ORM 框架

 Hibernate
 iBatis
 JPA
 JDO
 OJB

38、什麼是 AOP?

AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與OOP( Object-Oriented Programming, 面向對象編程) 相輔相成, 提供了與OOP 不同的抽象軟件結構的視角. 在 OOP 中, 我們以類(class)作爲我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)

39、什麼是 Aspect?

aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負責實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中. AOP 的工作重心在於如何將增強編織目標對象的連接點上, 這裏包含兩個工作:
1、如何通過 pointcut 和 advice 定位到特定的 joinpoint 上

2、如何在advice 中編寫切面代碼.

以簡單地認爲, 使用 @Aspect 註解的類就是切面.

40、什麼是切點(JoinPoint)

程序運行中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理.在 Spring AOP 中, join point 總是方法的執行點。

41、什麼是通知(Advice)?

特定 JoinPoint 處的 Aspect 所採取的動作稱爲 Advice。Spring AOP 使用一個 Advice 作爲攔截器,在 JoinPoint “周圍”維護一系列的攔截器。

42、有哪些類型的通知(Advice)?

 Before - 這些類型的 Advice 在 joinpoint 方法之前執行,並使用@Before 註解標記進行配置。
 After Returning - 這些類型的 Advice 在連接點方法正常執行後執行,並使用@AfterReturning 註解標記進行配置。
 After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出並使用 @AfterThrowing 註解標記配置時執行。
 After (finally) - 這些類型的 Advice 在連接點方法之後執行,無論方法退出是正常還是異常返回,並使用 @After 註解標記進行配置。
 Around - 這些類型的 Advice 在連接點之前和之後執行,並使用@Around 註解標記進行配置。

43、指出在 spring aop 中 concern 和 cross-cuttingconcern 的不同之處。

concern 是 我 們 想 要 在 應 用 程 序 的 特 定 模 塊 中 定 義 的 行 爲 。 它 可 以 定 義 爲 我 們 想要 實 現 的 功 能 。

cross-cutting concern 是 一 個 適 用 於 整 個 應 用 的 行 爲 , 這 會 影 響 整 個 應 用 程 序 。例 如 ,日 志 記 錄 ,安 全 性 和 數 據 傳 輸 是 應 用 程 序 幾 乎 每 個 模 塊 都 需 要 關 注 的 問 題 ,因 此 它 們 是 跨 領 域 的 問 題

44、AOP 有哪些實現方式?

實 現 AOP 的 技 術 , 主 要 分 爲 兩 大 類 :

靜態代理
指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱爲編譯時增強;
 編譯時編織(特殊編譯器實現)
 類加載時編織(特殊的類加載器實現)。
動態代理
在運行時在內存中“臨時”生成 AOP 動態代理類,因此也被稱爲運行時增強。
 JDK 動態代理
 CGLIB

45、Spring AOP and AspectJ AOP 有什麼區別?

Spring AOP 基於動態代理方式實現;AspectJ 基於靜態代理方式實現。SpringAOP 僅支持方法級別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut。

46、如何理解 Spring 中的代理?

將 Advice 應用於目標對象後創建的對象稱爲代理。在客戶端對象的情況下,目標對象和代理對象是相同的。

Advice + Target Object = Proxy

47、什麼是編織(Weaving)?

爲了創建一個 advice 對象而鏈接一個 aspect 和其它應用類型或對象,稱爲編織(Weaving)。在 Spring AOP 中,編織在運行時執行。請參考下圖:

48、Spring MVC 框架有什麼用?

Spring Web MVC 框架提供 模型-視圖-控制器 架構和隨時可用的組件,用於開發靈活且鬆散耦合的 Web 應用程序。MVC 模式有助於分離應用程序的不同方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在所有這些元素之間提供鬆散耦合。

49、描述一下 DispatcherServlet 的工作流程

DispatcherServlet 的工作流程可以用一幅圖來說明:

1、向服務器發送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲。

2、 DispatcherServlet 根據 -servlet.xml 中的配置對請求的 URL 進行解析,得到請求資源標識符(URI)。然後根據該 URI,調用 HandlerMapping獲得該 Handler 配置的所有相關的對象(包括 Handler 對象以及 Handler 對
象對應的攔截器),最後以 HandlerExecutionChain 對象的形式返回。

3、 DispatcherServlet 根據獲得的 Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得 HandlerAdapter 後,此時將開始執行攔截器的 preHandler(…)方法)。

4、提取 Request 中的模型數據,填充 Handler 入參,開始執行 Handler( Controller)。在填充 Handler 的入參過程中,根據你的配置,Spring 將幫你做一些額外的工作:

 HttpMessageConveter:將請求消息(如 Json、xml 等數據)轉換成一個對象,將對象轉換爲指定的響應信息。
 數據轉換:對請求消息進行數據轉換。如 String 轉換成 Integer、Double 等。
 數據根式化:對請求消息進行數據格式化。如將字符串轉換成格式化數字或格式化日期等。
 數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult 或 Error 中。

5、Handler(Controller)執行完成後,向 DispatcherServlet 返回一個ModelAndView 對象;
6、根據返回的 ModelAndView,選擇一個適合的 ViewResolver(必須是已經註冊到 Spring 容器中的 ViewResolver)返回給 DispatcherServlet。
7、 ViewResolver 結合 Model 和 View,來渲染視圖。
8、視圖負責將渲染結果返回給客戶端。

50、介紹一下 WebApplicationContext

WebApplicationContext 是 ApplicationContext 的擴展。它具有 Web 應用程序所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關聯的能力方面有所不同。
英文原文鏈接:
https://www.edureka.co/blog/interview-questions/spring-interview-questions/

51、什麼是 spring?

Spring 是個 java 企業級應用的開源開發框架。Spring 主要用來開發 Java 應用,但是有些擴展是針對構建 J2EE 平臺的 web 應用。Spring 框架目標是簡化 Java企業級應用開發,並通過 POJO 爲基礎的編程模型促進良好的編程習慣。

52、使用 Spring 框架的好處是什麼?

 輕量:Spring 是輕量的,基本的版本大約 2MB。
 控制反轉:Spring 通過控制反轉實現了鬆散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
 面向切面的編程(AOP):Spring 支持面向切面的編程,並且把應用業務邏輯和系統服務分開。
 容器:Spring 包含並管理應用中對象的生命週期和配置。
 MVC 框架:Spring 的 WEB 框架是個精心設計的框架,是 Web 框架的一個很好的替代品。
 事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
 異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO 拋出的)轉化爲一致的 unchecked 異常。

53、Spring 由哪些模塊組成?

以下是 Spring 框架的基本模塊:

 Core module
 Bean module
 Context module
 Expression Language module
 JDBC module
 ORM module
 OXM module
 Java Messaging Service(JMS) module
 Transaction module
 Web module
 Web-Servlet module
 Web-Struts module
 Web-Portlet module

54、Spring的IOC和AOP機制

我們是在使用Spring框架的過程中,其實就是爲了使用IOC,依賴注入,和AOP,面向切面編程,這兩個是Spring的靈魂。
主要用到的設計模式有工廠模式和代理模式。
IOC就是典型的工廠模式,通過sessionfactory去注入實例。
AOP就是典型的代理模式的體現。
代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的接口,代理類主要負責爲委託類預處理消息、過濾消息、把消息轉發給委託類,以及事後處理消息等。代理類與委託類之間通常會存在關聯關係,一個代理類的對象與一個委託類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委託類的對象的相關方法,來提供特定的服務

spring的IoC容器是spring的核心,spring AOP是spring框架的重要組成部分。
在傳統的程序設計中,當調用者需要被調用者的協助時,通常由調用者來創建被調用者的實例。但在spring裏創建被調用者的工作不再由調用者來完成,因此控制反轉(IoC);創建被調用者實例的工作通常由spring容器來完成,然後注入調用者,因此也被稱爲依賴注入(DI),依賴注入和控制反轉是同一個概念。

面向方面編程(AOP)是以另一個角度來考慮程序結構,通過分析程序結構的關注點來完善面向對象編程(OOP)。OOP將應用程序分解成各個層次的對象,而AOP將程序分解成多個切面。spring AOP 只實現了方法級別的連接點,在J2EE應用中,AOP攔截到方法級別的操作就已經足夠。在spring中,未來使IoC方便地使用健壯、靈活的企業服務,需要利用spring AOP實現爲IoC和企業服務之間建立聯繫。

IOC:控制反轉也叫依賴注入。利用了工廠模式
將對象交給容器管理,你只需要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啓動的時候,spring會把你在配置文件中配置的bean都初始化好,然後在你需要調用的時候,就把它已經初始化好的那些bean分配給你需要調用這些bean的類(假設這個類名是A),分配的方法就是調用A的setter方法來注入,而不需要你在A裏面new這些bean了。

注意:面試的時候,如果有條件,畫圖,這樣更加顯得你懂了

AOP:面向切面編程。(Aspect-Oriented Programming)
AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行爲的一個集合。當我們需要爲分散的對象引入公共行爲的時候,OOP則顯得無能爲力。也就是說,OOP允許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼往往水平地散佈在所有對象層次中,而與它所散佈到的對象的核心功能毫無關係。在OOP設計中,它導致了大量代碼的重複,而不利於各個模塊的重用。將程序中的交叉業務邏輯(比如安全,日誌,事務等),封裝成一個切面,然後注入到目標對象(具體
業務邏輯)中去。

實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼.

簡單點解釋,比方說你想在你的biz層所有類中都加上一個打印‘你好’的功能,這時就可以用aop思想來做.你先寫個類寫個類方法,方法經實現打印‘你好’,然後Ioc這個類 ref=“biz.*”讓每個類都注入即可實現

55、Spring中Autowired和Resource關鍵字的區別

@Resource和@Autowired都是做bean的注入時使用,其實@Resource並不是Spring的註解,它的包是javax.annotation.Resource,需要導入,但是Spring支持該註解的注入。
1、共同點
兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上,那麼就不需要再寫setter方法。
2、不同點
(1)@Autowired

@Autowired爲Spring提供的註解,需要導入包
org.springframework.beans.factory.annotation.Autowired;只按照byType注入

public class TestServiceImpl {
    // 下面兩種@Autowired只要使用一種即可
    @Autowired
    private UserDao userDao; // 用於字段上
    @Autowired
    public void setUserDao(UserDao userDao) { // 用於屬性的方法上
    	this.userDao = userDao;
    }
}

@Autowired註解是按照類型(byType)裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它的required屬性爲false。如果我們想使用按照名稱(byName)來裝配,可以結合@Qualifier註解一起使用。如下:

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
}

(2)@Resource

@Resource默認按照ByName自動注入,由J2EE提供,需要導入包javax.annotation.Resource。@Resource有兩個重要的屬性:name和type,而Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。所以,如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不制定name也不制定type屬性,這時將通過反射機制使用byName自動注入策略

public class TestServiceImpl {
    // 下面兩種@Resource只要使用一種即可
    @Resource(name="userDao")
    private UserDao userDao; // 用於字段上
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用於屬性的setter方法上
    	this.userDao = userDao;
    }
}

注:最好是將@Resource放在setter方法上,因爲這樣更符合面向對象的思想,通過set、get去操作屬
性,而不是直接去操作屬性。

@Resource裝配順序:
①如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異
常。
②如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常。
③如果指定了type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會拋出異常

④如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配。@Resource的作用相當於@Autowired,只不過@Autowired按照byType自動注入

56、依賴注入的方式有幾種,各是什麼?

一、構造器注入
將被依賴對象通過構造函數的參數注入給依賴對象,並且在初始化對象的時候注入。
優點:
對象初始化完成後便可獲得可使用的對象。
缺點:
當需要注入的對象很多時,構造器參數列表將會很長;不夠靈活。若有多種注入方式,每種方式只需注入指定幾個依賴,那麼就需要提供多個重載的構造函數,麻煩。
二、setter方法注入
IoC Service Provider通過調用成員變量提供的setter函數將被依賴對象注入給依賴類。
優點:
靈活。可以選擇性地注入需要的對象。
缺點:
依賴對象初始化完成後由於尚未注入被依賴對象,因此還不能使用。
三、接口注入
依賴類必須要實現指定的接口,然後實現該接口中的一個函數,該函數就是用於依賴注入。該函數的參數就是要注入的對象

優點
接口注入中,接口的名字、函數的名字都不重要,只要保證函數的參數是要注入的對象類型即可。
缺點:
侵入行太強,不建議使用。
PS:什麼是侵入行?
如果類A要使用別人提供的一個功能,若爲了使用這功能,需要在自己的類中增加額外的代碼,這就是侵入性

57、講一下什麼是Spring

Spring是一個輕量級的IoC和AOP容器框架。是爲Java應用程序提供基礎性服務的一套框架,目的是用於簡化企業應用程序的開發,它使得開發者只需要關心業務需求。常見的配置方式有三種:基於XML的配置、基於註解的配置、基於Java的配置。
主要由以下幾個模塊組成:
Spring Core:核心類庫,提供IOC服務;
Spring Context:提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等);
Spring AOP:AOP服務;
Spring DAO:對JDBC的抽象,簡化了數據訪問異常的處理

Spring ORM:對現有的ORM框架的支持;
Spring Web:提供了基本的面向Web的綜合特性,例如多方文件上傳;
Spring MVC:提供面向Web應用的Model-View-Controller實現。

58、Spring MVC流程

1、 用戶發送請求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到請求調用HandlerMapping處理器映射器。
3、 處理器映射器找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
4、 DispatcherServlet調用HandlerAdapter處理器適配器。
5、 HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。
6、 Controller執行完成返回ModelAndView。
7、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
9、 ViewReslover解析後返回具體View。
10、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
11、 DispatcherServlet響應用戶

組件說明:
以下組件通常使用框架提供實現:
DispatcherServlet:作爲前端控制器,整個流程控制的中心,控制其它組件執行,統一調度,降低組件之間的耦合性,提高每個組件的擴展性

HandlerMapping:通過擴展處理器映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
HandlAdapter:通過擴展處理器適配器,支持更多類型的處理器。
ViewResolver:通過擴展視圖解析器,支持更多類型的視圖解析,例如:jsp、freemarker、pdf、excel等。

組件:
1、前端控制器DispatcherServlet(不需要工程師開發),由框架提供
作用:接收請求,響應結果,相當於轉發器,中央處理器。有了dispatcherServlet減少了其它組件之間的耦合度。

用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。

2、處理器映射器HandlerMapping(不需要工程師開發),由框架提供
作用:根據請求的url查找Handler
HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。

3、處理器適配器HandlerAdapter
作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。

4、處理器Handler(需要工程師開發)
注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。
由於Handler涉及到具體的用戶業務請求,所以一般情況需要工程師根據業務需求開發Handler。

5、視圖解析器View resolver(不需要工程師開發),由框架提供
作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。springmvc框架提供了很多的View視圖類型,包括:jstlView、freemarkerView、pdfView等。一般情況下需要通過頁面標籤或頁面模版技術將模型數據通過頁面展示給用戶,需要由工程師根據業務需求開發具體的頁面。

6、視圖View(需要工程師開發jsp…)
View是一個接口,實現類支持不同的View類型(jsp、freemarker、pdf…)核心架構的具體流程步驟如下:
1、首先用戶發送請求——>DispatcherServlet,前端控制器收到請求後自己不進行處理,而是委託給其他的解析器進行處理,作爲統一訪問點,進行全局的流程控制;

2、DispatcherServlet——>HandlerMapping, HandlerMapping 將會把請求映射爲HandlerExecutionChain 對象(包含一個Handler 處理器(頁面控制器)對象、多個HandlerInterceptor 攔截器)對象,通過這種策略模式,很容易添加新的映射策略;

3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;

4、HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter 將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView 對象(包含模型數據、邏輯視圖名);

5、ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析爲具體的View,通過這種策略模式,很容易更換其他視圖技術;

6、View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,因此很容易支持其他視圖技術;

7、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。下邊兩個組件通常情況下需要開發:
Handler:處理器,即後端控制器用controller表示。
View:視圖,即展示給用戶的界面,視圖中通常需要標籤語言展示模型數據。

59、springMVC是什麼

springMVC是一個MVC的開源框架,springMVC=struts2+spring,springMVC就相當於是Struts2加上sring的整合,但是這裏有一個疑惑就是,springMVC和spring是什麼樣的關係呢?這個在百度百科上有一個很好的解釋:意思是說,springMVC是spring的一個後續產品,其實就是spring在原有基礎上,又提供了web應用的MVC模塊,可以簡單的把springMVC理解爲是spring的一個模塊(類似AOP,IOC這樣的模塊),網絡上經常會說springMVC和spring無縫集成,其實springMVC就是spring的一個子模塊,所以根本不需要同spring進行整合

60、SpringMVC怎麼樣設定重定向和轉發的?

(1)轉發:在返回值前面加"forward:",譬如"forward:user.do?name=method4
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"

61、SpringMVC常用的註解有哪些

@RequestMapping:用於處理請求 url 映射的註解,可用於類或方法上。用於類上,則表示類中的所有響應請求的方法都是以該地址作爲父路徑。
@RequestBody:註解實現接收http請求的json數據,將json轉換爲java對象。
@ResponseBody:註解實現將conreoller方法返回對象轉化爲json對象響應給客戶

62、Spring的AOP理解

OOP面向對象,允許開發者定義縱向的關係,但並適用於定義橫向的關係,導致了大量代碼的重複,而不利於各個模塊的重用。
AOP,一般稱爲面向切面,作爲面向對象的一種補充,用於將那些與業務無關,但卻對多個對象產生影響的公共行爲和邏輯,抽取並封裝爲一個可重用的模塊,這個模塊被命名爲“切面”(Aspect),減少系統中的重複代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。可用於權限認證、日誌、事務處理。
AOP實現的關鍵在於 代理模式,AOP代理主要分爲靜態代理和動態代理。靜態代理的代表爲AspectJ;動態代理則以Spring AOP爲代表。
(1)AspectJ是靜態代理的增強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,因此也稱爲編譯時增強,他會在編譯階段將AspectJ(切面)織入到Java字節碼中,運行的時候就是增強之後的AOP對象。
(2)Spring AOP使用的動態代理,所謂的動態代理就是說AOP框架不會去修改字節碼,而是每次運行時在內存中臨時爲方法生成一個AOP對象,這個AOP對象包含了目標對象的全部方法,並且在特定的切點做了增強處理,並回調原對象的方法。

Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理 :

①JDK動態代理只提供接口的代理,不支持類的代理。核心InvocationHandler接口和Proxy類,InvocationHandler 通過invoke()方法反射來調用目標類中的代碼,動態地將橫切邏輯和業務編織在一起;接着,Proxy利用 InvocationHandler動態創建一個符合某一接口的的實例, 生成目標類的代理對象。
②如果代理類沒有實現 InvocationHandler 接口,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個代碼生成的類庫,可以在運行時動態的生成指定類的一個子類對象,並覆蓋其中特定方法並添加增強代碼,從而實現AOP。CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記爲final,那麼它是無法使用CGLIB做動態代理的

3)靜態代理與動態代理區別在於生成AOP代理對象的時機不同,相對來說AspectJ的靜態代理方式具
有更好的性能,但是AspectJ需要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理。

63、Spring的IOC理解

1)IOC就是控制反轉,是指創建對象的控制權的轉移,以前創建對象的主動權和時機是由自己把控的,而現在這種權力轉移到Spring容器中,並由容器根據配置文件去創建實例和管理各個實例之間的依賴關係,對象與對象之間鬆散耦合,也利於功能的複用。DI依賴注入,和控制反轉是同一個概念的不同角度的描述,即 應用程序在運行時依賴IoC容器來動態注入對象需要的外部資源。

(2)最直觀的表達就是,IOC讓對象的創建不用去new了,可以由spring自動生產,使用java的反射機制,根據配置文件在運行時動態的去創建對象以及管理對象,並調用對象的方法的。

(3)Spring的IOC有三種注入方式 :構造器注入、setter方法注入、根據註解注入。

IoC讓相互協作的組件保持鬆散的耦合,而AOP編程允許你把遍佈於應用各層的功能分離出來形成可重用的功能組件

64、解釋一下spring bean的生命週期

首先說一下Servlet的生命週期:實例化,初始init,接收請求service,銷燬destroy;Spring上下文中的Bean生命週期也類似,如下:
(1)實例化Bean:
對於BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調用createBean進行實例化。對於ApplicationContext容器,當容器啓動結束後,通過獲取BeanDefinition對象中的信息,實例化所有的bean。

(2)設置對象屬性(依賴注入):
實例化後的對象被封裝在BeanWrapper對象中,緊接着,Spring根據BeanDefinition中的信息 以及 通過BeanWrapper提供的設置屬性的接口完成依賴注入。

(3)處理Aware接口:
接着,Spring會檢測該對象是否實現了xxxAware接口,並將相關的xxxAware實例注入給Bean:

①如果這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String beanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;
②如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory()方法,傳遞的是Spring工廠自身。
③如果這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;
(4)BeanPostProcessor:

如果想對Bean進行一些自定義的處理,那麼可以讓Bean實現了BeanPostProcessor接口,那將會調用postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 與 init-method:
如果Bean在Spring配置文件中配置了 init-method 屬性,則會自動調用其配置的初始化方法。
(6)如果這個Bean實現了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object
obj, String s)方法;由於這個方法是在Bean初始化結束時調用的,所以可以被應用於內存或緩存技術

以上幾個步驟完成後,Bean就已經被正確創建了,之後就可以使用這個Bean了

7)DisposableBean:
當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用其實現的destroy()方法;
(8)destroy-method:
最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法

65、解釋Spring支持的幾種bean的作用域。

Spring容器中的bean可以分爲5個範圍:
(1)singleton:默認,每個容器中只有一個bean的實例,單例的模式由BeanFactory自身來維護。
(2)prototype:爲每一個bean請求提供一個實例。
(3)request:爲每一個網絡請求創建一個實例,在請求完成以後,bean會失效並被垃圾回收器回收。
(4)session:與request範圍類似,確保每個session中有一個bean的實例,在session過期後,bean會隨之失效。
(5)global-session:全局作用域,global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那麼這全局變量需要存儲在global-session中。全局作用域與Servlet中的session作用域效果相同

66、Spring基於xml注入bean的幾種方式

1)Set方法注入;
(2)構造器注入:①通過index設置參數的位置;②通過type設置參數類型;
(3)靜態工廠注入;
(4)實例工廠;
詳細內容可以閱讀:https://blog.csdn.net/a745233700/article/details/89307518

67、Spring框架中都用到了哪些設計模式

(1)工廠模式:BeanFactory就是簡單工廠模式的體現,用來創建對象的實例;
(2)單例模式:Bean默認爲單例模式。
(3)代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術;
(4)模板方法:用來解決代碼重複的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)觀察者模式:定義對象鍵一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都會得到通知被制動更新,如Spring中listener的實現–ApplicationListener

68、核心容器(應用上下文) 模塊

這是基本的 Spring 模塊,提供 spring 框架的基礎功能,BeanFactory 是 任何以 spring 爲基礎的應用的核心。Spring 框架建立在此模塊之上,它使 Spring 成爲一個容器。

69、BeanFactory – BeanFactory 實現舉例。

Bean 工廠是工廠模式的一個實現,提供了控制反轉功能,用來把應用的配置和依賴從正真的應用代碼中分離。
最常用的 BeanFactory 實現是 XmlBeanFactory 類。

70、XMLBeanFactory

最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它根據 XML 文件中的定義加載 beans。該容器從 XML 文件讀取配置元數據並用它去創建一個完全配置的系統或應用。

71、解釋 AOP 模塊

AOP 模塊用於發給我們的 Spring 應用做面向切面的開發, 很多支持由 AOP 聯盟提供,這樣就確保了 Spring 和其他 AOP 框架的共通性。這個模塊將元數據編程引入 Spring。

72、解釋 JDBC 抽象和 DAO 模塊。

通過使用 JDBC 抽象和 DAO 模塊,保證數據庫代碼的簡潔,並能避免數據庫資源錯誤關閉導致的問題,它在各種不同的數據庫的錯誤信息之上,提供了一個統一的異常訪問層。它還利用 Spring 的 AOP 模塊給 Spring 應用中的對象提供事務管理服務。

72、解釋對象/關係映射集成模塊。

Spring 通過提供 ORM 模塊,支持我們在直接 JDBC 之上使用一個對象/關係映射映射(ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATISSQL Maps。Spring 的事務管理同樣支持以上所有 ORM 框架及 JDBC。

73、解釋 WEB 模塊。

Spring 的 WEB 模塊是構建在 application context 模塊基礎之上,提供一個適合 web 應用的上下文。這個模塊也包括支持多種面向 web 的任務,如透明地處理多個文件上傳請求和程序級請求參數的綁定到你的業務對象。它也有對 Jakarta Struts 的支持。

74、Spring 配置文件

Spring 配置文件是個 XML 文件,這個文件包含了類信息,描述瞭如何配置它們,以及如何相互調用

75、什麼是 Spring IOC 容器?

Spring IOC 負責創建對象,管理對象(通過依賴注入(DI),裝配對象,配置對象,並且管理這些對象的整個生命週期。

76、IOC 的優點是什麼?

IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試不再需要單例和 JNDI 查找機制。最小的代價和最小的侵入性使鬆散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載。

77、ApplicationContext 通常的實現是什麼?

 FileSystemXmlApplicationContext :此容器從一個 XML 文件中加載 beans 的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數。

 ClassPathXmlApplicationContext:此容器也從一個 XML 文件中加載 beans 的定義,這裏,你需要正確設置 classpath 因爲這個容器將在 classpath裏找 bean 配置。

 WebXmlApplicationContext:此容器加載一個 XML 文件,此文件定義了一個 WEB 應用的所有 bean。

78、Bean 工廠和 Application contexts 有什麼區別?

Application contexts 提供一種方法處理文本消息,一個通常的做法是加載文件資源(比如鏡像),它們可以向註冊爲監聽器的 bean 發佈事件。另外,在容器或容器內的對象上執行的那些不得不由 bean 工廠以程序化方式處理的操作,可以在Application contexts 中以聲明的方式處理。Application contexts 實現了MessageSource 接口,該接口的實現以可插拔的方式提供獲取本地化消息的方法。

79、一個 Spring 的應用看起來象什麼?

 一個定義了一些功能的接口。
 這實現包括屬性,它的 Setter , getter 方法和函數等。
 Spring AOP。
 Spring 的 XML 配置文件。
 使用以上功能的客戶端程序。

80、什麼是 Spring 的依賴注入?

依賴注入,是 IOC 的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用創建對象,而只需要描述它如何被創建。你不在代碼裏直接組裝你的組件和服務,但是要在配置文件裏描述哪些組件需要哪些服務,之後一個容器(IOC 容器)負責把他們組裝起來。

81、有哪些不同類型的 IOC(依賴注入)方式?

 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列參數,每個參數代表一個對其他類的依賴。
 Setter 方法注入:Setter 方法注入是容器通過調用無參構造器或無參static 工廠 方法實例化 bean 之後,調用該 bean 的 setter 方法,即實現了基於 setter 的依賴注入。

82、哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入?

你兩種依賴方式都可以使用,構造器注入和 Setter 方法注入。最好的解決方案是用構造器參數實現強制依賴,setter 方法實現可選依賴

83、什麼是 Spring beans?

Spring beans 是那些形成 Spring 應用的主幹的 java 對象。它們被 Spring IOC容器初始化,裝配,和管理。這些 beans 通過容器中配置的元數據創建。比如,以 XML 文件中 的形式定義。

Spring 框架定義的 beans 都是單件 beans。在 bean tag 中有個屬性”singleton”,如果它被賦爲 TRUE,bean 就是單件,否則就是一個 prototype bean。默認是 TRUE,所以所有在 Spring 框架中的 beans 缺省都是單件。

84、一個 Spring Bean 定義 包含什麼?

一個 Spring Bean 的定義包含容器必知的所有配置元數據,包括如何創建一個bean,它的生命週期詳情及它的依賴。

85、如何給 Spring 容器提供配置元數據?

這裏有三種重要的方法給 Spring 容器提供配置元數據。
XML 配置文件。
基於註解的配置。
基於 java 的配置。

86、你怎樣定義類的作用域?

當定義一個 在 Spring 裏,我們還能給這個 bean 聲明一個作用域。它可以通過bean 定義中的 scope 屬性來定義。如,當 Spring 要在需要的時候每次生產一個新的 bean 實例,bean 的 scope 屬性被指定爲 prototype。另一方面,一個 bean 每次使用的時候必須返回同一個實例,這個 bean 的 scope 屬性 必須設爲singleton

87、解釋 Spring 支持的幾種 bean 的作用域。

Spring 框架支持以下五種 bean 的作用域:
 singleton : bean 在每個 Spring ioc 容器中只有一個實例。
 prototype:一個 bean 的定義可以有多個實例。
 request:每次 http 請求都會創建一個 bean,該作用域僅在基於 web的 Spring ApplicationContext 情形下有效。
 session:在一個 HTTP Session 中,一個 bean 定義對應一個實例。該作用域僅在基於 web 的 Spring ApplicationContext 情形下有效。
 global-session:在一個全局的 HTTP Session 中,一個 bean 定義對應一個實例。該作用域僅在基於 web 的 Spring ApplicationContext 情形下有效。缺省的 Spring bean 的作用域是 Singleton.

88、Spring 框架中的單例 bean 是線程安全的嗎?

不,Spring 框架中的單例 bean 不是線程安全的。

89、解釋 Spring 框架中 bean 的生命週期。

 Spring 容器 從 XML 文件中讀取 bean 的定義,並實例化 bean。
 Spring 根據 bean 的定義填充所有的屬性。

 如果 bean 實現了 BeanNameAware 接口,Spring 傳遞 bean 的 ID 到setBeanName 方法。
 如果 Bean 實現了 BeanFactoryAware 接口, Spring 傳遞beanfactory 給 setBeanFactory 方法。
 如果有任何與 bean 相關聯的 BeanPostProcessors,Spring 會在postProcesserBeforeInitialization()方法內調用它們。
 如果 bean 實現 IntializingBean 了,調用它的 afterPropertySet 方法,如果 bean 聲明瞭初始化方法,調用此初始化方法。
 如果有 BeanPostProcessors 和 bean 關聯,這些 bean 的postProcessAfterInitialization() 方法將被調用。
 如果 bean 實現了 DisposableBean,它將調用 destroy()方法

90、哪些是重要的 bean 生命週期方法?你能重載它們嗎?

有兩個重要的 bean 生命週期方法,第一個是 setup , 它是在容器加載 bean的時候被調用。第二個方法是 teardown 它是在容器卸載類的時候被調用。The bean 標籤有兩個重要的屬性(init-method 和 destroy-method)。用它們你可以自己定製初始化和註銷方法。它們也有相應的註解(@PostConstruct 和
@PreDestroy)。

91、什麼是 Spring 的內部 bean?

當一個 bean 僅被用作另一個 bean 的屬性時,它能被聲明爲一個內部 bean,爲了定義 inner bean,在 Spring 的 基於 XML 的 配置元數據中,可以在 或 元素內使用 元素,內部 bean 通常是匿名的,它們的 Scope 一般是 prototype。

92、在 Spring 中如何注入一個 java 集合?

Spring 提供以下幾種集合的配置元素:
 類型用於注入一列值,允許有相同的值。
 類型用於注入一組值,不允許有相同的值。
 類型用於注入一組鍵值對,鍵和值都可以爲任意類型。
 類型用於注入一組鍵值對,鍵和值都只能爲 String 類型。

93、什麼是 bean 裝配?

裝配,或 bean 裝配是指在 Spring 容器中把 bean 組裝到一起,前提是容器需要知道 bean 的依賴關係,如何通過依賴注入來把它們裝配到一起。

94、什麼是 bean 的自動裝配?

Spring 容器能夠自動裝配相互合作的 bean,這意味着容器不需要和配置,能通過 Bean 工廠自動處理 bean 之間的協作。

95、解釋不同方式的自動裝配 。

有五種自動裝配的方式,可以用來指導 Spring 容器用自動裝配方式來進行依賴注入。

 no:默認的方式是不進行自動裝配,通過顯式設置 ref 屬性來進行裝配。

 byName:通過參數名 自動裝配,Spring 容器在配置文件中發現 bean的 autowire 屬性被設置成 byname,之後容器試圖匹配、裝配和該 bean 的屬性具有相同名字的 bean。
 byType::通過參數類型自動裝配,Spring 容器在配置文件中發現 bean的 autowire 屬性被設置成 byType,之後容器試圖匹配、裝配和該 bean 的屬性具有相同類型的 bean。如果有多個 bean 符合條件,則拋出錯誤。
 constructor:這個方式類似於 byType, 但是要提供給構造器參數,如果沒有確定的帶參數的構造器參數類型,將會拋出異常。
 autodetect:首先嚐試使用 constructor 來自動裝配,如果無法工作,則使用 byType 方式。

96、自動裝配有哪些侷限性

自動裝配的侷限性是:
 重寫:你仍需用 和 配置來定義依賴,意味着總要重寫自動裝配。
 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。
 模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。

97、你可以在 Spring 中注入一個 null 和一個空字符串嗎?

可以

98、什麼是基於 Java 的 Spring 註解配置? 給一些註解的例子.

基於 Java 的配置,允許你在少量的 Java 註解的幫助下,進行你的大部分 Spring配置而非通過 XML 文件。
以@Configuration 註解爲例,它用來標記類可以當做一個 bean 的定義,被Spring IOC 容器使用。另一個例子是@Bean 註解,它表示此方法將要返回一個對象,作爲一個 bean 註冊進 Spring 應用上下文。

99、什麼是基於註解的容器配置?

相對於 XML 文件,註解型的配置依賴於通過字節碼元數據裝配組件,而非尖括號的聲明。
開發者通過在相應的類,方法或屬性上使用註解的方式,直接組件類中進行配置,而不是使用 xml 表述 bean 的裝配關係。

100、怎樣開啓註解裝配?

註解裝配在默認情況下是不開啓的,爲了使用註解裝配,我們必須在 Spring 配置文件中配置 context:annotation-config/元素

101、@Required 註解

這個註解表明 bean 的屬性必須在配置的時候設置,通過一個 bean 定義的顯式的屬性值或通過自動裝配,若@Required 註解的 bean 屬性未被設置,容器將拋出BeanInitializationException。

102、@Autowired 註解

@Autowired 註解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和@Required 一樣,修飾 setter 方法、構造器、屬性或者具有任意名稱和/或多個參數的 PN 方法。

103、@Qualifier 註解

當有多個相同類型的 bean 卻只有一個需要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用以消除這種混淆,指定需要裝配的確切的 bean。

104、在 Spring 框架中如何更有效地使用 JDBC?

使用 SpringJDBC 框架,資源管理和錯誤處理的代價都會被減輕。所以開發者只需寫 statements 和 queries 從數據存取數據,JDBC 也可以在 Spring 框架提供的模板類的幫助下更有效地被使用,這個模板叫 JdbcTemplate (例子見這裏here)

105、JdbcTemplate

JdbcTemplate 類提供了很多便利的方法解決諸如把數據庫數據轉變成基本數據類型或對象,執行寫好的或可調用的數據庫操作語句,提供自定義的數據錯誤處理。

106、Spring 對 DAO 的支持

Spring 對數據訪問對象(DAO)的支持旨在簡化它和數據訪問技術如 JDBC,Hibernate or JDO 結合使用。這使我們可以方便切換持久層。編碼時也不用擔心會捕獲每種技術特有的異常。

107、使用 Spring 通過什麼方式訪問 Hibernate?

在 Spring 中有兩種方式訪問 Hibernate:
 控制反轉 Hibernate Template 和 Callback。
 繼承 HibernateDAOSupport 提供一個 AOP 攔截器。

108、Spring 支持的 ORM

Spring 支持以下 ORM:
 Hibernate
 iBatis
 JPA (Java Persistence API)
 TopLink
 JDO (Java Data Objects)
 OJB

109、如何通過 HibernateDaoSupport 將 Spring 和 Hibernate結合起來?

用 Spring 的 SessionFactory 調用 LocalSessionFactory。集成過程分三步:
 配置 the Hibernate SessionFactory。
 繼承 HibernateDaoSupport 實現一個 DAO。
 在 AOP 支持的事務中裝配。

110、Spring 支持的事務管理類型

Spring 支持兩種類型的事務管理:
 編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
 聲明式事務管理:這意味着你可以將業務代碼和事務管理分離,你只需用註解和 XML 配置來管理事務。

111、Spring 框架的事務管理有哪些優點?

 它爲不同的事務 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一個不變的編程模式。
 它爲編程式事務管理提供了一套簡單的 API 而不是一些複雜的事務 API

 它支持聲明式事務管理。
 它和 Spring 各種數據訪問抽象層很好得集成。

112、你更傾向用那種事務管理類型?

大多數 Spring 框架的用戶選擇聲明式事務管理,因爲它對應用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式允許你通過代碼控制事務)少了一點靈活性

113、解釋 AOP

面向切面的編程,或 AOP, 是一種編程技術,允許程序模塊化橫向切割關注點,或橫切典型的責任劃分,如日誌和事務管理。

114、Aspect 切面

AOP 核心就是切面,它將多個類的通用行爲封裝成可重用的模塊,該模塊含有一組 API 提供橫切功能。比如,一個日誌模塊可以被稱作日誌的 AOP 切面。根據需求的不同,一個應用程序可以有若干切面。在 Spring AOP 中,切面通過帶有@Aspect 註解的類實現。

115、在 Spring AOP 中,關注點和橫切關注的區別是什麼?

關注點是應用中一個模塊的行爲,一個關注點可能會被定義成一個我們想實現的一個功能。橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日誌,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬於橫切關注點。

116、連接點

連接點代表一個應用程序的某個位置,在這個位置我們可以插入一個 AOP 切面,它實際上是個應用程序執行 Spring AOP 的位置。

117、通知

通知是個在方法執行前或執行後要做的動作,實際上是程序執行時要通過SpringAOP 框架觸發的代碼段。
Spring 切面可以應用五種類型的通知:
 before:前置通知,在一個方法執行前被調用。
 after: 在方法執行之後調用的通知,無論方法執行是否成功。
 after-returning: 僅當方法成功完成後執行的通知。
 after-throwing: 在方法拋出異常退出時執行的通知。
 around: 在方法執行之前和之後調用的通知。

118、切點

切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。

119、什麼是引入?

引入允許我們在已存在的類中增加新的方法和屬性。

120、什麼是目標對象?

被一個或者多個切面所通知的對象。它通常是一個代理對象。也指被通知(advised)對象。

121、什麼是代理?

代理是通知目標對象後創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。

122、有幾種不同類型的自動代理?

BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

123、什麼是織入。什麼是織入應用的不同點?

織入是將切面和到其他應用類型或對象連接或創建一個被通知對象的過程。織入可以在編譯時,加載時,或運行時完成。

124、解釋基於 XML Schema 方式的切面實現。

在這種情況下,切面由常規類以及基於 XML 的配置實現。

125、解釋基於註解的切面實現

在這種情況下(基於@AspectJ 的實現),涉及到的切面聲明的風格與帶有 java5 標註的普通 java 類一致。
Spring 的 MVC

126、什麼是 Spring 的 MVC 框架?

Spring 配備構建 Web 應用的全功能 MVC 框架。Spring 可以很便捷地和其他MVC 框架集成,如 Struts,Spring 的 MVC 框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。

127、DispatcherServlet

Spring 的 MVC 框架是圍繞 DispatcherServlet 來設計的,它用來處理所有的 HTTP請求和響應。

128、WebApplicationContext

WebApplicationContext 繼承了 ApplicationContext 並增加了一些 WEB 應用必備的特有功能,它不同於一般的 ApplicationContext ,因爲它能處理主題,並找到被關聯的 servlet。

129、什麼是 Spring MVC 框架的控制器?

控制器提供一個訪問應用程序的行爲,此行爲通常通過服務接口實現。控制器解析用戶輸入並將其轉換爲一個由視圖呈現給用戶的模型。Spring 用一個非常抽象的方式實現了一個控制層,允許用戶創建多種用途的控制器。

130、@Controller 註解

該註解表明該類扮演控制器的角色,Spring 不需要你繼承任何其他控制器基類或引用 Servlet API。

131、@RequestMapping 註解

該註解是用來映射一個 URL 到一個類或一個特定的方處理法上

ing: 僅當方法成功完成後執行的通知。
 after-throwing: 在方法拋出異常退出時執行的通知。
 around: 在方法執行之前和之後調用的通知。

118、切點

切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。

119、什麼是引入?

引入允許我們在已存在的類中增加新的方法和屬性。

120、什麼是目標對象?

被一個或者多個切面所通知的對象。它通常是一個代理對象。也指被通知(advised)對象。

121、什麼是代理?

代理是通知目標對象後創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。

122、有幾種不同類型的自動代理?

BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

123、什麼是織入。什麼是織入應用的不同點?

織入是將切面和到其他應用類型或對象連接或創建一個被通知對象的過程。織入可以在編譯時,加載時,或運行時完成。

124、解釋基於 XML Schema 方式的切面實現。

在這種情況下,切面由常規類以及基於 XML 的配置實現。

125、解釋基於註解的切面實現

在這種情況下(基於@AspectJ 的實現),涉及到的切面聲明的風格與帶有 java5 標註的普通 java 類一致。
Spring 的 MVC

126、什麼是 Spring 的 MVC 框架?

Spring 配備構建 Web 應用的全功能 MVC 框架。Spring 可以很便捷地和其他MVC 框架集成,如 Struts,Spring 的 MVC 框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。

127、DispatcherServlet

Spring 的 MVC 框架是圍繞 DispatcherServlet 來設計的,它用來處理所有的 HTTP請求和響應。

128、WebApplicationContext

WebApplicationContext 繼承了 ApplicationContext 並增加了一些 WEB 應用必備的特有功能,它不同於一般的 ApplicationContext ,因爲它能處理主題,並找到被關聯的 servlet。

129、什麼是 Spring MVC 框架的控制器?

控制器提供一個訪問應用程序的行爲,此行爲通常通過服務接口實現。控制器解析用戶輸入並將其轉換爲一個由視圖呈現給用戶的模型。Spring 用一個非常抽象的方式實現了一個控制層,允許用戶創建多種用途的控制器。

130、@Controller 註解

該註解表明該類扮演控制器的角色,Spring 不需要你繼承任何其他控制器基類或引用 Servlet API。

131、@RequestMapping 註解

該註解是用來映射一個 URL 到一個類或一個特定的方處理法上

另外,還整理了一個整理了一本面試電子書,共 300頁!目錄如下


差不多花了大半個月在整理成冊,另外創建了一個比較大家關心的內推羣,自建立起就很受歡迎!羣裏目前有不少獵頭和各大互聯網公司HR,大多數來自,北京,上海,廣州,深圳,杭州,希望能給大家來帶幫助!

給俺點個讚唄,可以讓更多的人看到這篇文章,順便激勵下我,嘻嘻。

作者簡潔
作者:大家好,我是軍長,一如既往的爲廣大Java讀者奉獻MySQL、SSM、Redis、Spring,並且整理了300頁Java面試手冊個人博客 全部是Java,分佈式,大數據的系列文章。 轉載說明:未獲得授權,禁止轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章