<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="     
          http://www.springframework.org/schema/beans     
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
          http://www.springframework.org/schema/context     
          http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/aop     
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
    default-autowire="byName">

    <context:component-scan base-package="bupt.aop2" />
    <!-- 启用aop 注解 -->
    <aop:aspectj-autoproxy />
</beans>

 

package bupt.aop2;

import org.springframework.stereotype.Component;

@Component
public class MainClass {
    public void execute(){
        System.out.println("主类执行....");
        int i = 1/0;
    }
    
    public void execute(String str){
        System.out.println("有参数执行...." + str);
    }
}
package bupt.aop2;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class Advice{
    @Before(value="execution(* execute(..))")
    public void beforeAdvice(){
        System.out.println("前置通知执行(任意参数)...");
    }
    
    @Before(value="execution(* execute*(String))")
    public void beforeAdvice2(){
        System.out.println("前置通知执行(匹配参数)...");
    }
    
    @After(value="execution(* execute(..))")
    public void afterAdvice(){
        System.out.println("后置通知执行(任意参数)...");
    }
    
    @Around(value="execution(* execute(..))")
    public void aroundAdvice(ProceedingJoinPoint point) throws Throwable{
        System.out.println("环绕通知执行(前)...");
        point.proceed();
        System.out.println("环绕通知执行(后)...");
    }
    
    @AfterThrowing(value="execution(* execute(..))")
    public void throwAdvice(){
        System.out.println("异常通知执行...");
    }

}
package test.bupt.aop2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import bupt.aop2.MainClass;
import junit.framework.TestCase;

public class testMainClass extends TestCase {

    public void testExecute() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("aop2.xml");
        MainClass mainClass = (MainClass) ctx.getBean("mainClass");
        mainClass.execute();
    }

}

运行结果:

前置通知执行(任意参数)...
环绕通知执行(前)...
主类执行....
后置通知执行(任意参数)...
异常通知执行...

 

1、环绕通知中,切入点的方法要由通知中调用,返回相应执行结果,在此也可对结果处理,返回自己想要的结果

2、其他通知只通调用,不能控制切入点的方法执行