zoukankan      html  css  js  c++  java
  • 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);
        }
    }

    输出:

  • 相关阅读:
    计算机一些常见名词解释
    [MSF]server/capture/http_javascript_keylogger键盘记录
    .net(C#)访问Oracle数据库的几种免安装组件的对比
    C# UserControl 判断是否是设计模式中
    Python_cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)
    python 怎么启动一个外部命令程序, 并且不阻塞当前进程
    创建注记图层C# IFeatureWorkspaceAnno
    VisualSVN Server 导入已存在的库
    带您了解Oracle层次查询
    win7系统使用engine进行开发报错,“未能加载文件或程序集”
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12166516.html
Copyright © 2011-2022 走看看