首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

从Spring AOP浅析宣言式事务

2012-09-03 
从Spring AOP浅析声明式事务Spring AOP(Aspect Oriented Programming)作为一种非侵略性的、轻型的AOP frame

从Spring AOP浅析声明式事务

Spring AOP(Aspect Oriented Programming)


作为一种非侵略性的、轻型的AOP framework,AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,?AOP可以说也是这种目标的一种实现。它可以解决OOP和过程化方法不能够很好解决的横切?(crosscut)问题, 如:事务、安全、日志等横切关注。AOP相关概念:方面(Aspect):对横切关注点的抽象(类似类对对象的抽象)。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。连接点(Joinpoint):被拦截到的点,泛指方法。如方法的调用或特定的异常被抛出。通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括"around"、"before"和"throws"通知。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。切入点(Pointcut):对那些拦截点进行定义。例如,使用正则表达式。引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。编织(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。各种通知类型包括:Around通知:包围一个连接点的通知,如方法调用。这是最强大的通知。Aroud通知在方法调用前后完成自定义的行为,它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短路执行。Before通知:在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。?Throws通知:在方法抛出异常时执行的通知。Spring提供强制类型的Throws通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从Throwable或Exception强制类型转换。?After returning通知:在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。
下面是一个声明式事务配置实例:
<!--数据源配置--><bean id="dataSources_order" destroy-method="close"><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1526:db"></property><property name="username" value="test"></property><property name="password" value="123123"></property><property name="minIdle" value="2"></property><property name="maxIdle" value="50"></property><property name="maxActive" value="90"></property></bean><!--配置事务数据源--><bean id="defaultChannelManager" ref="dataSources_order"></property></bean><!--声明一个通知--><tx:advice id="defaultChanneltxAdvice" transaction-manager="defaultChannelManager"><tx:attributes><tx:method name="batchInsertChannel" propagation="REQUIRED" rollback-for="ManagerException"/><tx:method name="updateChannelPlan" propagation="REQUIRED" rollback-for="ManagerException"/><tx:method name="deleteManagerItem" propagation="REQUIRED" rollback-for="ManagerException"/><tx:method name="*" read-only="true"/></tx:attributes></tx:advice><aop:config><!--切入点,声明需要拦截的对象--><aop:pointcut expression="execution(* com.xiu.trademanager.biz.core.channel.impl.DefaultChannelManager.*(..))" id="defaultChannelManagerMethod"/><aop:advisor advice-ref="defaultChanneltxAdvice" pointcut-ref="defaultChannelManagerMethod"/></aop:config>
?

热点排行