• spring AOP之基于xml配置文件的方式来配置AOP


    Calculator.java

    package com.gong.spring.aop.impl;
    
    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);
    }

    CalculatorImpl.java

    package com.gong.spring.aop.impl2;
    
    public class CalculatorImpl implements Calculator{
    
        @Override
        public int add(int i, int j) {
            // TODO Auto-generated method stub
            int result =  i+j;
            return result;
        }
    
        @Override
        public int sub(int i, int j) {
            // TODO Auto-generated method stub
            int result = i - j;
            return result;
        }
    
        @Override
        public int mul(int i, int j) {
            // TODO Auto-generated method stub
            int result = i * j;
            return result;
        }
    
        @Override
        public int div(int i, int j) {
            // TODO Auto-generated method stub
            int result = i / j;
            return result;
        }
    
    }

    LoggingAspect.java

    package com.gong.spring.aop.impl2;
    
    import java.util.Arrays;
    import java.util.List;
    
    import javax.management.RuntimeErrorException;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    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;
    
    
    public class LoggingAspect {
        
        public void beforeMethod(JoinPoint joinPoint) {
            String methodName = joinPoint.getSignature().getName();
            List<Object> args = Arrays.asList(joinPoint.getArgs());
            System.out.println(methodName+" begin with "+args);
        }
        
        public void afterMethod(JoinPoint joinPoint) {
            //获取名字
            String methodName = joinPoint.getSignature().getName();
            //获取参数
            List<Object> args = Arrays.asList(joinPoint.getArgs());
            System.out.println(methodName+" end with "+args);
        }
    
        public void afterReturning(JoinPoint joinPoint,Object result) {
            String methodName = joinPoint.getSignature().getName();
            List<Object> args = Arrays.asList(joinPoint.getArgs());
            System.out.println("在afterReturning得到返回值:"+ result);
            System.out.println(methodName+" end with "+args);
        }
    
        public void afterThrowing(JoinPoint joinPoint,Exception ex) {
            String methodName = joinPoint.getSignature().getName();
            System.out.println(methodName+" occurs exception:"+ex);
        }
        
        public Object aroundMethod(ProceedingJoinPoint pjd) {
            Object result = null;
            String methodName = pjd.getSignature().getName();
            //执行目标方法
            try {
                //前置通知
                System.out.println(methodName+" begin with "+Arrays.asList(pjd.getArgs()));
                //执行目标方法
                result = pjd.proceed();
                //后置通知
                System.out.println("在aroundMethod中得到值:"+result);
            } catch (Throwable e) {
                // TODO Auto-generated catch block
                //异常通知
                System.out.println("the method occurs exception:" + e);
                throw new RuntimeException(e);
            }
            //后置通知
            System.out.println(methodName+" end with "+Arrays.asList(pjd.getArgs()));
            return result;
        }
    }

    applicationContext2.xml

    <?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
        
        <!-- 配置bean -->
        <bean id="calculator" class="com.gong.spring.aop.impl2.CalculatorImpl"></bean>
        <!-- 配置切面bean -->
        <bean id="loggingAspect" class="com.gong.spring.aop.impl2.LoggingAspect"></bean>
        <!-- 配置AOP -->
        <aop:config>
            <!-- 配置切点表达式 -->
            <aop:pointcut expression="execution(* com.gong.spring.aop.impl2.Calculator.*(int, int))" 
            id="pointcut"/>
            <!-- 配置切面及通知 -->
            <aop:aspect ref="loggingAspect" order="2">
                <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
                <aop:after method="afterMethod" pointcut-ref="pointcut"/>
            </aop:aspect>
        </aop:config>
    </beans>

    需要注意的是:execution(* com.gong.spring.aop.impl2.Calculator.*(int, int))中额第一个*不要漏掉,否则会报错。

    Main.java

    package com.gong.spring.aop.impl2;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext2.xml");
            //从IOC容器中获取bean的实例
            Calculator calculator = (Calculator) ctx.getBean(Calculator.class);
            int res = calculator.add(2, 1);
            System.out.println("在主函数中加法计算的结果="+res);
            res = calculator.div(2, 1);
            System.out.println("在主函数中除法计算的结果="+res);
        }
    }

    输出:

  • 相关阅读:
    使用插件和不使用插件实现select的框
    利用sshtunnel实现跳板机的效果[嵌套ssh实现]
    laravel中get()与 first()区别、collection与stdClass的区别
    Laravel 安全:避免 SQL 注入
    MAC 终端走代理服务器
    Python--Virtualenv简明教程(转载https://www.jianshu.com/p/08c657bd34f1)
    Charles 如何抓取https数据包
    爬虫出现Forbidden by robots.txt(转载 https://blog.csdn.net/zzk1995/article/details/51628205)
    Scrapy框架的学习(6.item介绍以及items的使用(提前定义好字段名))转载https://blog.csdn.net/wei18791957243/article/details/86259688
    python xpath
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12166516.html
Copyright © 2020-2023  润新知