Spring 学习——Spring AOP——AOP配置篇Advice(有参数传递)
声明通知Advice
- 配置方式(以前置通知为例子)
- 方式一

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
<aop:before method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
</aop:aspect>
</aop:config>
package com.jing.spring.aop;
/**
* 业务代码
*/
public class IKAspectBiz { public void add(String name){
System.out.println("IKAspectBiz.add");
}
}package com.jing.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint; /**
* 切面代码
*/
public class IKAspect { public void aspectBefore(String name){
System.out.println("IKAspect.aspectBefore,it~s 前置通知");
System.out.println("IKAspect.aspectBefore,it~s 前置通知"+name);
}
}- 优点:前置通知、后置通知、环绕通知使用同一个切点时,配置一个<aop:poincut />即可,方便配置。
- 方式二

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:before method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
</aop:aspect>
</aop:config>
package com.jing.spring.aop;
/**
* 业务代码
*/
public class IKAspectBiz { public void add(String name){
System.out.println("IKAspectBiz.add");
}
}package com.jing.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint; /**
* 切面代码
*/
public class IKAspect { public void aspectBefore(String name){
System.out.println("IKAspect.aspectBefore,it~s 前置通知");
System.out.println("IKAspect.aspectBefore,it~s 前置通知"+name);
}
}- 优点:前置通知、后置通知、环绕通知使用不同切点时,不需要配置<aop:poincut />元素,可以直接在<aop:before />元素内配置切点。
- Next
- 方式一
- 前置通知(Before Advice)
- 在切入点时机事务执行之前,执行通知
- 方式一

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
<aop:before method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
</aop:aspect>
</aop:config>
- 方式二

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:before method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
</aop:aspect>
</aop:config>
- Next
- 后置通知(After Running Advice)
- 在切入点时机事务执行之后,执行通知(前提:切入点执行时没有异常,否则不会执行)
- 方式一

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
<aop:after-returning method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
</aop:aspect>
</aop:config>
- 方式二

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:after-returning method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
</aop:aspect>
</aop:config>
- Next
- 抛出异常通知(After Throwing Advice)
- 若在切入点时机执行时抛出异常,执行通知。(执行异常通知,则不会执行后置通知)
- 方式一

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name) "></aop:pointcut>
<aop:after-throwing method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
</aop:aspect>
</aop:config>
- 方式二

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:after-throwing method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
</aop:aspect>
</aop:config>
- Next
- 后通知(After Ending Advice)
- 在切入点时机执行之后,执行通知。(切入点执行时,无论正常执行,还是抛出异常,都会执行通知,相当于try_catch_finally)。
- 方式一

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:pointcut>
<aop:after method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
</aop:aspect>
</aop:config>
- 方式二

<aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:after method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..)) and args(name)"></aop:before>
</aop:aspect>
</aop:config>
- Next
- 无论切面是否出现异常,后通知动作正常执行
- 环绕通知(Around Advice)
- 环绕通知在
- 方式一

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd" > <bean id="ikAspect" class="com.jing.spring.aop.IKAspect"></bean>
<bean id="ikAspectBiz" class="com.jing.spring.aop.IKAspectBiz"></bean> <aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.aopParams(String,int)) and args(name,times)"></aop:pointcut>
<aop:around method="aspectAroundParams" pointcut-ref="ikPoint"></aop:around>
</aop:aspect>
</aop:config> </beans>

package com.jing.spring.aop; /**
* 业务代码
*/
public class IKAspectBiz { public void aopParams(String name,int times){
System.out.println("IKAspectBiz.aopParams");
}
}
package com.jing.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint; /**
* 切面代码
*/
public class IKAspect {
public void aspectAroundParams(ProceedingJoinPoint pj,String name,int times){ System.out.println("IKAspect.aspectAroud,its 环绕通知前:");
System.out.println("IKAspect.aspectAroud,"+name+"-----"+times);
try {
Object proceed = pj.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("IKAspect.aspectAroud,its 环绕通知后");
System.out.println("IKAspect.aspectAroud,"+name+"-----"+times); }
} - 方式二

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd" > <bean id="ikAspect" class="com.jing.spring.aop.IKAspect"></bean>
<bean id="ikAspectBiz" class="com.jing.spring.aop.IKAspectBiz"></bean> <aop:config>
<aop:aspect id="ikAspectAop" ref="ikAspect">
<aop:around method="aspectAroundParams" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.aopParams(String,int)) and args(name,times)"></aop:around>
</aop:aspect>
</aop:config> </beans>


