Spring基本概念及其面試題

Spring面試題

什麼是Spring框架?Spring有哪些核心模塊

Spring框架是一個爲Java應用程序的開發提供了綜合、普遍的基礎性支持的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員能夠專一於應用程序的開發。Spring框架自己亦是按照設計模式精心打造,這使得咱們能夠在開發環境中安心的集成Spring框架,沒必要擔憂Spring是如何在後臺進行工做的。   Spring框架至今已集成了20多個模塊。這些模塊主要被分以下圖所示的核心容器、數據訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊。 java

在這裏插入圖片描述

核心模塊 說明
Spring Core 核心容器:核心容器提供Spring框架的基本功能。Spring以bean的方式組織和管理Java應用中的各個組件及其關係。Spring使用BeanFactory來產生和管理Bean,它是工廠模式的實現。BeanFactory使用控制反轉(IoC)模式將應用的配置和依賴性規範與實際的應用程序代碼分開
Spring Context 應用上下文: 是一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業服務,如JNDI、EJB、電子郵件、國際化、校驗和調度功能
Spring AOP 面向切面編程: 是面向對象編程的有效補充和完善,Spring的AOP是基於動態代理實現的,實現的方式有兩種分別是Schema和AspectJ這兩種方式
Spring Dao JDBC和Dao模塊: JDBC、DAO的抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理,和不一樣數據庫供應商所拋出的錯誤信息。異常層次結構簡化了錯誤處理,而且極大的下降了須要編寫的代碼數量,好比打開和關閉連接
Spring ORM 對象實體映射: Spring框架插入了若干個ORM框架,從而提供了ORM對象的關係工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,全部這些都聽從Spring的通用事物和DAO異常層次結構。
Spring Web Web模塊: Web上下文模塊創建在應用程序上下文模塊之上,爲基於web的應用程序提供了上下文。因此Spring框架支持與Struts集成,web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做
Spring Web MVC **MVC模塊:**MVC框架是一個全功能的構建Web應用程序的MVC實現。經過策略接口,MVC框架變成爲高度可配置的。MVC容納了大量視圖技術,其中包括JSP、POI等,模型由JavaBean構成,存放於m當中,而視圖是一個接口,負責實現模型,控制器表示邏輯代碼,由c的事情。Spring框架的功能能夠用在任何J2EE服務器當中,大多數功能也適用於不受管理的環境。Spring的核心要點就是支持不綁定到特定J2EE服務的可重用業務和數據的訪問的對象,毫無疑問這樣的對象能夠在不一樣的J2EE環境,獨立應用程序和測試環境之間重用。

在這裏插入圖片描述

使用Spring框架的好處有哪些?

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

BeanFactory和ApplicationContext有什麼區別?

在類圖關係上BeanFactory是ApplicationContext接口的父接口 web

在這裏插入圖片描述
在這裏插入圖片描述

BeanFactory

是spring中比較原始的Factory。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory沒法支持spring的許多插件,如AOP功能、Web應用等。面試

ApplicationContext

ApplicationContext接口是由BeanFactory接口派生而來,於是具備BeanFactory全部的功能。ApplicationContext以一種更向面向框架的方式工做以及對上下文進行分層和實現繼承,ApplicationContext包還提供瞭如下的功能spring

  1. MessageSource, 提供國際化的消息訪問
  2. 資源訪問,如URL和文件
  3. 事件傳播
  4. 載入多個(有繼承關係)上下文 ,使得每個上下文都專一於一個特定的層次,好比應用的web層,其實經過上面的類圖你們應該也能看的出來BeanFactory和ApplicationContext的區別的。

Spring有幾種配置方式?

序號 配置方式
1 基於XML的配置
2 基於註解的配置
3 基於Java的配置

怎樣用XML方式配置Spring?

1.建立xml配置文件

在項目資源目錄下建立applicationContext.xml文件,以下數據庫

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 </beans>
複製代碼

2.加載容器

若是是web項目的話,在web.xml文件添加以下配置:編程

