基于xml实现AOP的五种通知

1.创建目标资源

①接口

public interface Calculator {
    int add(int i,int j);
    int sub(int i,int j);
    int mul(int i,int j);
    int div(int i,int j);
}

②实现类

@Component
public class CalculatorImpl implements Calculator {
    @Override
    public int add(int i, int j) {
        int result = i + j;
        System.out.println("方法内部result = " + result);
        return result;
    }

    @Override
    public int sub(int i, int j) {
        int result = i - j;
        System.out.println("方法内部result = " + result);
        return result;
    }

    @Override
    public int mul(int i, int j) {
        int result = i * j;
        System.out.println("方法内部result = " + result);
        return result;
    }

    @Override
    public int div(int i, int j) {
        int result = i / j;
        System.out.println("方法内部result = " + result);
        return result;
    }
}

2.创建切面类

//切面类
@Component//ioc容器进行管理
public class LogAspect {

    // 前置通知
    public void beforeMethod(JoinPoint joinPoint){
        String methodName = joinPoint.getSignature().getName();//获取增强方法的名称
        Object[] args = joinPoint.getArgs();//获取参数的名称
        System.out.println("Logger-->前置通知,方法名称:" + methodName + ",参数:" + Arrays.toString(args));
    }

    // 后置通知
    @After(value = "pointCut()")
    public void afterMethod(JoinPoint joinPoint){
        String methodName = joinPoint.getSignature().getName();//获取增强方法的名称
        System.out.println("Logger-->后置通知,方法名称:" + methodName);
    }

    // 返回通知
    public void afterReturningMethod(JoinPoint joinPoint,Object result){
        String methodName = joinPoint.getSignature().getName();//获取增强方法的名称
        System.out.println("Logger-->返回通知,方法名称:" + methodName + ",返回结果:" + result);
    }
    // 异常通知
    //目标方法出现异常,这个通知执行
    public void afterThrowingMethod(JoinPoint joinPoint,Throwable ex){
        String methodName = joinPoint.getSignature().getName();//获取增强方法的名称
        System.out.println("Logger-->异常通知,方法名称:" + methodName + ",异常信息:" + ex);
    }
    // 环绕通知
    public Object aroundMethod(ProceedingJoinPoint joinPoint){
        String methodName = joinPoint.getSignature().getName();//获取增强方法的名称
        Object[] args = joinPoint.getArgs();
        String argString = Arrays.toString(args);
        Object result = null;
        try{
            System.out.println("环绕通知==目标方法之前执行");

            //调用目标方法
            result = joinPoint.proceed();

            System.out.println("环绕通知==目标方法返回值之后执行");
        }catch (Throwable throwable){
            throwable.printStackTrace();
            System.out.println("环绕通知==目标方法出现异常执行");
        }finally {
            System.out.println("环绕通知==目标方法执行完毕执行");
        }
        return result;
    }
}

3.配置bean文件




    
    


    

        

            


            

            

            

            

            
        
    

4.测试

public class TestAop {
    @Test
    public void testAdd(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beanaop.xml");
        Calculator calculator = context.getBean(Calculator.class);
        calculator.add(2,3);
    }
}

你可能感兴趣的:(xml)