副标题#e#
引言
在软件开拓中呈现过各类百般的框架,开源软件的鼓起,使得各类百般的框架纷纷呈现,譬喻,Apache组织下就拥有诸多的框架类产物。框架就是一组协同事情的类,它们为特定范例的软件构筑了一个可重用的设计。然而,传统的框架使得应用措施组件过度依赖于框架中的类,这种耦合度的提高低落了组件的复用性。Spring框架的呈现,使得组件之间更松散的耦合成为了大概。
Spring框架简介
Spring框架是一个2003年2月才呈现的开源项目,该开源项目发源自Rod Johnson在2002年尾出书的《Expert One-on-One J2EE Design and Development》一书中的基本性代码。在该书中,Rod Johnson建议J2EE实用主义的设计思想,而Spring框架正是这一思想的更全面和详细的实现。Spring框架由一个容器,一个设置和组织组件的框架,和一组内置的为事务、耐久化和Web用户接口提供的处事构成。作为一种轻量级的J2EE框架,Spring提供了一种有效的方法来成立和组织J2EE应用措施。
1、Spring特性
IoC(Inversion of Control;节制反转);又称DI(Dependency Injection;依赖注入);是面向工具规模新兴的编程思想;也是Spring的精华地址。简朴地说;IoC就是指措施之间的干系由容器来节制;而不是传统实现中由措施代码直接操控。这也就是所谓“节制反转”的观念地址:节制权由应用代码转到外部容器,节制权的转移,也就是所谓的反转。IoC将节制建设的职责搬进了框架中;并把它从应用代码脱分开来。当利用Spring的IoC容器时只需指出组件需要的工具,在运行时Spring的IoC容器会按照XML设置数据提供应它。
Spring IoC,借助于依赖注入设计模式,使得开拓者不消剖析工具自身的生命周期极其干系,并且可以或许改进开拓者对模式的利用。对付一个工具的打点不是什么坚苦,难就难在对整个工具群的打点。依赖注入可以让容器打点工具,即“Don’t call me, I will call you”。这样工具自己的生命周期以及工具之间的干系就不再让开拓者费心了。
Spring AOP,借助于Spring实现拦截器,开拓者可以或许实现以声名方法利用企业级处事,好比安详性处事、事务处事。AOP 公道的增补了OOP,借助于Spring AOP,开拓者可以或许高效的利用J2EE处事。
Spring处事抽象,借助于各类J2EE API抽象,使得开拓者可以或许一致地利用J2EE 技能,而不管详细是利用什么J2EE API,借助于Spring处事抽象,使代码大大淘汰,满意“更少代码,更少BUG”的软件设计原则。
Spring IoC+Spring AOP+Spring处事抽象,一起形成Spring,这样一个有机体,使构建轻量级J2EE成为大概。
Spring提供的事务打点
Spring提供的事务打点可以分为两类:编程式的和声明式的。编程式的,较量机动,可是代码量大,存在反复的代码较量多;声明式的比编程式的更机动利便。
#p#副标题#e#
1、传统利用JDBC的事务打点
以往利用JDBC举办数据操纵,利用DataSource,从数据源中获得Connection,我们知道数据源是线程安详的,而毗连不是线程安详的,所以对每个请求都是从数据源中从头取出一个毗连。一般的数据源由容器举办打点,包罗毗连池。譬喻TOMCAT,WEBSPHERE,WEBLOGIC等这些J2EE贸易容器都提供了这个成果。
以往的我们利用JDBC在写代码时,事务打点大概会是这样:
Connection conn = null;
try{
conn = DBConnectionFactory.getConnection;
conn.setAutoCommit(false);
//do something
conn.commit(); //commit transcation
}catch(Exception e){
conn.rollback();
}
finally{
try{
conn.close();
} catch(SQLException se){ //do sth.}
//close ResultSet,PreparedStatement,Connection
//notice:Maybe ocurr Exception when u close rs,pstmt,conn
}
凭据以往的思路来写代码,代码量较量长,并且容易疏忽,忘掉一些try/catch,激发一些异常无法catch,固然有时候我们会写DBTool类,来封锁这些资源,而且担保在封锁这些资源时,不向外抛异常,可是这样做会导致特另外贫苦。
2、Spring提供的编程式的事务处理惩罚
Spring提供了几个关于事务处理惩罚的类:TransactionDefinition //事务属性界说
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于打点事务的基本接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们利用的事务打点类譬喻DataSourceTransactionManager等都是这个类的子类。
我们利用编程式的事务打点流程大概如下:
(1) 声明数据源。
(2) 声明一个事务打点类,譬喻:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
(3) 在我们的代码中插手事务处理惩罚代码:
#p#分页标题#e#
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}
}
}
TransactionTemplate也是为我们省去了部门事务提交、回滚代码;界说事务模板时,需注入事务打点工具。
3、Spring声明式事务处理惩罚
Spring声明式事务处理惩罚也主要利用了IoC,AOP思想,提供了TransactionInterceptor拦截器和常用的署理类TransactionProxyFactoryBean,可以直接对组件举办事务署理。
利用TransactionInterceptor的步调:
(1)界说数据源,事务打点类
(2)界说事务拦截器,譬喻:
<bean id = "transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributeSource">
<value>
com.test.UserManager.*r=PROPAGATION_REQUIRED
</value>
</property>
</bean>
(3)为组件声明一个署理类:ProxyFactoryBean
<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>com.test.UserManager</value></property>
<property name="interceptorNames">
<list>
<idref local="transactionInterceptor"/>
</list>
</property>
</bean>
利用TransactionProxyFactoryBean:
<bean id="userManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref local="userManagerTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
TransactionProxyFactoryBean只是为组件的事务署理,假如我们要给组件添加一些业务方面的验证等,可以利用TransactionTemplate加拦截器方法,为组件添加多个拦截器,spring AOP中提供了三类Advice,即前加强,后加强,抛出异常时的加强,可以机动利用。
竣事语
Spring可以简朴的把普通的java class纳入事务打点,声明性的事务操纵起来也很容易。有了Spring之后,声明性事务不再是EJB独占,我们不必为了得到声明性事务的成果而去忍受EJB带来的各种未便。Spring还提供了惟一的事务打点抽象,它可以或许在各类底层事务打点技能(如JTA可能JDBC)之上提供一个一致的编程模子。