最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一份最詳細(xì)的spring面試題與答案解析

2019-09-24 16:41 作者:P8架構(gòu)師諸葛  | 我要投稿

以下為 spring 常見面試問題:

1 、什么是 Spring? 框架?Spring? 框架有哪些主要模塊?

Spring 框架是一個為 Java 應(yīng)用程序的開發(fā)提供了綜合、廣泛的基礎(chǔ)性支持的 Java 平臺。

Spring 幫助開發(fā)者解決了開發(fā)中基礎(chǔ)性的問題,使得開發(fā)人員可以專注于應(yīng)用程序的開發(fā)。

Spring 框架本身亦是按照設(shè)計模式精心打造,這使得我們可以在開發(fā)環(huán)境中安心的集成 Spring 框架,不必?fù)?dān)心 Spring 是如何在后臺進(jìn)行工作的。

Spring 框架至今已集成了 20 多個模塊。這些模塊主要被分如下圖所示的核心容器、數(shù)據(jù)訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊。

2 、使用 Spring? 框架能帶來哪些好處?

下面列舉了一些使用 Spring 框架帶來的主要好處:

  • Dependency Injection(DI) 方法使得構(gòu)造器和 JavaBean properties 文件中的依賴關(guān)系一

  • 目了然。

  • 與 EJB 容器相比較,IoC 容器更加趨向于輕量級。這樣一來 IoC 容器在有限的內(nèi)存和 CPU 資源的情況下進(jìn)行應(yīng)用程序的開發(fā)和發(fā)布就變得十分有利。

  • ?Spring 并沒有閉門造車,Spring 利用了已有的技術(shù)比如 ORM 框架、logging 框架、J2EE、Quartz 和 JDK Timer,以及其他視圖技術(shù)。

  • Spring 框架是按照模塊的形式來組織的。由包和類的編號就可以看出其所屬的模塊,開發(fā)者僅

  • 僅需要選用他們需要的模塊即可。

  • 要測試一項用 Spring 開發(fā)的應(yīng)用程序十分簡單,因?yàn)闇y試相關(guān)的環(huán)境代碼都已經(jīng)囊括在框架中了。更加簡單的是,利用 JavaBean 形式的 POJO 類,可以很方便的利用依賴注入來寫入測試數(shù)據(jù)。

  • ?Spring 的 Web 框架亦是一個精心設(shè)計的 Web MVC 框架,為開發(fā)者們在 web 框架的選擇上提供了一個除了主流框架比如 Struts、過度設(shè)計的、不流行 web 框架的以外的有力選項。

  • ?Spring 提供了一個便捷的事務(wù)管理接口,適用于小型的本地事物處理(比如在單 DB 的環(huán)境下)和復(fù)雜的共同事物處理(比如利用 JTA 的復(fù)雜 DB 環(huán)境)。

3 、什么是控制反轉(zhuǎn)(IOC) ?什么是依賴注入?

控制反轉(zhuǎn)是應(yīng)用于軟件工程領(lǐng)域中的,在運(yùn)行時被裝配器對象來綁定耦合對象的一種編程技巧,對象之間耦合關(guān)系在編譯時通常是未知的。在傳統(tǒng)的編程方式中,業(yè) 務(wù)邏輯的流程是由應(yīng)用程序中的

早已被設(shè)定好關(guān)聯(lián)關(guān)系的對象來決定的。在使用控制反轉(zhuǎn)的情況下,業(yè)務(wù)邏輯的流程是由對象關(guān)系

圖來決定的,該對象關(guān)系圖由裝配 器負(fù)責(zé)實(shí)例化,這種實(shí)現(xiàn)方式還可以將對象之間的關(guān)聯(lián)關(guān)系的定

義抽象化。而綁定的過程是通過“依賴注入”實(shí)現(xiàn)的。

控制反轉(zhuǎn)是一種以給予應(yīng)用程序中目標(biāo)組件更多控制為目的設(shè)計范式,并在我們的實(shí)際工作中起到

了有效的作用。

依賴注入是在編譯階段尚未知所需的功能是來自哪個的類的情況下,將其他對象所依賴的功能對象

實(shí)例化的模式。這就需要一種機(jī)制用來激活相應(yīng)的組件以提供特定的功能,所以依賴注入是控制反

轉(zhuǎn)的基礎(chǔ)。否則如果在組件不受框架控制的情況下,框架又怎么知道要創(chuàng)建哪個組件?

