spring框架面試相關問題


Spring 框架中核心組件有三個:Core、Context 和 Beans。其中最核心的組件就是Beans, Spring提供的最核心的功能就是Bean Factory。

Spring 解決了的最核心的問題就是把對象之間的依賴關系轉為用配置文件來管理,也就是Spring的依賴注入機制。這個注入機制是在Ioc 容器中進行管理的。

Bean 組件是在 Spring 的 org.springframework.beans 包下。這個包主要解決了如下功能:Bean 的定義、Bean 的創建以及對 Bean 的解析。對 Spring 的使用者來說唯一需要關心的就是 Bean 的創建,其他兩個由 Spring 內部機制完成。 Spring Bean 的創建采用典型的工廠模式,他的頂級接口是 BeanFactory。

BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。但是從上圖中我們可以發現最終的默認實現類是 DefaultListableBeanFactory,他實現了所有的接口。那為何要定義這么多層次的接口呢?查閱這些接口的源碼和說明發現,每個接口都有他使用的場合,它主要是為了區分在 Spring 內部在操作過程中對象的傳遞和轉化過程中,對對象的數據訪問所做的限制。例如 ListableBeanFactory 接口表示這些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是這些 Bean 是有繼承關系的,也就是每個 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定義 Bean 的自動裝配規則。這四個接口共同定義了 Bean 的集合、Bean 之間的關系、以及 Bean 行為。

Bean 的定義就是完整的描述了在 Spring 的配置文件中你定義的 <bean/> 節點中所有的信息,包括各種子節點。當 Spring 成功解析你定義的一個 <bean/> 節點后,在 Spring 的內部他就被轉化成 BeanDefinition 對象。以后所有的操作都是對這個對象完成的。Bean 的解析過程非常復雜,功能被分的很細,因為這里需要被擴展的地方很多,必須保證有足夠的靈活性,以應對可能的變化。Bean 的解析主要就是對 Spring 配置文件的解析。

Spring框架分為哪七大模塊,各模塊的主要功能作用是什么

七大模塊,如下:

1. Spring Core: Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這里的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關系和配置。

2.Spring Context: 構建於Core封裝包基礎上的 Context封裝包,提供了一種框架式的對象訪問方法,有些象JNDI注冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明創建,比如說通過Servlet容器。

3.Spring DAO:  DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。 並且,JDBC封裝包還提供了一種比編程性更好的聲明性事務管理方法,不僅僅是實現了特定接口,而且對所有的POJOs(plain old Java objects)都適用。

4.Spring ORM: ORM 封裝包提供了常用的“對象/關系”映射APIs的集成層。 其中包括JPAJDOHibernate 和 iBatis 。利用ORM封裝包,可以混合使用所有Spring提供的特性進行“對象/關系”映射,如前邊提到的簡單聲明性事務管理。

5.Spring AOP: Spring的 AOP 封裝包提供了符合AOP Alliance規范的面向方面的編程實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數據功能,還可以將各種行為信息合並到你的代碼中。

6.Spring Web: Spring中的 Web 包提供了基礎的針對Web開發的集成特性,例如多方文件上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。

7.Spring Web MVC: Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型代碼和Web Form之間。並且,還可以借助Spring框架的其他特性。

  1. Spring框架中的三大核心思想是什么

DI(依賴注入),IOC(控制反轉),AOP(面向切面編程)

  1. IOC的概念以及在Spring容器中如何進行IOC的操作。

IOC:Inversion of Control,控制反轉。在Java開發中,IOC意味着將你設計好的類交給系統去控制,而不是在你的類內部控制,這稱為控制反轉,就是被調用類的實例由原先的調用類控制創建、銷毀現在轉變成由Spring的容器管理。

  1. Spring容器是如何管理Bean的生命周期的(如Bean的初始化方法,Bean的銷毀方法)

創建:<bean name=”” class=”” 額外屬性>

初始化:配置init-method/實現接口InitializingBean

調用:context.getBean(),進行方法的調用

銷毀:配置destroy-method/實現DisposableBean接口

  1. DI的概念以及在Spring框架注入有幾種方式。使用構造注入對象,必須要注意什么問題,當設值注入與構造注入同時存在時,執行的先后流程順序

注入方式:

接口注入

屬性注入[屬性的SET/GET]

構造注入[構造方法注入]

使用構造函數依賴注入時,Spring保證所有一個對象所有依賴的對象先實例化后,才實例化這個對象。使用set方法依賴注入時,Spring首先實例化對象,然后才實例化所有依賴的對象。

當設值注入與構造注入同時存在時,先執行設置注入,在執行構造注入。

  1. 使用DI注入時,Property代表什么意思,如果property引用的是其他Bean的話,如何注入,如果引用是字符串的話,如何設置。

使用DI注入時,Property代表注入類的屬性,如果應用其他的bean用ref屬性來表明被引用bean的名稱,如果是引用字符串的話,用value屬性。如:

<property name=”userDao” ref=”被引用bean的名稱” />

<property name=”username” value = “字符串”/>

 

  1. 在Spring框架中獲取連接池有幾種方式。當JNDI與DBCP同時存在時,會不會出現問題,如果不能同時存在的話,請說明原因

四種方式,如下:

1:DBCP數據源

