最全Spring面試題(三)
1、什么是 Spring 的依賴注入?
平常的 java 開發(fā)中,程序員在某個(gè)類中需要依賴其它類的方法,則通常是 new 一個(gè)依賴類再調(diào)用類實(shí)例的方法,這種開發(fā)存在的問題是 new 的類實(shí)例不好統(tǒng)一管理,spring 提出了依賴注入的思想,即依賴類不由程序員實(shí)例化,而是通過 spring 容器幫我們 new 指定實(shí)例并且將實(shí)例注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉(zhuǎn)”,通俗的理解是:平常我們 new 一個(gè)實(shí)例,這個(gè)實(shí)例的控制權(quán)是我們程序員,而控制反轉(zhuǎn)是指 new 實(shí)例工作不由我們程序員來做而是交給 spring 容器來做。
?
2、有哪些不同類型的依賴注入方式?
Spring 提供了多種依賴注入的方式。
1.?Set 注入
<!--配置bean,配置后該類由spring管理-->
<bean name="springAction" class="com.bless.springdemo.action.SpringAction">
<!--依賴注入,配置當(dāng)前類中相應(yīng)的屬性-->
<property name="springDao" ref="springDao"></property>
</bean>
<bean?name="springDao" ?class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
?
2.?構(gòu)造器注入
<!--配置bean,配置后該類由spring管理-->
<bean name="springAction" class="com.bless.springdemo.action.SpringAction">
<!--創(chuàng)建構(gòu)造器注入,如果主類有帶參的構(gòu)造方法則需添加此配置-->
<constructor-arg ref="springDao"></constructor-arg>
<constructor-arg ref="user"></constructor-arg>
</bean>
<bean name="springDao" ?class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
<bean name="user" class="com.bless.springdemo.vo.User"></bean>
?
3.?靜態(tài)工廠的方法注入
<!--配置bean,配置后該類由spring管理-->
<bean name="springAction" class="com.bless.springdemo.action.SpringAction" >
<!--使用靜態(tài)工廠的方法注入對象,對應(yīng)下面的配置文件)-->
<property name="staticFactoryDao" ref="staticFactoryDao"></property>
</property>
</bean>
<!--此處獲取對象的方式是從工廠類中獲取靜態(tài)方法-->
<bean name="staticFactoryDao" ?class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
?
4.?實(shí)例工廠的方法注入
<!--配置bean,配置后該類由spring管理-->
<bean name="springAction" class="com.bless.springdemo.action.SpringAction">
<!--使用實(shí)例工廠的方法注入對象,對應(yīng)下面的配置文件-->
<property name="factoryDao" ref="factoryDao"></property>
</bean>
<!--此處獲取對象的方式是從工廠類中獲取實(shí)例方法-->
<bean name="daoFactory" ?class="com.bless.springdemo.factory.DaoFactory"></bean>
<bean name="factoryDao" factory-bean="daoFactory" ?factory-method="getFactoryDaoImpl"></bean>
3、什么是 Spring beans?
Spring beans 是那些形成 Spring 應(yīng)用的主干的 java 對象。它們被 Spring IOC 容器初始化,裝配,和管理。這些 beans 通過容器中配置的元數(shù)據(jù)創(chuàng)建。比如,以 XML 文件中<bean/> 的形式定義。Spring 框架定義的 beans 默認(rèn)都是單例 beans。
?
4、一個(gè) Spring Beans 的定義需要包含什么?
一個(gè) Spring Bean 的定義包含容器必知的所有配置元數(shù)據(jù),包括如何創(chuàng)建一個(gè) bean,它的生命周期詳情及它的依賴。
?
5、你怎樣定義類的作用域?
當(dāng)定義一個(gè)<bean> 在 Spring 里,我們還能給這個(gè) bean 聲明一個(gè)作用域。它可以通過 bean 定義中的 Scope 屬性來定義。如,當(dāng) Spring 要在需要的時(shí)候每次生產(chǎn)一個(gè)新的 bean 實(shí)例,bean 的 Scope 屬性被指定為 prototype。
另一方面,一個(gè) bean 每次使用的時(shí)候必須返回同一個(gè)實(shí)例,這個(gè) bean 的 Scope 屬性必須設(shè)為 singleton。
?
6、Spring 支持的幾種 bean 的作用域?
Spring 框架支持以下五種 bean 的作用域:
singleton : bean 在每個(gè) Spring ioc 容器中只有一個(gè)實(shí)例。
prototype:一個(gè) bean 的定義可以有多個(gè)實(shí)例。
request:每次 http 請求都會(huì)創(chuàng)建一個(gè) bean,該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效。
session :在一個(gè) HTTP Session 中 , 一 個(gè) bean 定義對應(yīng)一個(gè)實(shí)例。該作用域僅在基于 web 的Spring ApplicationContext 情形下有效。
global-session:在一個(gè)全局的 HTTP Session 中,一個(gè) bean 定義對應(yīng)一個(gè)實(shí)例。該作用域僅在基于 web 的Spring ApplicationContext 情形下有效。
缺省的 Spring bean 的作用域是 Singleton。
?
7、Spring 框架中的單例 bean 是線程安全的嗎?
不是線程安全的。
?
8、什么是 Spring 的內(nèi)部 bean?
當(dāng)一個(gè) bean 僅被用作另一個(gè) bean 的屬性時(shí),它能被聲明為一個(gè)內(nèi)部 bean,為了定義 inner bean,在Spring 的 基于 XML 的 配置元數(shù)據(jù)中,可以在 <property/>或 <constructor-arg/> 元素內(nèi)使用<bean/> 元素,內(nèi)部 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="person2" class="com.itdjx.spring.dependency.injection.Person">
????????<property name="name" value="李玉"/>
????????<property name="age" value="23"/>
????????<property name="sex" value="女"/>
????????<property name="car" >
????????????<bean class="com.itdjx.spring.dependency.injection.Car">
????????????????<constructor-arg value="Ferrari" index="0"/>
????????????????<constructor-arg value="Italy" index="1"/>
????????????????<constructor-arg value="22500000" type="double"/>
????????????</bean>
????????</property>
????</bean>
</beans>
更多面試題可關(guān)注"demo鎖屏面試題"公眾號(hào)通過小程序或App學(xué)習(xí)面試題
