java配置文件如下:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
<bean id="dataAccessThrowsAdvice" class="com.XXX.XXX.aop.exception.XXX" />
<bean id="serviceThrowsAdvice" class="com.XXXXXX.aop.exception.XXX" />
<bean id="actionThrowsAdvice" class="com.XXX.XXXaop.exception.XXX" />
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true">
<!-- 切面事务归txAdvice处理 -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.XXX..*.*Dao.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.XXX..*.*Manager.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.XXX..*.*Action.*(..))" />
<aop:advisor advice-ref="dataAccessThrowsAdvice" pointcut="execution(* com.XXX..*.*Dao.*(..))"/>
<aop:advisor advice-ref="serviceThrowsAdvice" pointcut="execution(* com.XXX..*.*Dao.*(..))" />
<aop:advisor advice-ref="actionThrowsAdvice" pointcut="execution(* com.XXX..*.*Action.*(..))" />
</aop:config>
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;
public class BaseBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("******************");
System.out.println(arg0.getName());
System.out.println("******************");
}
@Aspect
public class wqAdvice {
@Pointcut("execution (* com.XX.*.XX.*(..))")
private void myXXCut(){}
@Before("myXXCut()")
public void doBefore(){
System.out.println("before");
}
@AfterReturning(pointcut="myXXCut()",returning="result")
public void doAfter(String result){
System.out.println("atfer"+result);
}
@AfterThrowing(pointcut=" myXXCut()",throwing="e")
public void doThrowing(Exception e){
System.out.println("Exception"+e.getMessage());
}
}
区别:
在AOP中有几个概念:
— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。
— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。
所以“<aop:aspect>”实际上是定义横切逻辑,就是在连接点上做什么,“<aop:advisor>”则定义了在哪些连接点应用什么<aop:aspect>。Spring这样做的好处就是可以让多个横切逻辑(即<aop:aspect>定义的)多次使用,提供可重用性。
你后面的两个类实际上就是实现横切逻辑的不同方式,一种需要实现特定接口,一种以POJO + Annotation , 在功能上没有太大差别,只是方式不同。