DBCP類包位於 <SPRING_HOME>/lib/jakarta-commons/commons-dbcp.jar,DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫連接池,所以在類路徑下還必須包括<SPRING_HOME>/lib/jakarta-commons/commons-pool.jar。下面是使用DBCP配置oracle數據源的配置片斷:

<bean id=”dataSource”
class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>
<property name=”driverClassName”

value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>

2:C3P0數據源

C3P0是一個開放源代碼的JDBC數據源實現項目,它在lib目錄中與Hibernate一起發布,實現了JDBC3和JDBC2擴展規范說明的Connection 和Statement 池。C3P0類包位於<SPRING_HOME>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一個Oracle數據源:

<bean id=”dataSource” class=”com.mchange.v2.c3p0.ComboPooledDataSource” destroy-method=”close”>
<property name=”driverClassName”

value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>

 

3. Spring的數據源實現類(DriverManagerDataSource)

Spring本身也提供了一個簡單的數據源實現類DriverManagerDataSource ,它位於org.springframework.jdbc.datasource包中。這個類實現了javax.sql.DataSource接口,但它並沒有提供池化連接的機制,每次調用getConnection()獲取新連接時,只是簡單地創建一個新的連接。因此,這個數據源類比較適合在單元測試或簡單的獨立應用中使用,因為它不需要額外的依賴類。

<bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource” destroy-method=”close”>
<property name=”driverClassName”

value=” oracle.jdbc.driver.OracleDriver ” />
<property name=”url” value=”jdbc:oracle:thin:@localhost:1521:orcl />
<property name=”username” value=”root” />
<property name=”password” value=”1234″ />
</bean>

 

4.獲取JNDI數據源

如果應用配置在高性能的應用服務器(如WebLogic或Websphere等)上,我們可能更希望使用應用服務器本身提供的數據源。應用服務器的數據源使用JNDI開放調用者使用,Spring為此專門提供引用JNDI資源的JndiObjectFactoryBean類。下面是一個簡單的配置:

<bean id=”dataSource”

class=”org.springframework.jndi.JndiObjectFactoryBean”>
<property name=”jndiName” value=”java:comp/env/jdbc/oracle”/>
</bean>

通過jndiName指定引用的JNDI數據源名稱。

  1. 在使用Spring的JDBCTemplate操作數據時,必須要往模板中注入哪些對象,同時模板要不要手動關閉數據庫連接

注入DataSource數據源對象

不要手動關閉數據庫連接,JdbcTemplate會幫我們關閉數據庫連接

  1. JdbcTemplate的QueryForList方法得到List集合,請問List集合中每一個對象為什么數據類型,在JSP頁面使用EL表達式如何取值。

每一個對象為java.util.Map類型的數據,EL表達式里用<c:foreach>取值

  1. AOP的概念以及使用AOP機制有什么好處。Java編程中實現AOP有幾種方式

AOP的概念是Aspected Oriented Programming 面身向方面編程。

好處:AOP將程序分解成各個方面或者說關注點。這使得可以模塊化,相當橫向上分切了。它可以解決OOP和過程化方法不能夠很好解決的橫切(crosscut)問題,如:事務、安全、日志等橫切關注

實現AOP有幾種方式:

1. Spring 1.2版本中通過ProxyFactoryBean來實現aop,即通過動態代理來實現的,Aspect必須繼承MethodBeforeAdvice,MethodAfterAdvice等

2. Spring 2.0 AOP需要改的是FBI 這個類,而且它也不需要再實現某些接口

3. 三使用標注(@AspectJ)實現AOP

  1. Spring框架中的事務處理有幾種。請分別闡述兩者的區別

spring提供的事務管理可以分為兩類:編程式的和聲明式的。

編程式的,比較靈活,但是代碼量大,存在重復的代碼比較多;

聲明式的比編程式的更靈活.

 

  1. 編程式事務的總接口是什么?使用編程式事務需要用到哪幾個Spring事務的核心類對象

總接口

PlatformTransactionManager接口,

核心類:

  • TransactionDefinition //事務屬性定義
  • TranscationStatus //代表了當前的事務,可以提交,回滾。
  • PlatformTransactionManager核心接口的子類
  1. Spring的聲明式事務能不能為普通的類產生代理接口,能不能在代碼中使用Try/Catch能捕獲異常,如果不可以,請說明原因

不能。Spring的聲明式事務為實現類產生代理。不能在代碼中使用Try/Catch,因為代碼中捕獲了異常,Spring容器捕獲不了異常。

  1. 使用TransactionProxyFactoryBean為Bean產生事務物理時,需要哪幾個屬性值的設置:
<bean name=”baseTransactionProxy” class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>

<!–  為事務代理bean注入事務管理器–>

<property name=”transactionManager” ref=”transactionManager”>

</property><!–  設置事務屬性–>

<property name=”transactionAttributes”>

<props><!–  所有方法采用required的事務策略 ->

<prop key=”*”>PROPAGATION_REQUIRED</prop>

</props>

</property><!–  為事務代理bean設置目標bean –>

<property name=”target” ref=”userDao”>

</property>

</bean><!–  目標bean –>

<bean   name=”userDao” class=”com.dao.userDao”>

<property name=”dataSource” ref=”dataSource” /></property>

</bean>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM