Java面试系列22-spring(1)优点、IOC、DI、事务等

1.Spring的优点有什么?


Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分


Spring是POJO编程,POJO编程使得可持续构建和可测试能力提高


依赖注入和IoC使得JDBC操作简单化


Spring是开源的免费的


Spring使得对象管理集中化合简单化

2.描述一下spring中实现DI(dependency injection)的几种方式


方式一:接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。


方式二:Type2 IoC: Setter injection对象创建之后,将被依赖对象通过set方法设置进去


方式三:Type3 IoC: Constructor injection对象创建时,被依赖对象以构造方法参数的方式注入

Spring的方式

3.简单描述下IOC(inversion of control)的理解


一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但这种方法显然两者的依赖(Dependency)太大了。


而IoC的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IoC的 容器(Container)中,通过一定的配置由容器(Container)来实现类A与接口B的实现C的关联。

4.Spring对很多ORM框架提供了很好支持,描述下在spring使用hibernate的方法


在context中定义DataSource,创建SessionFactoy,设置参数;


DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。


在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor

5.请介绍下spring的事务管理


spring提供了几个关于事务处理的类:


TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。


一般事务定义步骤:

TransactionDefinition td = new TransactionDefinition();

TransactionStatus ts = transactionManager.getTransaction(td);

try

//do sth

transactionManager.commit(ts);

}

catch(Exception e){transactionManager.rollback(ts);

}


spring提供的事务管理可以分为两类:


编程式的和声明式的。

编程式的,比较灵活,但是代码量大,存在重复的代码比较多;

声明式的比编程式的更灵活。


编程式​主要使用transactionTemplate。

省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.

void add()

{

transactionTemplate.execute( new TransactionCallback(){

pulic Object doInTransaction(TransactionStatus ts)

//do sth

}

}

}


声明式​:

使用TransactionProxyFactoryBean:


PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly 

围绕Poxy的动态代理 能够自动的提交和回滚事务

org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 


PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。


PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。


PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。


PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 


PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。


PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。


如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。