在 Java 中依然注入有以下三種實(shí)現(xiàn)方式:

1. 構(gòu)造器注入

2. Setter 方法注入

3. 接口注入

4 、請解釋下 Spring? 框架中的 IoC ?

Spring 中的? org.springframework.beans 包和? org.springframework.context 包

構(gòu)成了 Spring 框架 IoC 容器的基礎(chǔ)。

BeanFactory 接口提供了一個先進(jìn)的配置機(jī)制,使得任何類型的對象的配置成為可能。

ApplicationContex 接口對 BeanFactory (是一個子接口)進(jìn)行了擴(kuò)展,在 BeanFactory

的基礎(chǔ)上添加了其他功能,比如與 Spring 的 AOP 更容易集成,也提供了處理 message resource的機(jī)制(用于國際化)、事件傳播以及應(yīng)用層的特別配置,比如針對 Web 應(yīng)用的

WebApplicationContext。

org.springframework.beans.factory.BeanFactory 是 Spring IoC 容器的具體實(shí)現(xiàn),

用來包裝和管理前面提到的各種 bean。BeanFactory 接口是 Spring IoC 容器的核心接口。

IOC:把對象的創(chuàng)建、初始化、銷毀交給 spring 來管理,而不是由開發(fā)者控制,實(shí)現(xiàn)控制反轉(zhuǎn)。

5 、BeanFactory 和 和 ApplicationContext? 有什么區(qū)別?

BeanFactory 可以理解為含有 bean 集合的工廠類。BeanFactory 包含了種 bean 的定義,以便

在接收到客戶端請求時將對應(yīng)的 bean 實(shí)例化。

BeanFactory 還能在實(shí)例化對象的時生成協(xié)作類之間的關(guān)系。此舉將 bean 自身與 bean 客戶端的

配置中解放出來。BeanFactory 還包含 了 bean 生命周期的控制,調(diào)用客戶端的初始化方法

(initialization methods)和銷毀方法(destruction methods)。

從表面上看,application context 如同 bean factory 一樣具有 bean 定義、bean 關(guān)聯(lián)關(guān)系的設(shè)

置,根據(jù)請求分發(fā) bean 的功能。但 applicationcontext 在此基礎(chǔ)上還提供了其他的功能。

1. 提供了支持國際化的文本消息

2. 統(tǒng)一的資源文件讀取方式

3. 已在監(jiān)聽器中注冊的 bean 的事件

以下是三種較常見的 ApplicationContext 實(shí)現(xiàn)方式:

1、ClassPathXmlApplicationContext:從 classpath 的 XML 配置文件中讀取上下文,并生成上下文定義。應(yīng)用程序上下文從程序環(huán)境變量中

ApplicationContext context = new

ClassPathXmlApplicationContext(“bean.xml”);

2、FileSystemXmlApplicationContext :由文件系統(tǒng)中的 XML 配置文件讀取上下文。

ApplicationContext context = new

FileSystemXmlApplicationContext(“bean.xml”);

3、XmlWebApplicationContext:由 Web 應(yīng)用的 XML 文件讀取上下文。

4.AnnotationConfigApplicationContext(基于 Java 配置啟動容器)

6 、Spring? 有幾種配置方式?

將 Spring 配置到應(yīng)用開發(fā)中有以下三種方式:

1. 基于 XML 的配置

2. 基于注解的配置

3. 基于 Java 的配置

7 、如何用基于 XML? 配置的方式配置 Spring ?

在 Spring 框架中,依賴和服務(wù)需要在專門的配置文件來實(shí)現(xiàn),我常用的 XML 格式的配置文件。這些配置文件的格式通常用 <beans>開頭,然后一系列的 bean 定義和專門的應(yīng)用配置選項組成。

SpringXML 配置的主要目的時候是使所有的 Spring 組件都可以用 xml 文件的形式來進(jìn)行配置。這意味著不會出現(xiàn)其他的 Spring 配置類型(比如聲明的方式或基于 Java Class 的配置方式)

Spring 的 XML 配置方式是使用被 Spring 命名空間的所支持的一系列的 XML 標(biāo)簽來實(shí)現(xiàn)的。Spring 有以下主要的命名空間:context、beans、jdbc、tx、aop、mvc 和 aso。

如:

<beans>

<!-- JSON Support -->

<bean name="viewResolver"

class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

<bean name="jsonTemplate"