package com.jing.spring.aop; /**
* 业务代码
*/
public class IKAspectBiz { public void aopParams(String name,int times){
System.out.println("IKAspectBiz.aopParams");
}
}
package com.jing.spring.aop;
import org.aspectj.lang.ProceedingJoinPoint; /**
* 切面代码
*/
public class IKAspect { public void aspectAroundParams(ProceedingJoinPoint pj,String name,int times){ System.out.println("IKAspect.aspectAroud,its 环绕通知前:");
System.out.println("IKAspect.aspectAroud,"+name+"-----"+times);
try {
Object proceed = pj.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("IKAspect.aspectAroud,its 环绕通知后");
System.out.println("IKAspect.aspectAroud,"+name+"-----"+times); }
} - Next
谨记
- 切面中的参数来源是从业务中取得的,也就是说,只有在切点中的参数,才会传送到相对应的切面中,所以,切面中方法参数和切点时机的参数要保持对应。
<aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.aopParams(String,int)) and args(name,times)"></aop:pointcut>
<aop:around method="aspectAroundParams" pointcut-ref="ikPoint"></aop:around>
- (以环绕通知举例)上述中的args(name,times)中的参数name对应切面IKAspect 类中的aspectAroundParams(ProceedingJoinPoint pj,String name,int times)方法中的参数,并且参数名称和顺序需要与切面中的通知方法参数名称和顺序一致。
- (以环绕通知举例)上述中的aopParams(String,int)中的参数是对应业务IKAspectBiz 类中的aopParams(String name,int times)方法中的参数类型。
Spring 学习——Spring AOP——AOP配置篇Advice(有参数传递)的更多相关文章
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Spring 学习——Spring AOP——AOP概念篇
AOP AOP的定义:AOP,Aspect Oriented Programming的缩写,意为面向切面编程,是通过预编译或运行期动态代理实现程序功能处理的统一维护的一种技术 实现方式 预编译 Asp ...
- spring学习06(AOP)
9.AOP 什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...
- Spring学习笔记4——AOP
AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...
- Spring学习--基于 XML 的配置声明切面
正常情况下 , 基于注解的生命要优先于基于 XML 的声明. 通过 AspectJ 注解 , 切面可以与 AspectJ 兼容 , 而基于 XML 的配置则是 Spring 专有的.由于 Aspect ...
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring学习七----------Bean的配置之自动装配
© 版权声明:本文为博主原创文章,转载请注明出处 Bean的自动装配(Autowiring) no:不启用自动装配,此时需要手动注入.参考:Spring学习三----------注入方式 defaul ...
- Spring Boot 探索系列 - 自动化配置篇
26. Logging Prev Part IV. Spring Boot features Next 26. Logging Spring Boot uses Commons Logging f ...
- Spring学习八----------Bean的配置之Resources
© 版权声明:本文为博主原创文章,转载请注明出处 Resources 针对于资源文件的统一接口 -UrlResource:URL对应的资源,根据一个URL地址即可创建 -ClassPathResour ...
随机推荐
- 在队列中join()与task_done()的关联性
1.基础解释: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 Queue.join() 实际上意味着等到队列为空,再执 ...
- [archlinux]在linux使用aria2下载磁力链接
1.在公网出口做好dnat,端口映射,虚拟服务等.导致内网主机的udp和tcp端口上. 2.在linux主机上,加两条防火墙规则 ┬─[tong@T7:~]─[:: PM] ╰─>$ sudo ...
- Ubuntu18.04 快速返回桌面 【快捷键】
设置->设备->键盘->窗口->隐藏窗口 :双击重置快捷键
- mysql数据类型和基础语句
阅读目录 转载 https://www.cnblogs.com/Eva-J/articles/9683316.html 数值类型 日期时间类型 字符串类型 ENUM和SET类型 返回顶部 数值类型 M ...
- springboot热部署配置
1.pom添加spring-boot-devtools依赖和配置编译插件 <dependency> <groupId>org.springframework.boot</ ...
- ADB——连接手机的三种方式
有USB连接 硬件状态正常. 包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好. Android 设备的开发者选项和 USB 调试模式已开启. 可以到「设置」-「开发者选项」- ...
- c++中的auto、const auto&
先介绍一下auto.const: 在块作用域.命名作用域.循环初始化语句等等 中声明变量时,关键词auto用作类型指定符. const:修饰符 接下来我们细细分析一下: (1)auto auto即 ...
- pwn学习日记Day1 基础知识积累
ida / od 窗口(针对od操作) 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址.HEX 数据.反汇编.注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进 ...
- 一小时上手Java 8新特性
一小时上手Java 8新特性 本文摘译自 https://www.journaldev.com/2389/java-8-features-with-examples,并做了适当增补. Iterable ...
- JavaScript实现RSA加解密
在GitHub上找到jsencrypt.js对RSA加解密的工具文件,地址分别是:https://github.com/travist/jsencrypt和https://github.com/ope ...