继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spring aop 学习(二)注解的方式配置aop

晚上了睡吧
关注TA
已关注
手记 2
粉丝 1
获赞 1
aop配置文件
<?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:aop="http://www.springframework.org/schema/aop"      
xmlns:context="http://www.springframework.org/schema/context"      
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd">      <!-- 匹配自动扫描的包 -->      

<context:component-scan base-package="com.neusoft.aop"></context:component-scan>      
<!-- 使得@AspectJ注解起作用:自动为匹配的类生成代理对象 -->      
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

业务类

package com.tiger.aop;

import org.springframework.stereotype.Component;

@Component

public class MathematicsCalculatorImpl implements MathematicsCalculator {

      @Override

      public int add(int i, int j) {

            int result = i+j;

            return result;

      }

      @Override

      public int sub(int i, int j) {

            int result = i-j;

            return result;

      }

      @Override

      public int mul(int i, int j) {

            int result = i*j;

            return result;

      }

      @Override

      public int div(int i, int j) {

            int result = i/j;

            return result;

      }

}

aop切面类

package com.tiger.aop;

import java.util.Arrays;

import java.util.List;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.springframework.stereotype.Component;

@Component

@Aspect

public class AspectJAOP {

      /**

       * 前置通知:目标方法执行前执行的通知

       * @param joinpoint

       */

      @Before("execution(*  com.tiger.aop.MathematicsCalculatorImpl.*(.. ))")

      public void beforeMethod(JoinPoint joinpoint){

            String methodName = joinpoint.getSignature().getName();

            List<Object> args = Arrays.asList(joinpoint.getArgs());

            System.out.println("The "+methodName+" method start....."+args);

      }

      /**

       * 后置通知:在目标方法执行后(无论是否发生异常),执行该通知

       * 在后置通知中还不能访问目标方法执行的结果(方法可能会出异常,所以访问不到)

       * @param joinpoint

       */

      @After("execution(*  com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))")

      public void afterMethod(JoinPoint joinpoint){

            String methodName = joinpoint.getSignature().getName();

            System.out.println("The "+methodName+" method end.....");

      }

      /**

       * 方法正常结束后执行的代码

       * 返回通知是可以访问到方法的返回值的

       * @param joinpoint

       */

      @AfterReturning(value="execution(*  com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))",

                  returning="result")

      public void afterRuningMethod(JoinPoint joinpoint,Object result){

            String methodName = joinpoint.getSignature().getName();

            System.out.println("The "+methodName+" method end.....with.."+result);

      }

      /**

       * 在目标方法出现异常时执行的代码

       * 可以访问到异常对象,且可以指定在出现特定异常时再执行通知代码 (如NullPointException)

       * @param joinpoint

       * @param e

       */

      @AfterThrowing(value="execution(*  com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))",

                  throwing="e")

      public void afterThrowingMethod(JoinPoint joinpoint,Exception e){

            String methodName = joinpoint.getSignature().getName();

            System.out.println("The "+methodName+" method occurs exception.."+e);

      }

      

      /**

       * 环绕通知需要带ProceedingJoinPoint类型的参数

       * 环绕通知类似于动态代理的全过程,ProceedingJoinPoint类型的参数可以决定是否执行目标方法

       * 且环绕通知必须有返回值,返回值就是目标方法的返回值

       * @param pjp

       * @return

       */

      @Around("execution(*  com.tiger.aop.MathematicsCalculatorImpl.*(int , int ))")

      public Object aroundMethod(ProceedingJoinPoint pjp){

            Object result =null;

            String methodName = pjp.getSignature().getName();

            try {

                  List<Object> args = Arrays.asList(pjp.getArgs());

                  //前置通知

                  System.out.println("The "+methodName+" method start....."+args);

                  //执行该方法

                  result = pjp.proceed();

                  //后置通知

                  System.out.println("The "+methodName+" method end.....with.."+result);

            } catch (Throwable e) {

                  // TODO Auto-generated catch block

                  System.out.println("The "+methodName+" method occurs exception.."+e);

            }

            return result;

      }

}

测试类

package com.tiger.aop;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainAspectJ {

      public static void main(String[] args) {

            //1、创建springIOC容器

            ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext-aop.xml");

            //2、从IOC容器中获取bean的实例

            MathematicsCalculator mc = act.getBean(MathematicsCalculator.class);

            //3、使用bean

            int result = mc.add(2, 3);

            System.out.println("result"+result);

            result = mc.div(10, 5);

            System.out.println("result"+result);

      }

}


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP