您的位置:首页 > 编程语言 > Java开发

Spring关于AOP配置举例(注解方式)

2018-01-24 09:40 302 查看
1. 案例结构



2. 配置文件applicationContext.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:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd ">
<!-- 用注解的方式启用AOP -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!--扫描MyAspect -->
<context:component-scan base-package="com.zhq.aspect"/>
<!--生成一个MyCalc -->
<bean class="com.zhq.aspect.MyCalc"/>
</beans>

2. 其他类

package com.zhq.aspect;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 切面类,存放切面
* */
@Aspect
@Component//可以扫描
@Order(2)//执行顺序
public class MyAspect {
//通告,用于织入到某个指定的切入点。@Before表示此切面是一个前置通知,它会在方法执行前执行。
@Before("execution(* com.zhq.aspect.MyCalc.*(..))")
public void beFore(JoinPoint jp) {
//取所有参数
Object args[]=jp.getArgs();
//获取方法名
String name=jp.getSignature().getName();
System.out.println(name+"方法准备执行...");
System.out.println("输入参数:"+Arrays.toString(args));
}
@After("execution(* com.zhq.aspect.MyCalc.*(..))")
public void beAfter() {
System.out.println("方法执行结束。");
}
//返回通知
@AfterReturning(value="execution(* com.zhq.aspect.MyCalc.*(..))",returning="r")
public void afterReturning(JoinPoint jp,Object r) {
//获取方法名
String name=jp.getSignature().getName();
System.out.println(name+"开始返回结果...");
System.out.println("结果是:"+r);
}
//异常通知
@AfterThrowing("execution(* com.zhq.aspect.MyCalc.*(..))")
public void afterThrowing(JoinPoint jp) {
//获取方法名
String name=jp.getSignature().getName();
System.out.println(name+"出现异常...");
}
}

package com.zhq.aspect;

public class MyCalc {
//连接点,织入点
public int add(int a,int b) {
return a+b;
}
public int div(int a,int b) {
return a-b;
}
public int chu(int a,int b) {
return a/b;
}
}


package com.zhq.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
* 切面类,存放切面
* */
@Aspect
@Component//可以扫描
@Order(1)//执行顺序
public class MyLoggin {
@Before("execution(* com.zhq.aspect.MyCalc.*(..))")
public void beginLoggin() {
System.out.println("开始日志....");
}

}

package com.zhq.aspect;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

public static void main(String[] args) {
ApplicationContext cxt=new ClassPathXmlApplicationContext("config/applicationContext.xml");
MyCalc ca=(MyCalc) cxt.getBean(MyCalc.class);
//普通测试

System.out.println(ca.add(10, 20));
System.out.println(ca.div(10, 20));
//异常测试
System.out.println(ca.chu(10,0));

}

}

3. 测试效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring AOP 注解