??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲伊人久久大香线蕉啊,亚洲熟妇av一区二区三区 ,亚洲国产成人精品女人久久久 http://www.tkk7.com/jxhkwhy/category/43640.htmlzh-cnMon, 18 Jan 2010 11:56:50 GMTMon, 18 Jan 2010 11:56:50 GMT60Spring 框架??http://www.tkk7.com/jxhkwhy/articles/309974.htmlUR?/dc:creator>UR?/author>Mon, 18 Jan 2010 09:06:00 GMThttp://www.tkk7.com/jxhkwhy/articles/309974.htmlhttp://www.tkk7.com/jxhkwhy/comments/309974.htmlhttp://www.tkk7.com/jxhkwhy/articles/309974.html#Feedback0http://www.tkk7.com/jxhkwhy/comments/commentRss/309974.htmlhttp://www.tkk7.com/jxhkwhy/services/trackbacks/309974.html

Spring AOP ?IOC 容器入门

developerWorks
文选项

样例代码


U别Q?初

Naveen Balani (naveenbalani@rediffmail.com), 技术架构师, Webify Solutions

2005 q?8 ?18 ?/p>

在这׃部分l成的介l?Spring 框架的系列文章的W一期中Q将开始学习如何用 Spring 技术构量的、强壮的 J2EE 应用E序。developerWorks 的定期投Eh Naveen Balani 通过介绍 Spring 框架开始了他由三部分组成的 Spring pdQ其中还介l?Spring 面向斚w的编E(AOPQ和控制反{QIOCQ容器?/blockquote>

Spring 是一个开源框Ӟ是ؓ了解决企业应用程序开发复杂性而创建的。框架的主要优势之一是其分层架构,分层架构允许您选择使用哪一个组Ӟ同时?J2EE 应用E序开发提供集成的框架?/p>

在这由三部分组成的 Spring pd 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的角度描q该框架的功能,然后讨Z个最有趣的模块:Spring 面向斚w~程QAOPQ和控制反{ QIOCQ?容器。接着用几个示例演C?IOC 容器在典型应用程序用例场景中的应用情c这些示例还成为本pd后面部分q行的展开式讨论的基础Q在本文的后面部分,介l?Spring 框架通过 Spring AOP 实现 AOP 构造的方式?/p>

请参?下蝲Q下?Spring 框架?Apache AntQ运行本pd的示例应用程序需要它们?/p>

Spring 框架

Spring 框架是一个分层架构,?7 个定义良好的模块l成。Spring 模块构徏在核心容器之上,核心容器定义了创建、配|和理 bean 的方式,如图 1 所C?/p>
?1. Spring 框架?7 个模?/strong>
Spring 框架囄

l成 Spring 框架的每个模块(或组Ӟ都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下Q?

  • 核心容器Q核心容器提?Spring 框架的基本功能。核心容器的主要lg?BeanFactoryQ它是工厂模式的实现?code>BeanFactory 使用控制反{ QIOCQ?模式应用程序的配置和依赖性规范与实际的应用程序代码分开?/li>
  • Spring 上下?/strong>QSpring 上下文是一个配|文Ӟ?Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能?/li>
  • Spring AOPQ通过配置理Ҏ,Spring AOP 模块直接面向方面的~程功能集成C Spring 框架中。所以,可以很容易地?Spring 框架理的Q何对象支?AOP。Spring AOP 模块为基?Spring 的应用程序中的对象提供了事务理服务。通过使用 Spring AOPQ不用依?EJB lgQ就可以声明性事务管理集成到应用E序中?/li>
  • Spring DAOQJDBC DAO 抽象层提供了有意义的异常层次l构Q可用该l构来管理异常处理和不同数据库供应商抛出的错误消息。异常层ơ结构简化了错误处理Qƈ且极大地降低了需要编写的异常代码数量Q例如打开和关闭连接)。Spring DAO 的面?JDBC 的异帔R从通用?DAO 异常层次l构?/li>
  • Spring ORMQSpring 框架插入了若q个 ORM 框架Q从而提供了 ORM 的对象关pdP其中包括 JDO、Hibernate ?iBatis SQL Map。所有这些都遵从 Spring 的通用事务?DAO 异常层次l构?/li>
  • Spring Web 模块QWeb 上下文模块徏立在应用E序上下文模块之上,为基?Web 的应用程序提供了上下文。所以,Spring 框架支持?Jakarta Struts 的集成。Web 模块q简化了处理多部分请求以及将h参数l定到域对象的工作?/li>
  • Spring MVC 框架QMVC 框架是一个全功能的构?Web 应用E序?MVC 实现。通过{略接口QMVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText ?POI?/li>

 

Spring 框架的功能可以用在Q?J2EE 服务器中Q大多数功能也适用于不受管理的环境。Spring 的核心要ҎQ支持不l定到特?J2EE 服务的可重用业务和数据访问对象。毫无疑问,q样的对象可以在不同 J2EE 环境 QWeb ?EJBQ、独立应用程序、测试环境之间重用?





回页?/strong>


IOC ?AOP

控制反{模式Q也UC依赖性介入)的基本概忉|Q不创徏对象Q但是描q创建它们的方式。在代码中不直接与对象和服务q接Q但在配|文件中描述哪一个组仉要哪一Ҏ务。容?Q在 Spring 框架中是 IOC 容器Q?负责这些联pd一赗?/p>

在典型的 IOC 场景中,容器创徏了所有对象,q设|必要的属性将它们q接在一P军_什么时间调用方法。下表列Z IOC 的一个实现模式?/p>
cd 1 服务需要实C门的接口Q通过接口Q由对象提供q些服务Q可以从对象查询依赖性(例如Q需要的附加服务Q?/td>
cd 2 通过 JavaBean 的属性(例如 setter ҎQ分配依赖?/td>
cd 3 依赖性以构造函数的形式提供Q不?JavaBean 属性的形式公开

Spring 框架?IOC 容器采用cd 2 和类? 实现?/p>

面向斚w的编E?/span>

面向斚w的编E?/em>Q即 AOPQ是一U编E技术,它允许程序员Ҏ切关注点或横切典型的职责分界U的行ؓQ例如日志和事务理Q进行模块化。AOP 的核心构造是斚wQ它那些媄响多个类的行为封装到可重用的模块中?/p>

AOP ?IOC 是补充性的技术,它们都运用模块化方式解决企业应用E序开发中的复杂问题。在典型的面向对象开发方式中Q可能要日志记录语句放在所有方法和 Java cM才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块?/em>Qƈ以声明的方式它们应用到需要日志的lg上。当Ӟ优势是 Java cM需要知道日志服务的存在Q也不需要考虑相关的代码。所以,?Spring AOP ~写的应用程序代码是松散耦合的?/p>

AOP 的功能完全集成到?Spring 事务理、日志和其他各种Ҏ的上下文中?/p>



回页?/strong>


IOC 容器

Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean lg一起用。这个包通常不是qL接用,而是由服务器其用作其他多数功能的底层中介。下一个最高抽象?BeanFactory 接口Q它是工厂设计模式的实现Q允讔R过名称创徏和检索对象?code>BeanFactory 也可以管理对象之间的关系?/p>

BeanFactory 支持两个对象模型?/p>

  • 单?/strong> 模型提供了具有特定名U的对象的共享实例,可以在查询时对其q行索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想?/li>
  • 原型 模型保每次索都会创建单独的对象。在每个用户都需要自q对象Ӟ原型模型最适合?/li>

bean 工厂的概忉| Spring 作ؓ IOC 容器的基。IOC 处理事情的责Q从应用程序代码{Ud框架。正如我在下一个示例中演示的那PSpring 框架使用 JavaBean 属性和配置数据来指出必设|的依赖关系?/p>

BeanFactory 接口

因ؓ org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各U底层存储方法实现。最常用?BeanFactory 定义?XmlBeanFactoryQ它Ҏ XML 文g中的定义装入 beanQ如清单 1 所C?/p>
清单 1. XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));
                        

?XML 文g中定义的 Bean 是被消极加蝲的,q意呛_需?bean 之前Qbean 本n不会被初始化。要?BeanFactory ?beanQ只需调用 getBean() ҎQ传入将要检索的 bean 的名U即可,如清?2 所C?/p>
清单 2. getBean()
MyBean mybean = (MyBean) factory.getBean("mybean");
                        

每个 bean 的定义都可以?POJO Q用cd?JavaBean 初始化属性定义) ?FactoryBean?code>FactoryBean 接口Z?Spring 框架构徏的应用程序添加了一个间接的U别?/p>



回页?/strong>


IOC CZ

理解控制反{最单的方式是看它的实际应用。在对由三部分组成的 Spring pd 的第 1 部分q行ȝӞ我用了一个示例,演示了如何通过 Spring IOC 容器注入应用E序的依赖关p(而不是将它们构徏q来Q?/p>

我用开启在U信用帐L用例作ؓL。对于该实现Q开启信用帐戯求用户与以下服务q行交互Q?

  • 信用U别评定服务Q查询用L信用历史信息?/li>
  • q程信息链接服务Q插入客户信息,客户信息与信用卡和银行信息q接hQ以q行自动借记Q如果需要的话)?/li>
  • 电子邮g服务Q向用户发送有关信用卡状态的电子邮g?/li>

 





回页?/strong>


三个接口

对于q个CZQ我假设服务已经存在Q理想的情况是用松散耦合的方式把它们集成在一赗以下清单显CZ三个服务的应用程序接口?/p>
清单 3. CreditRatingInterface
public interface CreditRatingInterface {
                        public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
                        }
                        

清单 3 所C的信用U别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是?CreditRating cL供的?/p>
清单 4. CreditLinkingInterface
public interface CreditLinkingInterface {
                        public String getUrl();
                        public void setUrl(String url);
                        public void linkCreditBankAccount() throws Exception ;
                        }
                        

信用链接接口信用历史信息与银行信息Q如果需要的话)q接在一Pq插入用L信用卡信息。信用链接接口是一个远E服务,它的查询是通过 getUrl() Ҏq行的。URL ?Spring 框架?bean 配置机制讄Q我E后会讨论它。该接口的实现是?CreditLinking cL供的?/p>
清单 5. EmailInterface
public interface EmailInterface {
                        public void sendEmail(ICustomer iCustomer);
                        public String getFromEmail();
                        public void setFromEmail(String fromEmail) ;
                        public String getPassword();
                        public void setPassword(String password) ;
                        public String getSmtpHost() ;
                        public void setSmtpHost(String smtpHost);
                        public String getUserId() ;
                        public void setUserId(String userId);
                        }
                        

EmailInterface 负责向客户发送关于客户信用卡状态的电子邮g。邮仉|参敎ͼ例如 SMPT L、用户名、口令)由前面提到的 bean 配置机制讄?code>Email cL供了该接口的实现?/p>



回页?/strong>


Spring 使其保持松散

q些接口׃之后Q接下来要考虑的就是如何用松散耦合方式它们集成在一赗在 清单 6 中可以看C用卡帐户用例的实现?/p>

注意Q所有的 setter Ҏ都是?Spring 的配|?bean 实现的。所有的依赖关系 Q也是三个接口Q都可以?Spring 框架用这?bean 注入?code>createCreditCardAccount() Ҏ会用服务L行其余实现。在 清单 7 中可以看?Spring 的配|文件。我用箭头突Zq些定义?





回页?/strong>


q行应用E序

要运行示例应用程序,首先必须 下蝲 Spring 框架 及其所有依赖文件。接下来Q将框架释放刎ͼ比如_盘 c:\Q这会创?C:\spring-framework-1.2-rc2 Q适用于当前发行版本) q样的文件夹。在l箋后面的操作之前,q必M载和释放 Apache Ant?/p>

接下来,源代码释放到文件夹Q例?c:\ 盘,然后创徏 SpringProject。将 Spring 库(?C:\spring-framework-1.2-rc2\dist 下的 spring.jar ?C:\spring-framework-1.2-rc2\lib\jakarta-commons 下的 commons-logging.jarQ复制到 SpringProject\lib 文g夹中。完成这些工作之后,有了必需的构Z赖关p集?/p>

打开命o提示W,当前目录切换到 SpringProjectQ在命o提示W中输入以下命oQ?code>build?

q会构徏q运?CreateCreditAccountClient c,cȝq行创?Customer cd象ƈ填充它,q会调用 CreateCreditCardAccount cd建ƈ链接信用卡帐戗?code>CreateCreditAccountClient q会通过 ClassPathXmlApplicationContext 装入 Spring 配置文g。装?bean 之后Q就可以通过 getBean() Ҏ讉K它们了,如清?8 所C?/p>
清单 8. 装入 Spring 配置文g
ClassPathXmlApplicationContext appContext =
                        new ClassPathXmlApplicationContext(new String[] {
                        "springexample-creditaccount.xml"
                        });
                        CreateCreditCardAccountInterface creditCardAccount =
                        (CreateCreditCardAccountInterface)
                        appContext.getBean("createCreditCard");
                        





回页?/strong>


l束?/span>

在这由三部分组成的 Spring pd 的第一文章中Q我介绍?Spring 框架的基。我从讨论组?Spring 分层架构?7 个模块开始,然后深入介绍了其中两个模块:Spring AOP ?IOC 容器?/p>

׃学习的最x法是实践Q所以我用一个工作示例介l了 IOC 模式 Q像 Spring ?IOC 容器实现的那P如何用松散耦合的方式将分散的系l集成在一赗在q个CZ中可以看刎ͼ依赖关pL服务注入工作中的信用卡帐户应用程序,要比从头开始构建它们容易得多?/p>

Ll关注这一pd的下一文章,我将在这里学习的知识基础上,介绍 Spring AOP 模块如何在企业应用程序中提供持久支持Qƈ让您开始了?Spring MVC 模块和相x件?/p>



]]>
Spring的Hibernate事务理机制http://www.tkk7.com/jxhkwhy/articles/309973.htmlUR?/dc:creator>UR?/author>Mon, 18 Jan 2010 09:04:00 GMThttp://www.tkk7.com/jxhkwhy/articles/309973.htmlhttp://www.tkk7.com/jxhkwhy/comments/309973.htmlhttp://www.tkk7.com/jxhkwhy/articles/309973.html#Feedback0http://www.tkk7.com/jxhkwhy/comments/commentRss/309973.htmlhttp://www.tkk7.com/jxhkwhy/services/trackbacks/309973.html转自Qhttp://developer.51cto.com/art/200909/154124.htm

    Spring声明式事务让我们从复杂的Hibernate事务处理中得到解脱。得我们再也无需要去处理获得q接、关闭连接、Hibernate事务提交和回滚等q些操作?

    本文主要讲了Spring 声明式事务让我们从复杂的Hibernate事务处理中得到解脱?/p>

    使得我们再也无需要去处理获得q接、关闭连接、Hibernate事务提交和回滚等q些操作。再也无< font color="#ff0000">需要我们在与事务相关的Ҏ中处理大量的try…catch…finally代码< /font>?/p>

    我们在用Spring 声明式事务时Q有一个非帔R要的概念是事务属性。事务属性通常׃务的传播行ؓQ事务的隔离U别Q事务的时值和事务只读标志l成。我们在q行事务划分Ӟ需要进行Hibernate事务定义Q也是配置Hibernate事务的属性?/p>

    Spring Hibernate?gt;TransactionDefinition 接口中定义这些属?以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring Hibernate事务理的核心接口?
    代码

            
    1. TransactionDefinition publicinterfaceTransactionDefinition {   
    2. intgetPropagationBehavior();   
    3. intgetIsolationLevel();   
    4. intgetTimeout();   
    5. booleanisReadOnly();   
    6. }  

    getTimeout()ҎQ它q回事务必须在多秒内完成?
    isReadOnly(),事务是否只读Q事务管理器能够Ҏq个q回D行优化,保事务是只ȝ?
    getIsolationLevel()Ҏq回事务的隔ȝ别,事务理器根据它来控制另外一个事务可以看到本事务内的哪些数据?

    在TransactionDefinition接口中定义了五个不同的事务隔ȝ?

    1) ISOLATION_DEFAULT q是一?PlatfromTransactionManager默认的隔ȝ别,使用数据库默认的事务隔离U别.另外四个与JDBC的隔ȝ别相对应

    2) ISOLATION_READ_UNCOMMITTEDq是事务最低的隔离U别Q它充许别外一个事务可以看到这个事务未提交的数据。这U隔ȝ别会产生脏读Q不可重复读和像读?/p>

    3) ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这U事务隔ȝ别可以避免脏d玎ͼ但是可能会出C可重复读和像读?/p>

    4) ISOLATION_REPEATABLE_READ q种事务隔离U别可以防止脏读Q不可重复读。但是可能出现像读。它除了保证一个事务不能读取另一个事务未提交的数据外Q还保证了避免下面的情况产生(不可重复?

    在TransactionDefinition接口中定义了七个事务传播行ؓ:

    1) < span style="color: #000000;"> PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事?

    2) PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执?

    3) PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务Q则抛出?

    4)PROPAGATION_REQUIRES_NEW L开启一个新的事务。如果一个事务已l存在,则将q个存在的事务挂?

    5) PROPAGATION_NOT_SUPPORTEDL非事务地执行Qƈ挂vM存在的事?

    6) PROPAGATION_NEVERL非事务地执行Q如果存在一个活动事务,则抛出异?

    7) PROPAGATION_NESTED如果一个活动的事务存在Q则q行在一个嵌套的事务? 如果没有zd事务, 则按 TransactionDefinition.PROPAGATION_REQUIRED 属性执?



]]>
spring事务理http://www.tkk7.com/jxhkwhy/articles/309971.htmlUR?/dc:creator>UR?/author>Mon, 18 Jan 2010 08:57:00 GMThttp://www.tkk7.com/jxhkwhy/articles/309971.htmlhttp://www.tkk7.com/jxhkwhy/comments/309971.htmlhttp://www.tkk7.com/jxhkwhy/articles/309971.html#Feedback0http://www.tkk7.com/jxhkwhy/comments/commentRss/309971.htmlhttp://www.tkk7.com/jxhkwhy/services/trackbacks/309971.html
spring事务理
   在学?/span>spring事务理?/span>,我忍不住要问,springZ么进行事务管?/span>,spring怎么q行的事务管?/span>?