<context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
 </context-param>

 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
複製代碼

若是是java項目能夠經過BeanFactory或ApplicationContext來直接加載Spring容器設計模式

BeanFactory bf = 
	new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext = 
	new ClassPathXmlApplicationContext("applicationContext.xml");
複製代碼

怎樣用註解的方式配置Spring?

1.配置文件中開啓掃描

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- 開啓註解 配置掃描路徑 -->
	<context:component-scan base-package="com.dpb.javabean"/>
	<!-- 若是有多個路徑 ,號隔開 
		<context:component-scan base-package="com.dpb.javabean,com.dpb.factory"/>
	-->
</beans>
複製代碼

2.加載容器

若是是web項目的話,在web.xml文件添加以下配置:安全

<context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
 </context-param>

 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
複製代碼

若是是java項目能夠經過BeanFactory或ApplicationContext來直接加載Spring容器bash

BeanFactory bf = 
	new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 或者
ApplicationContext = 
	new ClassPathXmlApplicationContext("applicationContext.xml");
複製代碼

如何用基於Java配置的方式配置Spring?

Spring對Java配置的支持是由@Configuration註解和@Bean註解來實現的。服務器

註解 說明
@Bean 由@Bean註解的方法將會實例化、配置和初始化一個新對象,這個對象將由Spring的IoC容器來管理 ,@Bean聲明所起到的做用與 元素相似
@Configuration 表示該類是一個配置類。用來定義bean資源

1.建立配置類

@Configuration
public class AppConfig
{
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
複製代碼

2.加載容器

若是是web項目的話,在web.xml文件添加以下配置:

<context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
 </context-param>

 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
複製代碼

若是是java項目能夠經過ApplicationContext來加載

public static void main(String[] args) {
    ApplicationContext ctx = 
    			new AnnotationConfigApplicationContext(AppConfig.class);
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}
複製代碼

ApplicationContext一般的實現是什麼?

實現方式 說明
FileSystemXmlApplicationContext 此容器從一個XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數
ClassPathXmlApplicationContext 此容器也從一個XML文件中加載beans的定義,這裏,你須要正確設置classpath由於這個容器將在classpath裏找bean配置
WebXmlApplicationContext 此容器加載一個XML文件,此文件定義了一個WEB應用的全部bean

解釋Spring支持的幾種bean的做用域

Spring容器中的bean能夠分爲5個範圍。:

做用域 說明
singleton 這種bean範圍是默認的,這種範圍確保無論接受到多少個請求,每一個容器中只有一個bean的實例,單例的模式由bean factory自身來維護
prototype 原型範圍與單例範圍相反,爲每個bean請求提供一個實例,原型模式
request 在請求bean範圍內會每個來自客戶端的網絡請求建立一個實例,在請求完成之後,bean會失效並被垃圾回收器回收
Session 與請求範圍相似,確保每一個session中有一個bean的實例,在session過時後,bean會隨之失效
global-session global-session和Portlet應用相關。當你的應用部署在Portlet容器中工做時,它包含不少portlet。若是你想要聲明讓全部的portlet共用全局的存儲變量的話,那麼這全局變量須要存儲在global-session中。全局做用域與Servlet中的session做用域效果相同。

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

確定不是線程安全的,當多用戶同時請求一個服務時,容器會給每個請求分配一個線程,這是多個線程會併發執行該請求多對應的業務邏輯(成員方法),此時就要注意了,若是該處理邏輯中有對該單列狀態的修改(體現爲該單列的成員屬性),則必須考慮線程同步問題.

什麼是Spring的內部bean?

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
	<bean id="CustomerBean" class="com.dpb.common.Customer">
		<property name="person" ref="PersonBean"/>
	</bean>
	
