Spring面試題(二)
1、請(qǐng)描述一下 Spring 的事務(wù)
(一)聲明式事務(wù)管理的定義:用在 Spring 配置文件中聲明式的處理事務(wù)來(lái)代替代碼式的處理事務(wù)。這樣的好處是,事務(wù)管理不侵入開(kāi)發(fā)的組件,具體來(lái)說(shuō),業(yè)務(wù)邏輯對(duì)象就不會(huì)意識(shí)到正在事務(wù)管理之中,事實(shí)上也應(yīng)該如此,因?yàn)槭聞?wù)管理是屬于系統(tǒng)層面的服務(wù),而不是業(yè)務(wù)邏輯的一部分,如果想要改變事務(wù)管理策劃的話,也只需要在定義文件中重新配置即可,這樣維護(hù)起來(lái)極其方便。
1)基于 TransactionInterceptor 的聲明式事務(wù)管理:兩個(gè)次要的屬性: transactionManager,用來(lái)指定一個(gè)事務(wù)治 理器,并將具體事務(wù)相 關(guān)的操作請(qǐng)托給它;其 他一個(gè)是 Properties 類(lèi)型的transactionAttributes 屬性,該屬性的每一個(gè)鍵值對(duì)中,鍵指定的是方法名,方法名可以行使通配符,而值就是表現(xiàn)呼應(yīng)方法的所運(yùn)用的事務(wù)屬性。
?<beans...>
<bean id="transactionInterceptor"
?class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
?<property name="transactionAttributes">
?<props>
?<prop key="transfer">PROPAGATION_REQUIRED</prop>
? </props>
?</property>
</bean>
?<bean id="bankServiceTarget"
class="footmark.spring.core.tx.declare.origin.BankServiceImpl">
?<property name="bankDao" ref="bankDao"/>
?</bean>
?<bean id="bankService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
?<property name="interceptorNames">
<list>
<idref bean="transactionInterceptor"/>
. </list>
?</property>
?</bean>
</beans>
2)基于 TransactionProxyFactoryBean 的聲明式事務(wù)管理:設(shè)置配置文件與先前比照簡(jiǎn)化了許多。我們把這類(lèi)設(shè)置配置文件格式稱為 Spring 經(jīng)典的聲明式事務(wù)治理
<beans......>
<bean id="bankServiceTarget"
?class="footmark.spring.core.tx.declare.classic.BankServiceImpl">
?<property name="bankDao" ref="bankDao"/>
?</bean>
<bean id="bankService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
?<props>
?<prop key="transfer">PROPAGATION_REQUIRED</prop>
?</props>
</property>
?</bean>
3)基于 <tx> 命名空間的聲明式事務(wù)治理:在前兩種方法的基礎(chǔ)上,Spring 2.x 引入了 <tx> 命名空間,連絡(luò)行使 <aop> 命名空間,帶給開(kāi)發(fā)人員設(shè)置配備聲明式事務(wù)的全新體驗(yàn)。
<beans......>
?<bean id="bankService"
?class="footmark.spring.core.tx.declare.namespace.BankServiceImpl">
?<property name="bankDao" ref="bankDao"/>
?</bean>
<tx:advice id="bankAdvice" transaction-manager="transactionManager">
?<tx:attributes>
?<tx:method name="transfer" propagation="REQUIRED"/>
?</tx:attributes>
?</tx:advice>
?<aop:config>
<aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/>
?<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config>
</beans>
3)基于 @Transactional 的聲明式事務(wù)管理:Spring 2.x 還引入了基于 Annotation 的體式格式,具體次要觸及@Transactional 標(biāo)注。@Transactional 可以浸染于接口、接口方法、類(lèi)和類(lèi)方法上。算作用于類(lèi)上時(shí),該類(lèi)的一切public 方法將都具有該類(lèi)型的事務(wù)屬性。
?@Transactional(propagation = Propagation.REQUIRED)
?public boolean transfer(Long fromId, Long toId, double amount) {
?return bankDao.transfer(fromId, toId, amount);
}
(二)編程式事物管理的定義:在代碼中顯式挪用 beginTransaction()、commit()、rollback()等事務(wù)治理相關(guān)的方法,這就是編程式事務(wù)管理。Spring 對(duì)事物的編程式管理有基于底層 1)API 的編程式管理和基于 TransactionTemplate 的編程式事務(wù)管理兩種方式。
基 于 底 層 API 的 編 程 式 管 理 : 憑 證 PlatformTransactionManager 、 TransactionDefinition 和TransactionStatus 三個(gè)焦點(diǎn)接口,來(lái)實(shí)現(xiàn)編程式事務(wù)管理。
Public class BankServiceImpl implements BancService{
Private BanckDao bankDao;
private TransactionDefinition txDefinition;
?private PlatformTransactionManager txManager;
?public boolean transfer(Long fromId, Long toId, double amount) {
?TransactionStatus txStatus = txManager.getTransaction(txDefinition);
?boolean result = false;
?try {
?result = bankDao.transfer(fromId, toId, amount);
?txManager.commit(txStatus);
} catch (Exception e) {
?result = false;
?txManager.rollback(txStatus);
System.out.println("Transfer Error!");
?}
?return result;
}
}
2)基于 TransactionTemplate 的編程式事務(wù)管理:為了不損壞代碼原有的條理性,避免出現(xiàn)每一個(gè)方法中都包括相同的啟動(dòng)事物、提交、回滾事物樣板代碼的現(xiàn)象,spring 提供了 transactionTemplate 模板來(lái)實(shí)現(xiàn)編程式事務(wù)管理。
public class BankServiceImpl implements BankService {
private BankDao bankDao;
?private TransactionTemplate transactionTemplate;.
?public boolean transfer(final Long fromId, final Long toId, final double amount) {
return (Boolean) transactionTemplate.execute(new TransactionCallback(){
?public Object doInTransaction(TransactionStatus status) {
Object result;
?try {
result = bankDao.transfer(fromId, toId, amount);
} catch (Exception e) {
status.setRollbackOnly();
result = false;
System.out.println("Transfer Error!");
?}
return result;
}
?});
}
?}
2、BeanFactory 常用的實(shí)現(xiàn)類(lèi)有哪些?
Bean 工廠是工廠模式的一個(gè)實(shí)現(xiàn),提供了控制反轉(zhuǎn)功能,用來(lái)把應(yīng)用的配置和依賴從正真的應(yīng)用代碼中分離。常用的 BeanFactory 實(shí)現(xiàn)有DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等。XMLBeanFactory,最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它根據(jù) XML 文件中的定義加載 beans。該容器從 XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個(gè)完全配置的系統(tǒng)或應(yīng)用。
3、解釋 Spring JDBC、Spring DAO 和 Spring ORM
1)Spring-DAO 并非 Spring 的一個(gè)模塊,它實(shí)際上是指示你寫(xiě) DAO 操作、寫(xiě)好 DAO 操作的一些規(guī)范。因此,對(duì)于訪問(wèn)你的數(shù)據(jù)它既沒(méi)有提供接口也沒(méi)有提供實(shí)現(xiàn)更沒(méi)有提供模板。在寫(xiě)一個(gè) DAO 的時(shí)候,你應(yīng)該使用 @Repository 對(duì)其進(jìn)行注解,這樣底層技術(shù)(JDBC,Hibernate,JPA,等等)的相關(guān)異常才能一致性地翻譯為相應(yīng)的 DataAccessException 子類(lèi)。
2)Spring-JDBC 提供了 Jdbc 模板類(lèi),它移除了連接代碼以幫你專(zhuān)注于 SQL 查詢和相關(guān)參數(shù)。Spring-JDBC 還提供了一個(gè) JdbcDaoSupport,這樣你可以對(duì)你的 DAO 進(jìn)行擴(kuò)展開(kāi)發(fā)。它主要定義了兩個(gè)屬性:一個(gè) DataSource 和一個(gè) JdbcTemplate,它們都可以用來(lái)實(shí)現(xiàn) DAO 方法。JdbcDaoSupport 還提供了一個(gè)將 SQL 異常轉(zhuǎn)換為Spring DataAccessExceptions 的異常翻譯器。
3)Spring-ORM 是一個(gè)囊括了很多持久層技術(shù)(JPA,JDO,Hibernate,iBatis)的總括模塊。對(duì)于這些技術(shù)中的每一個(gè),Spring 都提供了集成類(lèi),這樣每一種技術(shù)都能夠在遵循 Spring 的配置原則下進(jìn)行使用,并平穩(wěn)地和 Spring 事務(wù)管理進(jìn)行集成。對(duì)于每一種技術(shù) , 配 置 主 要 在 于 將 一 個(gè) DataSource bean 注入到某種 SessionFactory 或 者 EntityManagerFactory 等 bean 中。純 JDBC 不需要這樣的一個(gè)集成類(lèi)(JdbcTemplate 除外),因?yàn)?JDBC 僅依賴于一個(gè) DataSource。
4、簡(jiǎn)單介紹一下 Spring WEB 模塊。
Spring 的 WEB 模塊是構(gòu)建在 Application context 模塊基礎(chǔ)之上,提供一個(gè)適合 web 應(yīng)用的上下文。這個(gè)模塊也包括支持多種面向 web 的任務(wù),如透明地處理多個(gè)文件上傳請(qǐng)求和程序級(jí)請(qǐng)求參數(shù)的綁定到你的業(yè)務(wù)對(duì)象。它也有對(duì) Jakarta Struts 的支持。
5、Spring 配置文件有什么作用?
Spring 配置文件是個(gè) XML 文件,這個(gè)文件包含了類(lèi)信息,描述了如何配置它們,以及如何相互調(diào)用。
6、什么是 Spring IOC 容器?
IOC 控制反轉(zhuǎn):Spring IOC 負(fù)責(zé)創(chuàng)建對(duì)象,管理對(duì)象。通過(guò)依賴注入(DI),裝配對(duì)象,配置對(duì)象,并且管理這些對(duì)象的整個(gè)生命周期。
7、IOC 的優(yōu)點(diǎn)是什么?
IOC 或 依賴注入把應(yīng)用的代碼量降到最低。它使應(yīng)用容易測(cè)試,單元測(cè)試不再需要單例和 JNDI 查找機(jī)制。最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn)。IOC 容器支持加載服務(wù)時(shí)的餓漢式初始化和懶加載。
8、ApplicationContext 的實(shí)現(xiàn)類(lèi)有哪些?
FileSystemXmlApplicationContext :此容器從一個(gè) XML 文件中加載 beans 的定義,XML Bean 配置文件的全路徑名必須提供給它的構(gòu)造函數(shù)。
ClassPathXmlApplicationContext:此容器也從一個(gè) XML 文件中加載 beans 的定義,這里,你需要正確設(shè)置classpath 因?yàn)檫@個(gè)容器將在 classpath 里找 bean 配置。
WebXmlApplicationContext:此容器加載一個(gè) XML 文件,此文件定義了一個(gè) WEB 應(yīng)用的所有bean。
9、BeanFactory 與 AppliacationContext 有什么區(qū)別?
1. BeanFactory
基礎(chǔ)類(lèi)型的 IOC 容器,提供完整的 IOC 服務(wù)支持。如果沒(méi)有特殊指定,默認(rèn)采用延遲初始化策略。相對(duì)來(lái)說(shuō),容器啟動(dòng)初期速度較快,所需資源有限。
2.ApplicationContext
ApplicationContext 是在 BeanFactory 的基礎(chǔ)上構(gòu)建,是相對(duì)比較高級(jí)的容器實(shí)現(xiàn),除了 BeanFactory 的所有支持外,ApplicationContext 還提供了事件發(fā)布、國(guó)際化支持等功能。ApplicationContext 管理的對(duì)象,在容器啟動(dòng)后默認(rèn)全部初始化并且綁定完成。
更多面試題可關(guān)注"demo鎖屏面試題"公眾號(hào)通過(guò)小程序或App學(xué)習(xí)面試題?