class="org.springframework.web.servlet.view.json.MappingJackson2JsonV

iew"/>

<bean id="restTemplate"

class="org.springframework.web.client.RestTemplate"/>

</beans>

下面這個 web.xml 僅僅配置了 DispatcherServlet,這件最簡單的配置便能滿足應(yīng)用程序配置運(yùn)行時組件的需求。

<web-app>

<display-name>Archetype Created Web Application</display-name>

<servlet>

<servlet-name>spring</servlet-name>

<servlet-

class>org.springframework.web.servlet.DispatcherServlet</servlet-

class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>spring</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

</web-app>

8 、如何用基于 Java? 配置的方式配置 Spring ?

Spring 對 Java 配置的支持是由@Configuration 注解和@Bean 注解來實(shí)現(xiàn)的。由@Bean 注解的方法將會實(shí)例化、配置和初始化一個 新對象,這個對象將由 Spring 的 IoC 容器來管理。

@Bean 聲明所起到的作用與<bean/> 元素類似。被 @Configuration 所注解的類則表示這個類的主要目的是作為 bean 定義的資源。被@Configuration 聲明的類可以通過在同一個類的 內(nèi)部調(diào)用@bean 方法來設(shè)置嵌入 bean 的依賴關(guān)系。

最簡單的@Configuration 聲明類請參考下面的代碼:

@Configuration

public class AppConfig{

@Bean

public MyService myService() {

return new MyServiceImpl();

}

}

對于上面的@Beans 配置文件相同的 XML 配置文件如下:


<beans>

<bean id="myService" class="com.somnus.services.MyServiceImpl"/>

</beans>

上述配置方式的實(shí)例化方式如下:利用 AnnotationConfigApplicationContext 類進(jìn)行實(shí)例化


public static void main(String[] args) {

ApplicationContext ctx = new

AnnotationConfigApplicationContext(AppConfig.class);

MyService myService = ctx.getBean(MyService.class);

myService.doStuff();

}

要使用組件組建掃描,僅需用@Configuration 進(jìn)行注解即可:

@Configuration

@ComponentScan(basePackages = "com.somnus")

public class AppConfig {

...

}


在上面的例子中,com.acme 包首先會被掃到,然后再容器內(nèi)查找被@Component 聲明的類,找

到后將這些類按照 Sring bean 定義進(jìn)行注冊。

如果你要在你的 web 應(yīng)用開發(fā)中選用上述的配置的方式的話,需要用

AnnotationConfigWebApplicationContext 類來讀 取配置文件,可以用來配置 Spring 的

Servlet 監(jiān)聽器 ContextLoaderListener 或者 Spring MVC 的 DispatcherServlet。

<web-app>

<!-- Configure ContextLoaderListener to use

AnnotationConfigWebApplicationContext

instead of the default XmlWebApplicationContext -->

<context-param>

<param-name>contextClass</param-name>

<param-value>

org.springframework.web.context.support.AnnotationConfigWebApplicatio

nContext

</param-value>

</context-param>

<!-- Configuration locations must consist of one or more comma- or

space-delimited

fully-qualified @Configuration classes. Fully-qualified

packages may also be

specified for component-scanning -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>com.howtodoinjava.AppConfig</param-value>

</context-param>

<!-- Bootstrap the root application context as usual using

ContextLoaderListener -->

<listener>

<listener-

class>org.springframework.web.context.ContextLoaderListener</listener

-class>

</listener>

<!-- Declare a Spring MVC DispatcherServlet as usual -->

<servlet>

<servlet-name>dispatcher</servlet-name>

<servlet-

class>org.springframework.web.servlet.DispatcherServlet</servlet-

class>

<!-- Configure DispatcherServlet to use

AnnotationConfigWebApplicationContext

instead of the default XmlWebApplicationContext -->

<init-param>

<param-name>contextClass</param-name>

<param-value>

org.springframework.web.context.support.AnnotationConfigWebApplicatio

nContext

</param-value>

</init-param>

<!-- Again, config locations must consist of one or more comma-

or space-delimited

and fully-qualified @Configuration classes -->

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>com.howtodoinjava.web.MvcConfig</param-

value>

</init-param>

</servlet>

