AOP之用注解配置
首先在xml文件中开启注解扫面和自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面
<context:component-scan base-package="com.tao.aop.service"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
首先用@Aspect注解声明Logger是一个切面,并用@Component创建对象放在spring容器中,使用 @Pointcut注解一个切入点,用@Before、@After、 @AfterThrowing、@AfterReturning、 @Around注解通知方法,可以在注解中写切入点表达式,也可以定义一个切入点然后直接进行引用,显然后者更加灵活。
@Component("Annotationlogger")
@Aspect
public class Annotationlogger {
@Pointcut("execution(* com.tao.aop.service.AnnotationServiceDemo.saveMoney())")
private void pt1(){}
@Before("pt1()")
public void before(){
System.out.println("前置方法");
}
@After("execution(* com.tao.aop.service.AnnotationServiceDemo.saveMoney())")
public void after(){
System.out.println("后置方法");
}
@AfterThrowing("pt1()()")
public void after_throwing(){
System.out.println("异常通知");
}
@AfterReturning("pt1()")
public void after_returning(){
System.out.println("最终通知");
}
@Around("pt1()")
public void around(ProceedingJoinPoint pjp){
Object rtValue=null;
try {
Object[] args=pjp.getArgs();
System.out.println("环绕通知——前置通知");
pjp.proceed(args);
System.out.println("环绕通知——后置通知");
}catch (Throwable e){
System.out.println("环绕通知——异常通知");
throw new RuntimeException(e);
}finally {
System.out.println("环绕通知——最终通知");
}
}
}
创建一个service类,使用@Service注解创建对象
@Service("AnnotationServiceDemo")
public class AnnotationServiceDemo {
public void saveMoney(){
//int i=1/0;
System.out.println("保存账户");
}
}