springAOP模板

来源:互联网 发布:淘宝便宜好吃的零食店 编辑:程序博客网 时间:2024/05/16 18:46

定义一个业务,对其进行aop开发,这里使用计算机为案例:

开发目标代码:

package com.Calculator;import org.springframework.stereotype.Component;@Component(value = "Calculator")public class CalculatorImpl implements ICalculator {    public int add(int i, int j) {        int result = i + j;        return result;    }    public int sub(int i, int j) {        int result = i - j;        return result;    }    public int mul(int i, int j) {        int result = i * j;        return result;    }    public int div(int i, int j) {        int result = i / j;        return result;    }}


开发aop类:

在aop类中需要把该类标识为组件,让spirng容器进行管理,在有就是标识为切面,spring容器可以代理生成对象。

package com.Calculator;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;import java.util.Arrays;import java.util.List;@Component@Aspectpublic class CalculatroAop {    /*    * execution的格式(限定范围 + 返回类型 +全限类名 +方法名(参数类型。。。))    * 可以用* 代替限定范围 + 返回类型,方法名    * 可以用英文句号代替参数类型,任意的参数都可以匹配,几个参数就几个句号,中间空格隔开    * */    @Before("execution(* com.jd.jr.Calculator.CalculatorImpl.*(. .))")    public void beforeMethod(JoinPoint joinPoint){        String methodName = joinPoint.getSignature().getName();        List<Object> args = Arrays.asList(joinPoint.getArgs());        System.out.println("method "+"{"+methodName+"}"+"  begin...with"+args);    }    @After("execution(* com.jd.jr.Calculator.CalculatorImpl.*(. .))")    public void aftereMethod(JoinPoint joinPoint){        String methodName = joinPoint.getSignature().getName();        System.out.println("method "+"{"+methodName+"}"+"  ends...");    }    /*    * 在返回通知中,可以通过在注解参数列表中添加returnint = "返回结果保存的变量"    * 在通知方法的参数中添加一个参数就是 “返回结果保存的变量”,可以得到结果    * */    @AfterReturning(value = "execution(* com.jd.jr.Calculator.CalculatorImpl.*(. .))"    , returning = "result"    )    public void returnMethod(JoinPoint joinPoint,Object result){        String methodName = joinPoint.getSignature().getName();        System.out.println("method "+"{"+methodName+"}"+"  ends with result "+result);    }    /*    * 在异常通知中,可以得到异常的信息,方法和返回通知的类似    * */    @AfterThrowing(value = "execution(* com.jd.jr.Calculator.CalculatorImpl.*(. .))"            ,throwing = "e"    )    public void afterThrowing(JoinPoint joinPoint,Exception e){        String methodName = joinPoint.getSignature().getName();        System.out.println("method "+"{"+methodName+"}"+"  ends with exception "+e);    }}

开发spring的核心容器:

<beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"       xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd "><!--配置自动扫描的包的路径-->    <context:component-scan base-package="com.jd.jr.Calculator"/>    <!--使用aspject注解的方式自动生成代理对象-->    <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>


测试代码:

public class MainTes {    public static void main(String[] args) {        ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");        ICalculator calculator =cxt.getBean(ICalculator.class);        int result1 = calculator.add(1, 2);        System.out.println("result1 is :"+result1);        int result2 = calculator.div(88, 0);        System.out.println("result2 is "+result2);        int result3 = calculator.mul(2, 4);        System.out.println("result3 is "+result3);        int result4 = calculator.sub(5,3);        System.out.println("result4 is "+result4);    }}


 

 

try{    @Before前置通知    主代码块    @AfterReturing返回通知(可以访问到代码执行结果)    }catch(Exception e){    @throwing 异常通知        }    finally{    @After后置通知        }

 

 

 

0 0
原创粉丝点击