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 多个切面如何有序执行的更多相关文章

  1. Spring AOP 创建切面

        增强被织入到目标类的所有方法中,但是如果需要有选择性的织入到目标类某些特定的方法中时,就需要使用切点进行目标连接点的定位.增强提供了连接点方位信息:如织入到方法前面.后面等,而切点进一步描述织 ...

  2. 【spring-boot】spring aop 面向切面编程初接触--切点表达式

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  3. 三、Spring的面向切面

    Spring的面向切面 在应用开发中,有很多类似日志.安全和事务管理的功能.这些功能都有一个共同点,那就是很多个对象都需要这些功能.复用这些通用的功能的最简单的方法就是继承或者委托.但是当应用规模达到 ...

  4. 【spring-boot】spring aop 面向切面编程初接触

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  5. Spring(4)——面向切面编程(AOP模块)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  6. Spring的面向切面

    Spring的面向切面 在应用开发中,有很多类似日志.安全和事务管理的功能.这些功能都有一个共同点,那就是很多个对象都需要这些功能.复用这些通用的功能的最简单的方法就是继承或者委托.但是当应用规模达到 ...

  7. Spring实战之切面编程

    如果要重用通用功能的话,最常见的面向对象技术是继承(inheritance)或委托(delegation).但是,如果在整个应用中都使用相同的基类,继承往往会导致一个脆弱的对象体系:而使用委托可能需要 ...

  8. Spring:面向切面编程的AOP

    一.前言 除了依赖注入(DI),Spring框架提供的另一个核心功能是对面向方面的编程(AOP)的支持. AOP通常被称为实现横切关注点的工具.横切关注点一词是指应用程序中的逻辑不能与应用程序的其余部 ...

  9. Spring框架的反序列化远程代码执行漏洞分析(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

随机推荐

  1. goto语句——慎用,但是可以用

    最近使用了goto语句,是因为if嵌套太深了,因此把错误处理同意了,直接使用goto语句. 举例: #include <stdio.h> int main () { /* local va ...

  2. JSONObject例子

    说起JSON,大家就谈不上陌生了,因为对于数据传输语言,各位只认json,即使有XML语言,但是各位很少用吧.我也是,但是之前用过的json转换工具各种各样,我记忆中有过GSON(google).fa ...

  3. go函数类型的使用

    Go函数类型的使用 type myfunc func() string // 声明函数变量 func main() { fn := func() string { return "bbb&q ...

  4. Validation参数验证

    在SpringBoot项目中其实已经默认引入了,如果不是sprongBoot项目则需要导入Maven <dependency> <groupId>org.hibernate.v ...

  5. JS基础_自增和自减

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. flask入门脚本解释

    创建一个最小的flask应用, 稍做编辑如下, 开启debug调试模式后, 服务器自动加载服务器的修改. 如何自己构建一个优雅的url呢 http方法介绍 http访问urls的方法有get, pos ...

  7. 猴猴的比赛 dfs序

    猴猴的比赛 dfs序 两颗\(n\)节点的树,不相同,问多少点对\((u,v)\)在两棵树上均满足路径\(v\)在\(u\)子树中 \(n\le 10^5\) 暴力: \(n^2\)暴力枚举点对用\( ...

  8. linux 日志写入到指定文件中

    php  /data/xxx/aaa.php > test.log 2>&1 >覆盖, >>追加 2>&1 表示不仅命令行正常的输出保存到test. ...

  9. CSP-S2019 快乐爆0

    hhh 我爆0了 快乐 大家都比我强 hh 常规操作 本来就是个憨憨 回去复习文化课了 唉 干啥啥不行

  10. 小程序中怎么引入wepy.js第三方toast组件

    1.先安装组件 npm install wepy-com-toast --save 2.引入wepy和toast import wepy from 'wepy' import Toast from ' ...