	<bean id="PersonBean" class="com.dpb.common.Person">
		<property name="name" value="波波烤鴨"/>
		<property name="address" value="深圳"/>
		<property name="age" value="17"/>
	</bean>
</beans>
複製代碼

改成內部bean的方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
	<bean id="CustomerBean" class="com.dpb.common.Customer">
		<property name="person">
			<bean class="com.dpb.common.Person">
				<property name="name" value="波波烤鴨"/>
				<property name="address" value="湖南"/>
				<property name="age" value="17"/>
			</bean>		
		</property>
	</bean>
</beans>
複製代碼

內部 bean 也支持構造器注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
	<bean id="CustomerBean" class="com.dpb.common.Customer">
		<constructor-arg >
			<bean class="com.dpb.common.Person">
				<property name="name" value="波波烤鴨"/>
				<property name="address" value="湖南"/>
				<property name="age" value="17"/>
			</bean>		
		</constructor-arg>
	</bean>
</beans>
複製代碼

id 或 name 值在bean類是沒有必要以一個內部 bean 呈現

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

Spring提供如下幾種集合的配置元素:

元素 說明
list 類型用於注入一列值,容許有相同的值。
set 類型用於注入一組值,不容許有相同的值。
map 類型用於注入一組鍵值對,鍵和值均可覺得任意類型。
props 類型用於注入一組鍵值對,鍵和值都只能爲String類型。
<!-- 配置 student對象 -->
<bean class="com.dpb.javabean.Student">
	<property name="id" value="10"/>
	<property name="name" value="波波烤鴨"/>
	<!-- 對象注入 -->
	<property name="cat" ref="catId"></property>
	<!-- List集合注入 -->
	<property name="games">
		<list>
			<value>LOL</value>
			<value>DNF</value>
			<value>CS</value>
		</list>
	</property>
<property name="score">
	<map>
		<entry key="數學" value="99"/>
		<entry key="英語" value="78"/>
		<entry key="化學" value="84"/>
	</map>
</property>
<property name="props">
	<props>
		<prop key="userName">admin</prop>
		<prop key="password">123</prop>
	</props>
</property>

複製代碼

解釋不一樣方式的自動裝配

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

裝配類型 說明
no 默認的方式是不進行自動裝配,經過顯式設置ref 屬性來進行裝配
byName 經過參數名 自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,以後容器試圖匹配、裝配和該bean的屬性具備相同名字的bean。
byType 經過參數類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,以後容器試圖匹配、裝配和該bean的屬性具備相同類型的bean。若是有多個bean符合條件,則拋出錯誤。
constructor 這個方式相似於byType, 可是要提供給構造器參數,若是沒有肯定的帶參數的構造器參數類型,將會拋出異常。
autodetect 首先嚐試使用constructor來自動裝配,若是沒法工做,則使用byType方式。

@Autowired 註解解釋

emsp;經過類型來實現自動注入bean。和@Qualifier註解配合使用能夠實現根據name注入bean。

@Qualifier 註解解釋

emsp;和@Autowired一塊使用,在同一類型的bean有多個的狀況下能夠實現根據name注入的需求

@Resource 註解解釋

emsp;默認是根據name注入bean的,能夠經過設置類型來實現經過類型來注入

Spring支持的事務管理類型

Spring支持兩種類型的事務管理:

編程式事務管理:這意味你經過編程的方式管理事務,給你帶來極大的靈活性,可是難維護。 聲明式事務管理:這意味着你能夠將業務代碼和事務管理分離,你只需用註解和XML配置來管理事務。

Spring框架的事務管理有哪些優勢?

它爲不一樣的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。 它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如 它支持聲明式事務管理。它支持聲明式事務管理。 它和Spring各類數據訪問抽象層很好得集成。它和Spring各類數據訪問抽象層很好得集成。

你更傾向用哪一種事務管理類型?

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

Spring框架使用了哪些設計模式

  1. 單例模式
  2. 原型模式
  3. 工廠模式
  4. 適配器模式
  5. 包裝模式
  6. 代理模式
  7. 觀察者模式
  8. 策略模式
  9. 模板模式

請解釋Spring Bean的生命週期?

Spring容器 從XML 文件中讀取bean的定義,並實例化bean。 Spring根據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()方法。

相關文章
相關標籤/搜索