<!-- map all requests for /app/* to the dispatcher servlet -->

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>/app/*</url-pattern>

</servlet-mapping>

</web-app

9 、怎樣用注解的方式配置 Spring ?

Spring 在 2.5 版本以后開始支持用注解的方式來配置依賴注入??梢杂米⒔獾姆绞絹硖娲?XML 方

式的 bean 描述,可以將 bean 描述轉(zhuǎn)移到組件類的 內(nèi)部,只需要在相關(guān)類上、方法上或者字段聲

明上使用注解即可。注解注入將會被容器在 XML 注入之前被處理,所以后者會覆蓋掉前者對于同一

個屬性的處理結(jié) 果。

注解裝配在 Spring 中是默認(rèn)關(guān)閉的。所以需要在 Spring 文件中配置一下才能使用基于注解的裝配

模式。如果你想要在你的應(yīng)用程序中使用關(guān)于注解的方法的話,請參考如下的配置。

<beans>

<context:annotation-config/>

<!-- bean definitions go here -->

</beans>

在 <context:annotation-config/>標(biāo)簽配置完成以后,就可以用注解的方式在 Spring 中向?qū)?/p>

性、方法和構(gòu)造方法中自動裝配變量。

下面是幾種比較重要的注解類型:

1. @Required:該注解應(yīng)用于設(shè)值方法。

2. @Autowired:該注解應(yīng)用于有值設(shè)值方法、非設(shè)值方法、構(gòu)造方法和變量。

3. @Qualifier:該注解和@Autowired 注解搭配使用,用于消除特定 bean 自動裝配的歧義。

4. JSR-250 Annotations:Spring 支持基于 JSR-250 注解的以下注解,@Resource、

@PostConstruct 和 @PreDestroy。

10 、請解釋 Spring Bean? 的生命周期?

Spring Bean 的生命周期簡單易懂。在一個 bean 實(shí)例被初始化時,需要執(zhí)行一系列的初始化操作

以達(dá)到可用的狀態(tài)。同樣的,當(dāng)一個 bean 不在被調(diào)用時需要進(jìn)行相關(guān)的析構(gòu)操作,并從 bean 容

器中移除。

Spring bean factory 負(fù)責(zé)管理在 spring 容器中被創(chuàng)建的 bean 的生命周期。Bean 的生命周期

由兩組回調(diào)(call back)方法組成。

1. 初始化之后調(diào)用的回調(diào)方法。

2. 銷毀之前調(diào)用的回調(diào)方法。

Spring 框架提供了以下四種方式來管理 bean 的生命周期事件:

  • ?InitializingBean 和 DisposableBean 回調(diào)接口

  • ?針對特殊行為的其他 Aware 接口

  • ?Bean 配置文件中的 Custom init()方法和 destroy()方法

  • ?@PostConstruct 和@PreDestroy 注解方式

使用 customInit() 和? customDestroy()方法管理 bean 生命周期的代碼樣例如

下:

<beans>

<bean id="demoBean" class="com.somnus.task.DemoBean" init-

method="customInit" destroy-method="customDestroy"></bean>

</beans>

11 、Spring Bean? 的作用域之間有什么區(qū)別?

Spring 容器中的 bean 可以分為 5 個范圍。所有范圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:

1. singleton:這種 bean 范圍是默認(rèn)的,這種范圍確保不管接受到多少個請求,每個容器中只有一個

bean 的實(shí)例,單例的模式由 bean factory 自身來維護(hù)。

2. prototype:原形范圍與單例范圍相反,為每一個 bean 請求提供一個實(shí)例。

3. request:在請求 bean 范圍內(nèi)會每一個來自客戶端的網(wǎng)絡(luò)請求創(chuàng)建一個實(shí)例,在請求完成以后,bean 會失效并被垃圾回收器回收。

4. Session:與請求范圍類似,確保每個 session 中有一個 bean 的實(shí)例,在 session 過期后,bean會隨之失效。

5. global- session:global-session 和 Portlet 應(yīng)用相關(guān)。當(dāng)你的應(yīng)用部署在 Portlet 容器中工作時,它包含很多 portlet。如果 你想要聲明讓所有的 portlet 共用全局的存儲變量的話,那么這全局變量需要存儲在 global-session 中。

全局作用域與 Servlet 中的 session 作用域效果相同。


12 、什么是 Spring inner beans ?

在 Spring 框架中,無論何時 bean 被使用時,當(dāng)僅被調(diào)用了一個屬性。一個明智的做法是將這個

bean 聲明為內(nèi)部 bean。內(nèi)部 bean 可以用 setter 注入“屬性”和構(gòu)造方法注入“構(gòu)造參數(shù)”的方式來

實(shí)現(xiàn)。

比如,在我們的應(yīng)用程序中,一個 Customer 類引用了一個 Person 類,我們的要做的是創(chuàng)建一個

Person 的實(shí)例,然后在 Customer 內(nèi)部使用。

public class Customer{

private Person person;

//Setters and Getters

}

public class Person{

private String name;

private String address;

private int age;

//Setters and Getters

}

內(nèi)部 bean 的聲明方式如下:

<bean id="CustomerBean" class="com.somnus.common.Customer">

<property name="person">

<!-- This is inner bean -->

<bean class="com.howtodoinjava.common.Person">

<property name="name" value="lokesh" />

<property name="address" value="India" />

<property name="age" value="34" />

</bean>

</property>

</bean>

13 、Spring? 框架中的單例 Beans? 是線程安全的么?

Spring 框架并沒有對單例 bean 進(jìn)行任何多線程的封裝處理。關(guān)于單例 bean 的線程安全和并發(fā)問題需要開發(fā)者自行去搞定。但實(shí)際上,大部分的 Spring bean 并沒有可變的狀態(tài)(比如 Serview 類和 DAO 類),所以在某種程度上說 Spring 的單例 bean 是線程安全的。如果你的 bean 有多種狀態(tài)的話(比如 View Model 對象),就需要自行保證線程安全。

最淺顯的解決辦法就是將多態(tài) bean 的作用域由“singleton”變更為“prototype”。

14?、如何向 Spring Bean? 中注入一個 Java.util.Properties ?

第一種方法是使用如下面代碼所示的<props> 標(biāo)簽:

<bean id="adminUser" class="com.somnus.common.Customer">

<!-- java.util.Properties -->

<property name="emails">

<props>

<prop key="admin">admin@nospam.com</prop>

<prop key="support">support@nospam.com</prop>

</props>

</property>

</bean>

也可用”util:”命名空間來從 properties 文件中創(chuàng)建出一個 propertiesbean,然后利用 setter 方

法注入 bean 的引用。

15?、請解釋自動裝配模式的區(qū)別?

在 Spring 框架中共有 5 種自動裝配,讓我們逐一分析。

1. no:這是 Spring 框架的默認(rèn)設(shè)置,在該設(shè)置下自動裝配是關(guān)閉的,開發(fā)者需要自行在 bean 定義中用標(biāo)簽明確的設(shè)置依賴關(guān)系。

2. byName:該選項可以根據(jù) bean 名稱設(shè)置依賴關(guān)系。當(dāng)向一個 bean 中自動裝配一個屬性時,容器將根據(jù) bean 的名稱自動在在配置文件中查詢一個匹配的 bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。

3. byType:該選項可以根據(jù) bean 類型設(shè)置依賴關(guān)系。當(dāng)向一個 bean 中自動裝配一個屬性時,容器將根據(jù) bean 的類型自動在在配置文件中查詢一個匹配的 bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。

4. constructor:造器的自動裝配和 byType 模式類似,但是僅僅適用于與有構(gòu)造器相同參數(shù)的

bean,如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的 bean,那么將會拋出異常。

5. autodetect:該模式自動探測使用構(gòu)造器自動裝配或者 byType 自動裝配。首先,首先會嘗試找合適的帶參數(shù)的構(gòu)造器,如果找到的話就是用構(gòu)造器自動裝配,如果在 bean 內(nèi)部沒有找到相應(yīng)的構(gòu)造器或者是無參構(gòu)造器,容器就會自動選擇 byTpe 的自動裝配方式。




一份最詳細(xì)的spring面試題與答案解析的評論 (共 條)

分享到微博請遵守國家法律
德令哈市| 铁岭县| 海安县| 武夷山市| 九台市| 邮箱| 昌都县| 丰城市| 西丰县| 台南县| 陕西省| 承德县| 会泽县| 西峡县| 垫江县| 林甸县| 邢台市| 新丰县| 河曲县| 剑阁县| 公主岭市| 蒲城县| 绩溪县| 贡嘎县| 紫金县| 高邑县| 蒙阴县| 子长县| 虹口区| 黔江区| 军事| 衢州市| 邵东县| 临夏市| 肇州县| 呼和浩特市| 墨竹工卡县| 额敏县| 湖北省| 北碚区| 泸州市|