1、请形容一下 Spring 的事务
(一)申明式事务管理的定义:用在 Spring 配置文件中申明式的处理事务来代替代码式的处理事务。这样的益处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于零碎层面的服务,而不是业务逻辑的一部分,如果想要扭转事务管理策动的话,也只须要在定义文件中重新配置即可,这样保护起来极其不便。
1)基于 TransactionInterceptor 的申明式事务管理:两个主要的属性:transactionManager,用来指定一个事务治 理器,并将具体事务相 关的操作请托给它;其 他一个是 Properties 类型的 transactionAttributes 属性,该属性的每一个键值对中,键指定的是办法名,办法名能够行使通配符,而值就是体现响应办法的所使用的事务属性。
<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 的申明式事务管理:设置配置文件与先前对比简化了许多。咱们把这类设置配置文件格式称为 Spring 经典的申明式事务治理
<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> 命名空间的申明式事务治理:在前两种办法的根底上,Spring 2.x 引入了 <tx> 命名空间,连络行使 <aop> 命名空间,带给开发人员设置装备申明式事务的全新体验。
<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 的申明式事务管理:Spring 2.x 还引入了基于 Annotation 的体式格局,具体主要涉及 @Transactional 标注。@Transactional 能够浸染于接口、接口办法、类和类办法上。算作用于类上时,该类的所有 public 办法将都具备该类型的事务属性。
@Transactional(propagation = Propagation.REQUIRED)
public boolean transfer(Long fromId,Long toId,double amount) {
return bankDao.transfer(fromId,toId,amount);
}
(二)编程式事物治理的定义:在代码中显式挪用 beginTransaction()、commit()、rollback()等事务治理相干的办法,这就是编程式事务管理。Spring 对事物的编程式治理有基于底层 1)API 的编程式治理和基于 TransactionTemplate 的编程式事务管理两种形式。
基 于 底 层 API 的 编 程 式 管 理:凭 证 PlatformTransactionManager、TransactionDefinition 和 TransactionStatus 三个焦点接口,来实现编程式事务管理。
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 的编程式事务管理: 为了不损坏代码原有的条理性,避免出现每一个办法中都包含雷同的启动事物、提交、回滚事物样板代码的景象,spring 提供了 transactionTemplate 模板来实现编程式事务管理。
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 罕用的实现类有哪些?
Bean 工厂是工厂模式的一个实现,提供了管制反转性能,用来把利用的配置和依赖从正真的利用代码中拆散。罕用的 BeanFactory 实现有 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext 等。XMLBeanFactory,最罕用的就是 org.springframework.beans.factory.xml.XmlBeanFactory,它依据 XML 文件中的定义加载 beans。该容器从 XML 文件读取配置元数据并用它去创立一个齐全配置的零碎或利用。
3、解释 Spring JDBC、Spring DAO 和 Spring ORM
1)Spring-DAO 并非 Spring 的一个模块,它实际上是批示你写 DAO 操作、写好 DAO 操作的一些标准。因而,对于拜访你的数据它既没有提供接口也没有提供实现更没有提供模板。在写一个 DAO 的时候,你应该应用 @Repository 对其进行注解,这样底层技术 (JDBC,Hibernate,JPA,等等) 的相干异样能力一致性地翻译为相应的 DataAccessException 子类。
2)Spring-JDBC 提供了 Jdbc 模板类,它移除了连贯代码以帮你专一于 SQL 查问和相干参数。Spring-JDBC 还提供了一个 JdbcDaoSupport,这样你能够对你的 DAO 进行扩大开发。它次要定义了两个属性:一个 DataSource 和一个 JdbcTemplate,它们都能够用来实现 DAO 办法。JdbcDaoSupport 还提供了一个将 SQL 异样转换为 Spring DataAccessExceptions 的异样翻译器。
3)Spring-ORM 是一个囊括了很多长久层技术 (JPA,JDO,Hibernate,iBatis) 的总括模块。对于这些技术中的每一个,Spring 都提供了集成类,这样每一种技术都可能在遵循 Spring 的配置准则下进行应用,并安稳地和 Spring 事务管理进行集成。对于每一种技术,配 置 主 要 在 于 将 一 个 DataSource bean 注入到某种 SessionFactory 或 者 EntityManagerFactory 等 bean 中。纯 JDBC 不须要这样的一个集成类(JdbcTemplate 除外),因为 JDBC 仅依赖于一个 DataSource。
4、简略介绍一下 Spring WEB 模块。
Spring 的 WEB 模块是构建在 application context 模块根底之上,提供一个适宜 web 利用的上下文。这个模块也包含反对多种面向 web 的工作,如通明地解决多个文件上传申请和程序级申请参数的绑定到你的业务对象。它也有对 Jakarta Struts 的反对。
5、Spring 配置文件有什么作用?
Spring 配置文件是个 XML 文件,这个文件蕴含了类信息,形容了如何配置它们,以及如何互相调用。
6、什么是 Spring IOC 容器?
IOC 管制反转:Spring IOC 负责创建对象,治理对象。通过依赖注入(DI),拆卸对象,配置对象,并且治理这些对象的整个生命周期。
7、IOC 的长处是什么?
IOC 或 依赖注入把利用的代码量降到最低。它使利用容易测试,单元测试不再须要单例和 JNDI 查找机制。最小的代价和最小的侵入性使涣散耦合得以实现。IOC 容器反对加载服务时的饿汉式初始化和懒加载。
8、ApplicationContext 的实现类有哪些?
FileSystemXmlApplicationContext:此容器从一个 XML 文件中加载 beans 的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:此容器也从一个 XML 文件中加载 beans 的定义,这里,你须要正确设置 classpath 因为这个容器将在 classpath 里找 bean 配置。
WebXmlApplicationContext:此容器加载一个 XML 文件,此文件定义了一个 WEB 利用的所有 bean。
9、BeanFactory 与 AppliacationContext 有什么区别?
- BeanFactory
根底类型的 IOC 容器,提供残缺的 IOC 服务反对。如果没有非凡指定,默认采纳提早初始化策略。相对来说,容器启动初期速度较快,所需资源无限。
2.ApplicationContext
ApplicationContext 是在 BeanFactory 的根底上构建,是绝对比拟高级的容器实现,除了 BeanFactory 的所有反对外,ApplicationContext 还提供了事件公布、国际化反对等性能。ApplicationContext 治理的对象,在容器启动后默认全副初始化并且绑定实现。
更多面试题可关注 ”demo 锁屏面试题“ 公众号通过小程序或 App 学习面试题