spring 多个切面如何有序执行
Spring也能支持多个切面。当有多个切面时,它不会存在任何顺序,这些顺序代码会随机生成,但是有时候我们希望它按照指定的顺序运行。
在此之前要先定义一个切点方法,为此新建一个接口——MultiBean
代码清单:定义多个切面的切点方法
package com.ssm.chapter11.multi.bean;
public interface MultiBean {
public void testMulti();
}
代码清单:实现MultiBean接口
package com.ssm.chapter11.multi.bean.impl; import com.ssm.chapter11.multi.bean.MultiBean;
import org.springframework.stereotype.Component; /****************imports****************/
@Component
public class MultiBeanImpl implements MultiBean { // @Override
public void testMulti() {
System.out.println("test multi aspects!!");
} }
代码清单:3个切面
package com.ssm.chapter11.multi.aspect; import org.aspectj.lang.annotation.*;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; /**************** imports ****************/
@Aspect
// @Order(1)
public class Aspect1 implements Ordered { // @Override
public int getOrder() {
return 1;
} @Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")
public void print() {
} @Before("print()")
public void before() {
System.out.println("before 1 ......");
} @After("print()")
public void after() {
System.out.println("after 1 ......");
} @AfterThrowing("print()")
public void afterThrowing() {
System.out.println("afterThrowing 1 ......");
} @AfterReturning("print()")
public void afterReturning() {
System.out.println("afterReturning 1 ......");
} }
package com.ssm.chapter11.multi.aspect; import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order; /**************** imports ****************/
@Aspect
@Order(2)
public class Aspect2 {
@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")
public void print() {
} @Before("print()")
public void before() {
System.out.println("before 2 ......");
} @After("print()")
public void after() {
System.out.println("after 2 ......");
} @AfterThrowing("print()")
public void afterThrowing() {
System.out.println("afterThrowing 2 ......");
} @AfterReturning("print()")
public void afterReturning() {
System.out.println("afterReturning 2 ......");
}
}
package com.ssm.chapter11.multi.aspect; import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order; /**************** imports ****************/
@Aspect
@Order(3)
public class Aspect3 {
@Pointcut("execution(* com.ssm.chapter11.multi.bean.impl.MultiBeanImpl.testMulti(..))")
public void print() {
} @Before("print()")
public void before() {
System.out.println("before 3 ......");
} @After("print()")
public void after() {
System.out.println("after 3 ......");
} @AfterThrowing("print()")
public void afterThrowing() {
System.out.println("afterThrowing 3 ......");
} @AfterReturning("print()")
public void afterReturning() {
System.out.println("afterReturning 3 ......");
}
}
代码清单:多切面测试Java配置
package com.ssm.chapter11.multi.config; import com.ssm.chapter11.multi.aspect.Aspect1;
import com.ssm.chapter11.multi.aspect.Aspect2;
import com.ssm.chapter11.multi.aspect.Aspect3;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; /****************imports****************/
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.ssm.chapter11.multi")
public class MultiConfig {
@Bean
public Aspect1 getAspect1() {
return new Aspect1();
} @Bean
public Aspect2 getAspect2() {
return new Aspect2();
} @Bean
public Aspect3 getAspect3() {
return new Aspect3();
}
}
代码清单:测试
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(MultiConfig.class);
MultiBean multiBeanService = ctx.getBean(MultiBean.class);
multiBeanService.testMulti();
}
如何让它有序执行:
1.@Order(1),@Order(2),@Order(3) 注解
2.实现 implements Ordered
3.<aop:aspect ref="aspect1" order="1">
spring 多个切面如何有序执行的更多相关文章
- Spring AOP 创建切面
增强被织入到目标类的所有方法中,但是如果需要有选择性的织入到目标类某些特定的方法中时,就需要使用切点进行目标连接点的定位.增强提供了连接点方位信息:如织入到方法前面.后面等,而切点进一步描述织 ...
- 【spring-boot】spring aop 面向切面编程初接触--切点表达式
众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...
- 三、Spring的面向切面
Spring的面向切面 在应用开发中,有很多类似日志.安全和事务管理的功能.这些功能都有一个共同点,那就是很多个对象都需要这些功能.复用这些通用的功能的最简单的方法就是继承或者委托.但是当应用规模达到 ...
- 【spring-boot】spring aop 面向切面编程初接触
众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...
- Spring(4)——面向切面编程(AOP模块)
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- Spring的面向切面
Spring的面向切面 在应用开发中,有很多类似日志.安全和事务管理的功能.这些功能都有一个共同点,那就是很多个对象都需要这些功能.复用这些通用的功能的最简单的方法就是继承或者委托.但是当应用规模达到 ...
- Spring实战之切面编程
如果要重用通用功能的话,最常见的面向对象技术是继承(inheritance)或委托(delegation).但是,如果在整个应用中都使用相同的基类,继承往往会导致一个脆弱的对象体系:而使用委托可能需要 ...
- Spring:面向切面编程的AOP
一.前言 除了依赖注入(DI),Spring框架提供的另一个核心功能是对面向方面的编程(AOP)的支持. AOP通常被称为实现横切关注点的工具.横切关注点一词是指应用程序中的逻辑不能与应用程序的其余部 ...
- Spring框架的反序列化远程代码执行漏洞分析(转)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
随机推荐
- oracle数据库锁表
在团队开发一个项目的时候,避免不了两个或两个以上的人同时操作某一数据库中的同一张表,这时候,如果一个用户没有提交事务,或者忘记提交事务,那么其他用户就不能对这张表进行操作了,这是很烦人的事情,下面是查 ...
- HTTP头部
10-URI的基本格式以及与URL的区别 HTTP连接的常见流程 从TCP编程上看HTTP请求处理 长连接与短连接 补充一下代理的知识 什么是正向代理,什么是反向代理? 想在外部公网访问公司内部局域网 ...
- JanusGraph 创建索引步骤(composite index)踩坑总结
前言 JanusGraph是一个图数据库引擎,安装及入门可以参考 JanusGraph 图数据库安装小记.为了提高查询速度,在使用过程中一般要为某些属性创建索引.这篇随笔主要是记录创建索引过程中踩过的 ...
- 列举 Python2和Python3的区别?
1.print 在python2中,print被视为一个语句而不是一个函数,python3中,print()被视为一个函数 2.整数的除法 在python2中,键入的任何不带小数的数字,将被视为整数的 ...
- JS判断移动端访问设备并加载对应CSS样式
JS判断不同web访问环境,主要针对移动设备,提供相对应的解析方案(判断设备代码直接copy腾讯网的) // 判断是否为移动端运行环境 if(/AppleWebKit.*Mobile/i.test(n ...
- 洛谷 P1005 动态规划 大数
Problem Description 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n×m的矩阵,矩阵中的每个元素a(i,j)均为非负整数.游戏规则如下: 1 每次取数时须从每行各取走一个元素,共 ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(远程升级WIFI内部程序)
https://www.cnblogs.com/yangfengwu/p/10360618.html 演示视频: https://www.bilibili.com/video/av54894356/ ...
- leetcode解题报告(26):Add Binary
描述 Given two binary strings, return their sum (also a binary string). For example, a = "11" ...
- 转载 | Python AI 教学│k-means聚类算法及应用
关注我们的公众号哦!获取更多精彩哦! 1.问题导入 假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置.事先肯定要 ...
- Three.js实现滚轮放大展现不同的模型
目录 Three.js实现滚轮放大展现不同的模型 修改OrbitControls.js的源码 OrbitControls在透视相机(PerspectiveCamera)的控制原理 具体实现 Three ...