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 ...
随机推荐
- goto语句——慎用,但是可以用
最近使用了goto语句,是因为if嵌套太深了,因此把错误处理同意了,直接使用goto语句. 举例: #include <stdio.h> int main () { /* local va ...
- JSONObject例子
说起JSON,大家就谈不上陌生了,因为对于数据传输语言,各位只认json,即使有XML语言,但是各位很少用吧.我也是,但是之前用过的json转换工具各种各样,我记忆中有过GSON(google).fa ...
- go函数类型的使用
Go函数类型的使用 type myfunc func() string // 声明函数变量 func main() { fn := func() string { return "bbb&q ...
- Validation参数验证
在SpringBoot项目中其实已经默认引入了,如果不是sprongBoot项目则需要导入Maven <dependency> <groupId>org.hibernate.v ...
- JS基础_自增和自减
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- flask入门脚本解释
创建一个最小的flask应用, 稍做编辑如下, 开启debug调试模式后, 服务器自动加载服务器的修改. 如何自己构建一个优雅的url呢 http方法介绍 http访问urls的方法有get, pos ...
- 猴猴的比赛 dfs序
猴猴的比赛 dfs序 两颗\(n\)节点的树,不相同,问多少点对\((u,v)\)在两棵树上均满足路径\(v\)在\(u\)子树中 \(n\le 10^5\) 暴力: \(n^2\)暴力枚举点对用\( ...
- linux 日志写入到指定文件中
php /data/xxx/aaa.php > test.log 2>&1 >覆盖, >>追加 2>&1 表示不仅命令行正常的输出保存到test. ...
- CSP-S2019 快乐爆0
hhh 我爆0了 快乐 大家都比我强 hh 常规操作 本来就是个憨憨 回去复习文化课了 唉 干啥啥不行
- 小程序中怎么引入wepy.js第三方toast组件
1.先安装组件 npm install wepy-com-toast --save 2.引入wepy和toast import wepy from 'wepy' import Toast from ' ...