以AspectJ实现AOP事物

1 使用Annotation方式
spring依赖库
* SPRING_HOME/dist/spring.jar
* SPRING_HOME/lib/jakarta-commons/commons-logging.jar
* SPRING_HOME/lib/log4j/log4j-1.2.14.jar
* SPRING_HOME/lib/aspectj/*.jar

使用Aspect定义切入点

package com.travelsky.aop.aspect; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.AfterReturning; 
@Aspect 
public class serviceAspect { 
   @Pointcut("execution(* com.travelsky.service..*.*(..))") 
   public void doBeforeService() {
   } 
   @Pointcut("execution(* com.travelsky.service..*.*(..))") 
   public void doAfterService() {
   } 
} 

 

定义advice

package com.travelsky.aop.advice; 
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class serviceAdvice{
  @Before("com.travelsky.aop.aspect.serviceAspect.doBeforeService()")
  public void doAccessCheck() {
	// ...
	System.out.println("Aop: do before service."); 
  }
  @AfterReturning("com.travelsky.aop.aspect.serviceAspect.doAfterService()")
  public void logInfo() {
	// ...
	System.out.println("Aop: do after service");
  }
}

 

在Spring配置文件applicationContext.xml中配置

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
	default-autowire="byName" default-lazy-init="true">
<aop:aspectj-autoproxy /> 
<bean class="com.travelsky.aop.advice.serviceAdvice" /> 
</bean> 

 

2 配置文件方式
spring依赖库
* SPRING_HOME/dist/spring.jar
* SPRING_HOME/lib/jakarta-commons/commons-logging.jar
* SPRING_HOME/lib/log4j/log4j-1.2.14.jar
* SPRING_HOME/lib/aspectj/*.jar

 

在applicationContext.xml中配置

<aop:config>
   <!-- 被切入的切面类-->
   <aop:aspect id="security" ref="securityHandler"> 
   <!-- 要切入的点(针对哪个切入。表达式方法声明匹配被切入的类及其方法) -->
    <aop:pointcut id="allAddMethod" expression="execution(* com.travelsky.security.UserManagerImpl.add*(..))"/> 
    <!-- 声明切面类的要切入方法及具体位置 -->
    <aop:before method="checkSecurity" pointcut-ref="allAddMethod"/> 
   </aop:aspect>
</aop:config>

 

3 给出一个生产中实际使用的AspectJ管理AOP事物的配置文件(配置方式实现)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
	default-autowire="byName" default-lazy-init="true">

	<!-- 属性文件读入 -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath*:config.properties</value>
			</list>
		</property>
	</bean>

	<!-- 支持 @Transactional 标记 -->
	<tx:annotation-driven />

	<!-- 支持 @AspectJ 标记-->
	<aop:aspectj-autoproxy proxy-target-class="true"/>

	<!-- 以AspectJ方式 定义 AOP -->
	<aop:config proxy-target-class="true">
		<aop:advisor
			pointcut="execution(* com.travelsky.bravo.components..*Manager.*(..))"
			advice-ref="txAdvice" />
		<aop:advisor
			pointcut="execution(* com.travelsky.bravo.core..*Manager.*(..))"
			advice-ref="txAdvice" />			
		<aop:advisor
			pointcut="execution(* com.travelsky.bravo.core.dao..*DaoImpl.*(..))"
			advice-ref="txAdvice" />
		<aop:advisor
			pointcut="execution(* com.travelsky.bravo.core.dao..*Dao.*(..))"
			advice-ref="txAdvice" />
		<aop:advisor
			pointcut="execution(* com.travelsky.agentsky..*Manager.*(..))"
			advice-ref="txAdvice" />
		<aop:advisor
			pointcut="execution(* com.travelsky.agentsky.ws..*AgentSkyWS4GF.*(..))"
			advice-ref="txAdvice" />
	</aop:config>

	<!-- 基本事务定义,使用transactionManager作事务管理,默认get*方法的事务为readonly,
	      数据操作方法事物为rollback 其余方法按默认设置. -->
	<tx:advice id="txAdvice">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="save*"  rollback-for="Exception"/>    
            <tx:method name="insert*" rollback-for="Exception" />    
            <tx:method name="remove*" rollback-for="Exception"/>    
           	<tx:method name="add*" no-rollback-for="Exception" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

 
</beans>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值