接下来说?/span>spring是怎样q行事务理?/span>.
?/span> Spring事务{略
    Spring事务{略,也就?/span>spring事务理的实现方?/span>.它有一个统一的抽象是由实C面这个接口完成的.
    org.springframework.transaction.PlatformTransactionManager
    此接口的内容如下:
  
Public interface PlatformTransactionManager{
           TransactionStatue getTransaction(TransactionDefinition definition) 
throws TransactionException;
           Void commit(TransactionStatus status) 
throws TransactionException;
           Void rollback(TransactionStatus status) 
throws TransactionException;
}

   
 不管是声明式的还是编E式的事务管理都需要此抽象来完?/span>.
解释一下这个接?/span>,q样可以更好的理?/span>spring的事务控制的原理.
getTransaction()Ҏcd?/span>TransactionDefinition的参数返回一?/span>TransactionStatus对象.q回?/span>TransactionStatus对象可能代表一个新的或已经存在的事?/span>(如果在当前调用堆栈有一个符合条件的事务).如同J2EE事务上下?/span>,一?/span>TransactionStatus也是和执行的U程兌?/span>.
同时,在框架中q存?/span>TransactionDefinition接口,即上边的参数cd.此接口指定了事务隔离E度、事务传播、事务超时、只ȝ态?/span>
另外Q还?/span>TransactionStatus接口。这个接口ؓ处理事务提供单的控制事务执行和查询事务状态的Ҏ?/span>
    
?/span>    两种事务理方式Q编E式、声明式?/span>
Spring提供两种方式的编E式事务理Q分别是Q?/span>TransactionTemplate和直接?/span>PlatformTransactionManager?/span>
? TransactionTempale采用和其他Spring模板Q如JdbcTempalte和HibernateTemplate一LҎ。它使用回调ҎQ把应用E序从处理取得和释放资源中解脱出来。如同其他模板,TransactionTemplate是线E安全的?/span>
代码片段Q?/span>
Object result = tt.execute(new TransactionCallback(){
   
public Object doTransaction(TransactionStatus status){
        updateOperation();
        
return resultOfUpdateOperation();
   }

}
);
使用TransactionCallback()可以q回一个倹{?/span>
如果使用TransactionCallbackWithoutResult则没有返回倹{?/span>
?/span>. 也可以?/span>PlatformTransactionManager直接理事务。简单地通过一?/span>bean引用l你?/span>bean传递一个你使用?/span>PlatformTransaction对象。然后,使用TransactionDefinition?/span>TransactionStatus对象可以发赗回滚、提交事务?/span>
如下片段Q?/span>
DefaultTransactionDefinition   def= new DefaultTransactionDefinition();                   //new 一个事?/span>
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //初始化事?参数定义事务的传播类?
TransactionStatus  status = transactionManager.getTransaction(def);                    //获得事务状?/span>
try{
   ……………..
   transactionManager.commit(status); 
//提交事务;
}
catch(…..){
   transactionManager.rollback(status); 
//回滚事务;
}

 
Spring也提供声明式事务理。这是通过AOP实现的?/span>
大多?/span>Spring用户选择声明式事务管理,q是最媄响应用代码的选择Q因而这是和非R入性的轻量U容器的观念是一致的?/span>
?/span> 通常通过TransactionProxyFactoryBeanSpring事务代理。需要一个目标对象包装在事务代理中。这个目标对象一般是一个普?/span>Javabean。当我们定义TransactionProxyFactoryBeanӞ必须提供一个相关的PlatformTransactionManager的引用和事务属性。事务属性含有事务定义。例?/span>:
<bean id="transactionService"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        
<property name="transactionManager">
            
<ref   local="transactionManager"/>
        
</property>   
        
<property  name="target">
            
<ref  local="transactionServiceControl"/>            
        
</property>
         
<property  name="transactionAttributes">
            
<props>
              
<prop key=”insert*”>PROPAGATION_REQUIRED,-MyCheckedException</prop>
<prop key=”update*”>PROPAGATION_REQUIRED</prop>
<prop key=”*”>PROPAGATION_REQUIRED,readOnly</prop>
            
</props>
        
</property>
</bean>
事务代理会实现目标对象的接口:q里是属性名是target的引用。id是transactionServiceControl。(●用EQLQ也可以实现具体类的代理。只要设|proxyTargetClass属性ؓtrue卛_。如果目标对象没有实CQ何接口,q将自动讄该属性ؓtrue。通常Q我们希望面向接口编E。) ●用proxyInterfaces属性来限定事务代理来代理指定接口也是可以?●也可以通过从org.springframework.aop.framework.ProxyConfigl承或所有AOP代理工厂׃n的属性来定制TransactionProxyFactoryBean行ؓ?/span>
然后Q说说属性名?/span>transactionAttributes意义Q?/span>
q里的transactionAttributes属性是定义在org.springframework.transaction.interceptor.NameMathTransactionAttributeSource中的属性格式设|。这个包括通配W的Ҏ名称映射是很直观的,?#8221;insert*”。注意insert*的映的值包括回滚规则?#8221;-MyCheckException”指定如果Ҏ抛出MyCheckException或它的子c,事务会自动回滚。可以用逗号分隔多个回滚规则?#8220;Q?#8221;前缀强制回滚Q?#8220;Q?#8221;前缀指定提交Q这允许即抛出unchecked异常时也可以提交事务Q?#8220;PROPAGATION_REQUIRED”指定事务传播范围?/span>
TransactionProxyFactoryBean允许你通过“preInterceptors”?#8220;postInterceptors”属性设|前或后的拦截操作。可以设|Q意数量的前和后通过Q它们的cd可以是AdvistorQ切入点Q,MethodInterceptor或被当前Spring配置支持的通知cd。例如:QhrowAdviceQAfterReturningAdvice或eforeAdvice。这些通知必须支持实例׃n模式。如果你需要高UAQPҎ操作事务,通过org.springframework.aop.framework.ProxyFactoryBeanQ而不是TransactionProxyFactory实用代理创徏者?/span>
?span>   另一U声明方式:BeanNameAutoProxyCreator
使用TransactionProxyFactoryBean当事务代理包装对象,你可以完全控制代理。如果需要用一致方式包装大量bean。用一个BeanFactoryPostProcessor的一个实玎ͼBeanNameAutoProxyCreatorQ可以提供另外一U方法?Spring中,一旦ApplicationContextd它的初始化信息,它将初始化所有实现BeanPostProcessor接口的beanQƈ且让它们后处理ApplicationContext中所有其他的bean。所以用这U机Ӟ正确配置的BeanNameAutoProxyCreator可以用来后处理所有ApplicationContext中所有其他的bean),q且把它们用事务代理包装h。真正生成的事务代理和用TransactionProxyFactoryBean生成的基本一致?/span>
最后,ȝ一下Spring的优点:
?span style="font: 7pt 'Times New Roman'">              Z同的事务QPQ提供一致的~程模型Q如JTA、JDBC、Hibernate、iBATIS数据库层QDQ?/span>
?span style="font: 7pt 'Times New Roman'">              提供比大多数事务API更简单的、易于用的~程式事务管理API
?span style="font: 7pt 'Times New Roman'">              整合Spring数据讉K抽象
?span style="font: 7pt 'Times New Roman'">              支持Spring声明式事务管?/span>


]]>
java事务理http://www.tkk7.com/jxhkwhy/articles/309970.htmlUR?/dc:creator>UR?/author>Mon, 18 Jan 2010 08:55:00 GMThttp://www.tkk7.com/jxhkwhy/articles/309970.htmlhttp://www.tkk7.com/jxhkwhy/comments/309970.htmlhttp://www.tkk7.com/jxhkwhy/articles/309970.html#Feedback0http://www.tkk7.com/jxhkwhy/comments/commentRss/309970.htmlhttp://www.tkk7.com/jxhkwhy/services/trackbacks/309970.html转自Qhttp://blog.csdn.net/sunyadongwanghbjm/archive/2007/08/20/1751518.aspx
什么是事务:
首先,说说什么事务。我认ؓ事务Q就是一l操作数据库的动作集合?/div>
事务是现代数据库理论中的核心概念之一。如果一l处理步骤或者全部发生或者一步也不执行,我们U该l处理步骤ؓ一个事务。当所有的步骤像一个操作一栯完整地执行,我们U该事务被提交。由于其中的一部分或多步执行失败,D没有步骤被提交,则事务必d滚到最初的pȝ状态?/div>
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicityQ、一致性(consistencyQ、隔L(isolationQ和持久性(durabilityQ的~写。事务的原子性表CZ务执行过E中的Q何失败都导致事务所做的M修改失效。一致性表C当事务执行p|Ӟ所有被该事务媄响的数据都应该恢复到事务执行前的状态。隔L表C在事务执行q程中对数据的修改,在事务提交之前对其他事务不可见。持久性表C当pȝ或介质发生故障时Q确保已提交事务的更C能丢失。持久性通过数据库备份和恢复来保证?/div>
Java中的事务处理
一般J2EE服务器支持三U类型的事务理。即QJDBC事务QJTA事务Q容器管理事务?/div>
最好不要在E序中同时用上qCU事务类型;q且Q事务要在尽可能短的旉内完成,不要在不同方法中实现事务的用。下面D两个例子说明JDBC及JTA事务Q容器管理事务是在特定的框架中实现的Q如QSpring的事务管理)
1. JDBC事务
public String delete(String id) {
String ID 
= id;
 db 
= new getConnection();
 Connection con 
= db.getConnection();
 
try {
con.setAutoCommit(
false);
db.executeUpdate(
"delete from helloworld where ID=" + ID); //更新操作1
  db.executeUpdate("delete from helloworld _book where ID=" + ID); //更新操作2
  db.executeUpdate("delete from helloworld_user where ID=" + ID); //更新操作3
  con.commit();//提交JDBC事务
  con.setAutoCommit(true); 
db.close();
return “success”;
 }

 
catch (Exception e) {
  con.rollBack();
//回滚JDBC事务
  e.printStackTrace();
db.close();
return “fail”;
  }

}

 
如上例:更新操作1Q?Q?只有当三步操作都成功完成才进行提交,否则回滚已经q行的操作。这P保证了数据的完整性,不会因ؓH然断电{特D情况导致的数据错误?/div>
 
2QJTA事务
JTA是J2EE事务服务的解x案、描qCJ2EE模型事务接口。JTAh三个主要的接口:UserTransaction、TransactionManager、Transaction接口。这些接口共享公q事务操作Q如Qcommit()、rollback()。同时各自也有自q操作。D例说明:
 
public String delete(String id) {
 String ID 
= id;
 db 
= new getConnection();
 db.getConnection();
 UserTransaction transaction 
= sessionContext.getUserTransaction();//获得JTA事务
 try {
  transaction.begin(); 
//开始JTA事务
  db.executeUpdate("delete from helloworld where ID=" + ID);
  db.executeUpdate(
"delete from helloworld _book where ID=" + ID);
  db.executeUpdate(
"delete from helloworld _user where ID=" + ID);
  transaction.commit(); 
//提交JTA事务
  db.close();
  
return”success”;
 }

 
catch (Exception e) {
  
try {
   transaction.rollback();
//事务回滚
  }

  
catch (Exception e) {
   e.printStackTrace();
  }

  exc.printStackTrace();
  db.close();
  
return “fail”;
 }

}
 
3Q容器事务管?/div>
在Spring、Hibernate{框架中都有各自的事务管理功能。虽然表现Ş式有些差别,但都是在JAVA事务理的基上实现的。这里不q行介绍?/div>

]]> վ֩ģ壺 Ʒ_Ʒ| 99re6ƵƷѹۿ| ëƬѲ| ޹ŮƵ| ձվ| Ƶ| ߾ѹۿ| AVƷɫ| 2021þþƷѹۿ| ߹ۿ| ߲ŸԲ | ޾Ʒþ| ڵƵվ| AV| һƵ| ݺݺݰƵ| AVպAV| ƷƵ| avɫ㽶һ| ССӰձۿ| һ˿wwwѸĻ| Ʒһ| 69ƵƬ| avһ| һֻ| ŮƵƵƵҳ| a߹ۿ| պƬӰѹۿ| һëƬȫ| ޹ۺһҳ| ѹۿëƬȫ| Ѹ߹ۿ| ޾Ʒ͵벻av| Ů߿ѹۿ| 18ڵվ| ޵һ߹ۿ| ȫԼƵ| 99߹ۿ| ɫƵ| ޹ۺϾƷ| þü޾Ʒ?V|