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. 网络 IP

    参考原文 http://blog.csdn.net/dan15188387481/article/details/49873923 1. 原始的IP地址表示方法及其分类(近几年慢慢淘汰)     IP ...

  2. mysql sum的多条件求和

    1.无条件求和 sum(字段名): 2.多条件求和 sum(IF(c1>0, c1, 0)); (IF(o.is_cod=0,o.order_amount-IF(b.back_status> ...

  3. 98: 模拟赛-神光 dp

    $code$ #include <cstdio> #include <cstring> #include <algorithm> using namespace s ...

  4. UOJ426. 【集训队作业2018】石像 [状压DP,min_25筛]

    UOJ 思路 (以下思路是口胡,但正确性大概没有问题.) 刚学min_25筛的时候被麦老大劝来做这题? 结果发现这题是个垃圾二合一?? 简单推一下式子可以得到答案就是这个: \[ \sum_{T=1} ...

  5. linux管道pipe详解

    linux管道pipe详解 https://blog.csdn.net/qq_42914528/article/details/82023408

  6. [FUZZ]文件上传fuzz字典生成脚本—使用方法

    文件上传fuzz字典生成脚本-使用方法 原作者:c0ny1 项目地址:https://github.com/c0ny1/upload-fuzz-dic-builder 项目预览效果图: 帮助手册: 脚 ...

  7. JDK提供的原子类原理与使用

    原子更新基本类型 原子更新数组 原子更新抽象类型 原子更新字段 原子更新基本类型: package com.roocon.thread.t8; import java.util.concurrent. ...

  8. Python之pygame学习绘制文字制作滚动文字

    pygame绘制文字 ✕ 今天来学习绘制文本内容,毕竟游戏中还是需要文字对玩家提示一些有用的信息. 字体常用的不是很多,在pygame中大多用于提示文字,或者记录分数等事件. 字体绘制基本分为以下几个 ...

  9. 通过字节码分析this关键字以及异常表的作用

    1.创建MyTest3类 public class MyTest3 { public void test(){ try { InputStream is = new FileInputStream(& ...

  10. SQL Server 查找空值

    需要查找某一列为空的数据 )NULL不能用 “=”运算符 )NULL不支持+-*/ <> )不同的函数对NULL的支持不一样,使用前要测试,不能靠猜,不能凭经验