Spring切面的优先级

来源:互联网 发布:js 菜单 展开收起 编辑:程序博客网 时间:2024/04/30 09:59
Spring切面的优先级

一、说在前面

按照前面的学习,如果一个原始对象可能会需要插入多个切面,那么它的执行顺序是怎么样的呢?

实现切面的优先级:
1、在同一个连接点上应用不止一个切面时, 除非明确指定, 否则它们的优先级是不确定的。
2、切面的优先级可以通过实现 Ordered 接口或利用 @Order 注解指定:
(1)实现 Ordered 接口, getOrder() 方法的返回值越小, 优先级越高。
(2)若使用 @Order 注解, 序号出现在注解中,数字越小,优先级越高。

二、操作实例

1、ArithmeticCalculator类
package com.at.aop.impl;public interface ArithmeticCalculator {int add(int i,int j);int sub(int i,int j);int mul(int i,int j);int div(int i,int j);}
2、ArithmeticCalculatorImpl实现类
package com.at.aop.impl;import org.springframework.stereotype.Component;@Componentpublic class ArithmeticCalculatorImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {int result = i + j;return result;}@Overridepublic int sub(int i, int j) {int result = i - j;return result;}@Overridepublic int mul(int i, int j) {int result = i * j;return result;}@Overridepublic int div(int i, int j) {int result = i / j;return result;}}
3、LoggingAspect日志类
package com.at.aop.impl;import java.util.Arrays;import java.util.List;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;//帮这个类声明为一个切面:需要把该类放入到IOC容器中,再声明为一个切面@Order(2)@Aspect@Componentpublic class LoggingAspect {//声明该方法是一个前置通知:在目标方法开始之前执行。@Before("execution(* com.at.aop.impl.ArithmeticCalculator.*(int, int))")public void beforeMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();List<Object> args = Arrays.asList(joinPoint.getArgs());System.out.println(" 方法 "+methodName+" 开始 "+args);}//后置通知:在目标方法执行后(无论是否发生异常),执行的通知。//在后置通知中还不能访问目标方法执行的结果。这个结果需要在返回通知中访问(下文讲)@After("execution(* com.at.aop.impl.ArithmeticCalculator.*(int, int))")public void afterMethod(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();System.out.println(" 方法 "+methodName+" 结束 ");}}
4、VlidationAspect校验类
package com.at.aop.impl;import java.util.Arrays;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;@Order(1)@Aspect@Componentpublic class VlidationAspect {@Before("execution(* com.at.aop.impl.ArithmeticCalculator.*(..))")public void validationArgs(JoinPoint joinPoint){System.out.println("=====validation: "+Arrays.asList(joinPoint.getArgs()));}}
5、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: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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><!-- 配置自动扫描的包 --><context:component-scan base-package="com.at.aop.impl"></context:component-scan><!-- 使AspjectJ 注解起作用:自动为匹配的类生产代理对象 --><aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
6、测试函数
package com.at.aop.impl;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAspect {public static void main(String[] args) {//1、创建spring的ioc容器ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//2、从ioc容器中获取bean的事例ArithmeticCalculator ac = ctx.getBean(ArithmeticCalculator.class);//3、使用beanint result = ac.add(3, 6);System.out.println("result "+result);int result2 = ac.div(12, 6);System.out.println("result "+result2);}}
7、测试结果
信息: Loading XML bean definitions from class path resource [applicationContext.xml]=====validation: [3, 6] 方法 add 开始 [3, 6] 方法 add 结束 result 9=====validation: [12, 6] 方法 div 开始 [12, 6] 方法 div 结束 result 2

By luoyepiaoxue2014
微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头发很长时间不长怎么办啊 打嘟噜时间不长怎么办 阴茎勃起的时间不长怎么办 睡觉的时间不长怎么办 每次锻炼时间不长怎么办 微信好友不知道是谁怎么办 就一个软件闪退怎么办 葫芦侠修改闪退怎么办 戴尔游匣磁盘占用100怎么办 步步高家教机扫描笔不亮怎么办 社保卡手机号换了怎么办 香港公司进出口没有申报怎么办 智能电视右上角网络未连接怎么办 电子秤按键板不好用怎么办失灵 桑塔纳车钥匙锁车里了怎么办 舌头上有锯齿印怎么办 夏天有脚气脚臭怎么办 xp分辨率太高黑屏怎么办 农村淘宝标识类目没了怎么办 被投诉到食品监督局怎么办 被客户315投诉了怎么办 给人打不接受调解怎么办 失业证年审忘了怎么办 工商年检过期4天怎么办 个体营业执照年审过期了怎么办 企业年报密码忘了怎么办 税务年报报错了怎么办 工商证过期5年怎么办 车年检标志丢了怎么办 年检标志打错了怎么办 贵州个体出租车工商执照年检怎么办 驾驶证考试预约提示网络繁忙怎么办 帝豪显示屏花屏怎么办 注册公司居委会不盖章怎么办 营业执照名字和店名不一样怎么办 开炸鸡店没经验怎么办 提名候选人时重名重姓怎么办 别人用我的店名怎么办 wish店铺出现侵权产品怎么办 如果公司缺人该怎么办 鲁班奖证书丢了怎么办