美文网首页
Spring-7AspectJ使用

Spring-7AspectJ使用

作者: RyanHugo | 来源:发表于2020-03-12 22:15 被阅读0次

    AspectJ

    AspectJ:Java 社区里最完整最流行的 AOP 框架.
    在 Spring2.0 以上版本中, 可以使用基于 AspectJ 注解或基于 XML 配置的 AOP

    配置

    1.加入Jar包

    * 1. 加入 jar 包
     * com.springsource.net.sf.cglib-2.2.0.jar
     * com.springsource.org.aopalliance-1.0.0.jar
     * com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
     * spring-aspects-4.0.0.RELEASE.jar
    

    2.在 Spring 的配置文件中加入 aop 的命名空间

    <!-- 自动扫描的包 -->
        <context:component-scan base-package="aop"></context:component-scan>
    
        <!-- 使 AspectJ 的注解起作用 -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    

    3. 基于注解的方式来使用 AOP

     * 3.1 在配置文件中配置自动扫描的包: <context:component-scan base-package="com.atguigu.spring.aop"></context:component-scan>
     * 3.2 加入使 AspjectJ 注解起作用的配置: <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
     * 为匹配的类自动生成动态代理对象. 
    

    4.编写切面类并配置

     4. 编写切面类: 
     * 4.1 一个一般的 Java 类
     * 4.2 在其中添加要额外实现的功能. 
     *
     * 5. 配置切面
     * 5.1 切面必须是 IOC 中的 bean: 实际添加了 @Component 注解
     * 5.2 声明是一个切面: 添加 @Aspect
     * 5.3 声明通知: 即额外加入功能对应的方法. 
     * 5.3.1 前置通知: @Before("execution(public int com.atguigu.spring.aop.ArithmeticCalculator.*(int, int))")
     * @Before 表示在目标方法执行之前执行 @Before 标记的方法的方法体. 
     * @Before 里面的是切入点表达式: 
    
    @Aspect
    @Component
    public class LoggingAspect {
    
        @Before("execution(public int aop.Cal.*(int,int))")
        public void beforeadd(JoinPoint joinPoint){
            String methname = joinPoint.getSignature().getName();
            Object[] args = joinPoint.getArgs();
            System.out.println("目前使用的方法"+methname+"参数"+Arrays.asList(args));
        }
    //  在方法执行后执行的代码,无论是否异常
        @After("execution(public int aop.Cal.*(int,int))")
        public void afterMethod(JoinPoint joinPoint){
            String methodName = joinPoint.getSignature().getName();
            System.out.println("The method " + methodName + " ends");
        }
    //  在方法执行后执行的代码,可以访问返回值
        @AfterReturning(value="execution(public int aop.Cal.*(int,int))" ,returning="result")
        public void afterreturnMethod(JoinPoint joinPoint ,Object result){
            String methodName = joinPoint.getSignature().getName();
            System.out.println("The method " + methodName + " ends" +result);
        }
    }
    
    * 6. 在通知中访问连接细节: 可以在通知方法中添加 JoinPoint 类型的参数, 从中可以访问到方法的签名和方法的参数. 
     * 
     * 7. @After 表示后置通知: 在方法执行之后执行的代码. 
    

    相关文章

      网友评论

          本文标题:Spring-7AspectJ使用

          本文链接:https://www.haomeiwen.com/subject/imegjhtx.html