从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" class="org.apache.commons.dbcp.BasicDataSource" 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" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" 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>
		
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值