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 ...
随机推荐
- 【学习笔记】Baby Step Giant Step算法及其扩展
1. 引入 Baby Step Giant Step算法(简称BSGS),用于求解形如\(a^x\equiv b\pmod p\)(\(a,b,p\in \mathbb{N}\))的同余方程,即著名的 ...
- HTML锚点控制,跳转页面后定位到相应位置
想在点击更多的页面 跳转后 用户能看到的是新闻 不用再用scollbar拖下来到新闻页面 这时候就需要在链接上 做下处理 <a href="/article/list/page/ ...
- netty: 以默认的ByteBuf作为传输数据
client部分代码: //线程 EventLoopGroup worker = new NioEventLoopGroup(); //辅助类 Bootstrap b = new Bootstrap( ...
- zookeeper先验知识(2PC+paxos)
一.2PC两阶段提交: 在分布式事务中,每个机器节点只能够明确知道自己事务操作的结果,是成功还是失败,而无法获取其他分布式节点的操作结果,因此在事务操作需要跨多个分布式节点时,需要引入一个协调者统一调 ...
- printf的使用
#!/bin/bashprintf "|------------------------------------\n"printf "this is printf str ...
- 一步一步跟我学ImGui.第一讲.配置OpenGl2+ImGui环境
目录 搭建ImGui例子中的第一个OpenGl2环境 一丶搭建OpenGL2环境 1.下载GLFW库 2.解压GLFW库. 3.将GLFW库拷贝到你的工程文件下. 4.配置到Vs2013中. 5.测试 ...
- shell 一次性杀掉相同名称的进程
这条命令将会杀掉所有含有关键字"LOCAL=NO"的进程 ps -ef|grep LOCAL=NO|grep -v grep|cut -c -|xargs kill - 另一种方法 ...
- 发布自己的类库包到Nuget
今天来记录下发布自己的类库到Nuget. 一.准备工作 注册www.nuget.org,获取APIKey 后面发布要使用到. 二.创建项目 新建类库项目 新建测试demo类 public class ...
- AAR文件简介
假如我们希望提供一个带有资源文件的第三方库给别人使用,总不能直接把源代码给别人,但是我们知道eclipse打包的时候不能包含res的资源文件,于是Android在发布Android studio的时候 ...
- 关于如何取消访问https时的提示:“此网站的安全证书存在问题”的解决方法
问题描述: 症状1:采用IE浏览器通过https/http协议访问网站时,总是提示:“此网站的安全证书存在问题.” 症状2:采用搜狗浏览器打开网页总是看到网页的图片等元素显示不完整,是一个X的小图片. ...