spring注解开发-aop功能的测试

1.编写一个切面类 


/**
 * 切面类
 */
@Aspect//告诉spring这是一个切面类
public class LogAOP {

    @Pointcut(value = "execution(public * com.it.aop.MyAop.*(..))")
    public void point(){}

    @Before("point()")
    public void logStart(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        System.out.println(joinPoint.getSignature().getName()+"方法运行了,参数列表是:["+ Arrays.asList(args)+"]");
    }

    @After("point()")
    public void logEnd(JoinPoint joinPoint){
        System.out.println(joinPoint.getSignature().getName()+"方法结束");
    }

    @AfterReturning(value = "point()",returning = "result")
    public void logReturn(JoinPoint joinPoint, Object result){
        System.out.println(joinPoint.getSignature().getName()+"方法正常返回,返回值["+result+"]");

    }

    @AfterThrowing(value = "point()", throwing = "exception")
    public void logException(JoinPoint joinPoint, Exception exception){
        System.out.println(joinPoint.getSignature().getName()+"方法出现异常,异常信息:["+exception.getMessage()+"]");
    }
}

@Aspect:告诉spring这是一个切面类

@Pointcut:抽取公共的切入点表达式,如果是其他类使用需要写全方法名,本类使用就写方法名

@Before:在目标方法执行前运行

@After:在目标方法执行结束后运行

@AfterReturning:在目标方法正常返回后执行

@AfterThrowing:在目标方法发生异常后执行


2. 编写一个测试AOP的类

public class MyAop {

    public int div(int i, int j){
        System.out.println("div方法开始执行");
        return i/j;
    }
}

这个类用于测试切面类是否能成功切入目标方法


3.将切面类和测试类都注册到IOC容器中,同时开启基于注解的AOP模式

@EnableAspectJAutoProxy//开启基于注解的aop模式
@Configuration
public class MainConfigAOP {

    @Bean
    public MyAop myAop(){
        return new MyAop();
    }

    @Bean
    public LogAOP logAOP(){
        return new LogAOP();
    }
}

@EnableAspectJAutoProxy:开启基于注解的AOP模式


4.测试结果

1.正常执行:

spring注解开发-aop功能的测试_第1张图片

2.异常执行

spring注解开发-aop功能的测试_第2张图片

 注意: 想要使用AOP功能,必须是从IOC容器中拿出的bean。如果是new出来的对象,将无法使用AOP功能

public class AppTest 
{
    /**
     * Rigorous Test :-)
     */
//      ApplicationContext ioc = new AnnotationConfigApplicationContext(MainConfigAOP.class);
    @Test
    public void shouldAnswerWithTrue()
    {
//      MyAop bean = ioc.getBean(MyAop.class);
        MyAop bean = new MyAop();
        bean.div(1,1);
    }
}

spring注解开发-aop功能的测试_第3张图片

你可能感兴趣的:(Spring注解驱动开发笔记)