上一篇讲了用注解配置AOP,现在讲用xml怎么配置AOP
其实逻辑是一样的,只是用xml的方法,要把这种逻辑写出来,告诉spring框架去执行。
例子:这里的例子和上一篇的例子一样。换成xml方式
//方法接口
package com.atguigu.spring.aop.impl; public interface Calculator { public int add(int i,int j);
public int sub(int i,int j);
public int div(int i,int j);
public int mul(int i,int j);
}
// 方法实现类
package com.atguigu.spring.aop.impl; public class CalculatorImpl implements Calculator{ public int add(int i,int j){
return i+j;
};
public int sub(int i,int j){
return i-j;
};
public int div(int i,int j){
return i/j;
};
public int mul(int i,int j){
return i*j;
}
}
日志切面:
package com.atguigu.spring.aop.impl; import java.util.Arrays;
import java.util.List; public class LoggingAspect {
//前置通知日志日志
public void beforedMethod(JoinPoint joinPoint){
String methodName=joinPoint.getSignature().getName();
List<Object> args = Arrays.arrays(joinPoint.getArgs());
System.out.println("The method "+ methodName +"begins: "+args);
}
//返回通知日志
public void afterReturningMethod(Joinpoint joinpoint,Object result){
String methodName=joinPoint.getSignature().getName();
System.out.println("The method "+methodName+" ends with "+result);
}
// 异常通知日志
public void afterThrowingMethod(Joinpoint joinpoint,Exception e){
String methodName=joinPoint.getSignature().getName();
System.out.println("The method "+methodName+" occurs excetion "+e);
}
}
验证切面:
package com.atguigu.spring.aop.impl; import java.util.Arrays;
import java.util.List; public class ValidationAspect {
public void beforedMethod(JoinPoint joinPoint){
System.out.println("---->Validation: "+ Arrays.aslist(joinPoint.getArgs));
}
}
main函数
package com.atguigu.spring.aop.impl; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("application.xml");
Calculator cal = (Calculator) ctx.getBean(Calculator.class);
int result=cal.add(1,2);
System.out.println("result: "+result);
}
}
重点看xml配置:
<!--先配置要使用的bean和切面bean,让spring容器创建对象-->
<!-- 配置bean -->
<bean id="calculatorimpl" class="com.atguigu.spring.aop.impl.Calculatorimpl"></bean>
<!-- 配置切面的bean -->
<bean id="loggingAspect" class="com.atguigu.spring.aop.impl.LoggingAspect"></bean>
<bean id="validationAspect" class="com.atguigu.spring.aop.impl.ValidationAspect"></bean> <!-- 配置AOP ,表示出对象中的逻辑-->
<aop:config>
<!-- 配置切点表达式 -->
<aop:pointcut expression="execution(* com.atguigu.spring.aop.impl.CalculatorImpl.*(int, int))"
id="pointcut"></aop:pointcut>
<!-- 配置切面通知 -->
<aop:aspect ref="validationAspect" order="2">
<aop:before method="beforeMethod" pointcut-ref="pointcut"></aop:before>
</aop:aspect>
<!-- 配置切面通知 -->
<aop:aspect ref="loggingAspect" order="1">
<!--前置通知 -->
<aop:before method="beforeMethod" pointcut-ref="pointcut"></aop:before>
<!--返回通知,注意,方法中有多少个参数,这里就要配置多少个参数,参数值和函数中一致-->
<aop:after-returning method="afterReturningMethod" pointcut-ref="pointcut" returning="result"></aop:after-returning>
<!--异常通知,注意,方法中有多少个参数,这里就要配置多少个参数,参数值和函数中一致-->
<aop:after-throwing method="afterThrowingMethod" pointcut-ref="pointcut" throwing="e"></aop:after-throwing>
</aop:aspect>
</aop:config>
结果和注解配置的一致,但配置比较麻烦,不推荐使用。