Spring切面的优先级
来源:互联网 发布:js 菜单 展开收起 编辑:程序博客网 时间:2024/04/30 09:59
Spring切面的优先级
实现切面的优先级:
1、在同一个连接点上应用不止一个切面时, 除非明确指定, 否则它们的优先级是不确定的。
2、切面的优先级可以通过实现 Ordered 接口或利用 @Order 注解指定:
(1)实现 Ordered 接口, getOrder() 方法的返回值越小, 优先级越高。
(2)若使用 @Order 注解, 序号出现在注解中,数字越小,优先级越高。
By luoyepiaoxue2014
一、说在前面
按照前面的学习,如果一个原始对象可能会需要插入多个切面,那么它的执行顺序是怎么样的呢?实现切面的优先级:
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 点击打开链接
阅读全文
0 0
- Spring切面的优先级
- spring学习笔记十五 切面的优先级
- 切面优先级 Spring Aop
- Spring 之通知的类型以及切面的优先级
- spring学习笔记(18)——切面的优先级
- spring学习笔记(20)----指定切面的优先级
- Spring - Aspect优先级与切面表达式
- spring的返回通知、异常通知、环绕通知、切面的优先级与重用切点表达式
- 18.Spring学习笔记_切面的优先级(by尚硅谷_佟刚)
- 面向切面的Spring
- Spring的切面 AOP
- 面向切面的spring
- 面向切面的Spring
- 面向切面的Spring
- 面向切面的Spring
- [Spring]Spring AOP学习笔记(2)---5种切入方式、AOP优先级及切面表达式的重用
- Spring-AOP:切面优先级和重用切点表达式
- Spring AOP学习笔记(4):AOP切面优先级&切面表达式重用&xml配置方式
- Linux问题
- jQuery事件
- 数据挖掘的十大经典算法
- 素数的判断
- Unity Shader学习-3.光照模型
- Spring切面的优先级
- 【C++学习笔记】string类的方法
- Integer类型方法详解(上)
- Python数据处理实战
- docker入门
- grunt的简单使用
- 软考新思维--2017年上半年信息系统项目管理师上午试题分析与答案(试题41-45题)
- 表单验证之validform.js使用方法
- html动画(1)大白