1、Spring AOP相关描述
基于Schmeade的AOP从Spring2.0之后通过“aop”命名空间来定义切面(Aspect)、切入点(Pointcut)、增强(Advice)。 在Spring配置文件中,所有AOP相关定义都必须放在<aop:config>标签下,该标签有<aop:pointcut>、<aop:advisor>、<aop:aspect>标签,配置顺序不可改变。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 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-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
1)、aop:pointcut:用来定义切入点,加入增强的位置 2)、aop:advisor:用来定义只有一个通知和一个切入点的切面 3)、aop:aspect:用来定义切面,内部可以有多个切入点和增强(前置通知、后置通知、异常...) 4)、aop:aspect与aop:advisor不同之处就在于advisor只能声明一个切入点和一个增强。 <aop:advisor advice-ref="" pointcut=""/>
2、定义业务Bean:
package com.sxit; public class HelloWorldService { public void say(String a,String b){ System.out.println("我说...................."); } public void look() throws Exception{ System.out.println("我看....................."); } }
3、定义切面:
package com.sxit; /** * 切面类 */ public class HelloWorldAspect { //方法执行前执行 public void before(){ System.out.println("before:------------------->>>"); } //方法执行完执行(不抛异常的情况下) public void after(){ System.out.println("after======"); } //方法执行完执行(抛异常的情况下也执行,相当于finaaly) public void returnFinally(){ System.out.println("returnFinally"); } //方法抛出异常时执行 public void exception(Exception e){ System.out.println("exception"+e); } }
4、配置xml:
1)、首先先声明业务Bean和切面Bean <!-- 切面Bean --> <bean id="helloWorldAspect" class="com.sxit.HelloWorldAspect" /> <!-- 业务Bean --> <bean id="helloWorldService" class="com.sxit.HelloWorldService" /> 2)、使用<aop:config>标签按顺序的写切入点、切面 3)、定义切入点: <aop:pointcut id="onePointcut" expression="execution(* com.sxit..*.*(..))"/> 4)、定义切面: <aop:aspect id="oneAspect" ref="helloWorldAspect"> <aop:before pointcut-ref="onePointcut" method="before"/> </aop:aspect>
5、测试类:
public class Test { public static void main(String[] args){ ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); HelloWorldService hello = (HelloWorldService)ac.getBean("helloWorldService"); hello.look(); } }
6、前置通知:在目标对象方法执行前切入增强逻辑,使用<aop:before>标签声明
1)、前置通知格式:<aop:before pointcut="切入点表达式" pointcut-ref="如果已配置pointcut,这里写某个切入点的Bean Id" method="增强类中方法" arg-names="增强方法参数名"/> 2)、配置: <aop:before pointcut-ref="onePointcut" method="before"/> 3)、打印信息: before:------------------->>> 我说.................... 4)、这里pointcut和point-ref任选一个,如果使用外部已经声明好的切入点,则直接使用point-ref引用,如果没有,则自己声明一个内部通知。method参数是指切入增强的具体方法。 5)、这里再来看下args的功能:先在切面类中加入一个带参数的before方法对应业务Bean中的say方法。 public void before2(String aa,String bb){ System.out.println("before:------------------->>>"+aa+"===="+bb); } 6)、修改切点表达式:这里的aa,bb用来匹配目标类中对应参数名方法 <aop:pointcut id="onePointcut" expression="execution(* com.sxit..*.*(..)) and args(aa,bb)"/> 7)、修改前置通知:这里arg-names是增强方法中与目标方法同名参数 <aop:aspect id="oneAspect" ref="helloWorldAspect"> <aop:before pointcut-ref="onePointcut" method="before2" arg-names="aa,bb"/> </aop:aspect> 8)、args中参数名和个数和arg-names中保持一致就是了。
7、后置异常通知:方法执行抛出异常时会调用增强中对应方法,使用<aop:after-throwing>标签
1)、配置,这里需要加上一个throwing,这里与增强Bean中异常参数名一致 <aop:after-throwing pointcut-ref="onePointcut" method="exception" throwing="e"/> 2)、增强Bean //方法抛出异常时执行 public void exception(Exception e){ System.out.println("exception"+e); } 3)、修改业务Bean,使look方法运行时抛出异常 public void look() throws Exception{ System.out.println("我看....................."); throw new Exception(); } 4)、测试类: ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); HelloWorldService hello = (HelloWorldService)ac.getBean("helloWorldService"); try { hello.look(); } catch (Exception e) { } 5)、运行结果: 我看..................... exception java.lang.Exception
8、后置返回通知:方法执行完后切入增强,抛出异常则不执行,使用<aop:after-returning>
1)、配置方式:这里的returning是增强方法中参数的名字 <aop:after-returning pointcut-ref="onePointcut" method="after" returning="o"/> 2)、业务Bean中增加一个方法:用来把返回值传递给切面Bean public int sb(){ System.out.println("sb+++"); int sb = 2; return sb; } 3)、修改切面Bean after方法:这里的参数o就是配置文件中的returning public void after(Object o){ System.out.println("after======"+o); } 4)、打印信息: sb+++ after======2
9、后置最终通知,在切入点方法返回时,不论是否抛出异常均切入增强,使用<aop:after>标签声明
1)、配置: <aop:after pointcut-ref="onePointcut" method="returnFinally" arg-names=""/> 2)、打印信息: 我看..................... returnFinally 3)、抛出异常也会切入增强: <aop:aspect id="oneAspect" ref="helloWorldAspect"> <aop:after-throwing pointcut-ref="onePointcut" method="exception" throwing="ew"/> <aop:after pointcut-ref="onePointcut" method="returnFinally" arg-names=""/> </aop:aspect> public void look() throws Exception{ System.out.println("我看....................."); throw new Exception(); } hello.look(); 4)、打印信息: 我看..................... exception java.lang.Exception returnFinally
10、环绕通知:在切入点前后均能执行的通知,它可以决定目标方法是否执行,何时执行,执行时是否替换方法参数,执行完是否需要替换返回值,可通过<aop:around>来声明:
1)、新增环绕通知实现: public Object around(ProceedingJoinPoint pjp){ System.out.println("环绕start-----"); Object result = null; try { result = pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } System.out.println("环绕end-----"); return result; } 2)、配置: <aop:around pointcut-ref="onePointcut" method="around"/> 3)、打印信息: 环绕start----- 我看..................... 环绕end-----
参考自:http://jinnianshilongnian.iteye.com/blog/1418598
http://ch-space.iteye.com/blog/493956
相关推荐
修炼成Javascript中级程序员必知必会_资源分享
内容概要:本文详细介绍了如何使用MATLAB的深度学习工具箱,在果树病虫害识别任务中从数据准备、模型设计、训练优化到最后的模型评估与应用全流程的具体实施步骤和技术要点。涵盖了MATLAB深度学习工具箱的基本概念及其提供的多种功能组件,如卷积神经网络(CNN)的应用实例。此外,文中还具体讲述了数据集的收集与预处理方法、不同类型的深度学习模型搭建、训练过程中的超参数设定及其优化手段,并提供了病虫害识别的实际案例。最后展望了深度学习技术在未来农业领域的潜在影响力和发展前景。 适合人群:对深度学习及农业应用感兴趣的科研人员、高校师生和相关从业者。 使用场景及目标:①希望掌握MATLAB环境下构建深度学习模型的方法和技术细节;②从事果树病虫害管理研究或实践,寻找高效的自动化解决方案。 阅读建议:在阅读本文之前,建议读者熟悉基本的MATLAB编程环境及初步了解机器学习的相关概念。针对文中涉及的理论和技术难点,可以通过官方文档或其他教程进行补充学习。同时,建议动手实践每一个关键点的内容,在实践中加深理解和掌握技能。
nodejs010-nodejs-block-stream-0.0.7-1.el6.centos.alt.noarch.rpm
机械模型与技术交底书的融合:创新点详解与解析,机械模型加技术交底书,有创新点 ,机械模型; 技术交底书; 创新点,创新机械模型与技术交底书详解
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
nodejs010-nodejs-cmd-shim-1.1.0-4.1.el6.centos.alt.noarch.rpm
西门子四轴卧加后处理系统:828D至840D兼容,四轴联动高效加工解决方案,支持图档处理及试看程序。,西门子四轴卧加后处理,支持828D~840D系统,支持四轴联动,可制制,看清楚联系,可提供图档处理试看程序 ,核心关键词:西门子四轴卧加后处理; 828D~840D系统支持; 四轴联动; 制程; 联系; 图档处理试看程序。,西门子四轴卧加后处理程序,支持多种系统与四轴联动
基于黏菌优化算法(SMA)的改进与复现——融合EO算法更新策略的ESMA项目报告,黏菌优化算法(SMA)复现(融合EO算法改进更新策略)——ESMA。 复现内容包括:改进算法实现、23个基准测试函数、多次实验运行并计算均值标准差等统计量、与SMA对比等。 程序基本上每一步都有注释,非常易懂,代码质量极高,便于新手学习和理解。 ,SMA复现;EO算法改进;算法实现;基准测试函数;实验运行;统计量;SMA对比;程序注释;代码质量;学习理解。,标题:ESMA算法复现:黏菌优化与EO算法融合改进的实证研究
基于MATLAB的Stewart平台并联机器人仿真技术研究与实现:Simscape环境下的虚拟模拟分析与应用,MATLAB并联机器人Stewart平台仿真simscape ,MATLAB; 并联机器人; Stewart平台; 仿真; Simscape; 关键技术。,MATLAB中Stewart平台并联机器人Simscape仿真
Grad-CAM可视化医学3D影像
探索comsol泰勒锥:电流体动力学的微观世界之旅,comsol泰勒锥、电流体动力学 ,comsol泰勒锥; 电流体动力学; 锥形结构; 电场影响,COMSOL泰勒锥与电流体动力学研究
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
PFC6.03D模型动态压缩模拟与SHPB霍普金森压杆系统理论及实验数据处理技术解析,PFC6.03D模型,动态压缩模拟,还包括: SHPB霍普金森压杆系统理论知识介绍,二波法和三波法处理实验数据,提出三波波形,计算动态压缩强度等 ,PFC模型; 动态压缩模拟; SHPB霍普金森压杆系统; 理论介绍; 二波法处理; 三波法处理; 三波波形; 动态压缩强度。,"PFC模型下的动态压缩模拟及SHPB理论实践研究"
ProASCI 开发板原理图,适用于A3P3000
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1、文件内容:pykde4-devel-4.10.5-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pykde4-devel-4.10.5-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
基于Comsol模拟的三层顶板随机裂隙浆液扩散模型:考虑重力影响的瞬态扩散规律分析,Comsol模拟,考虑三层顶板包含随机裂隙的浆液扩散模型,考虑浆液重力的影响,模型采用的DFN插件建立随机裂隙,采用达西定律模块中的储水模型为控制方程,分析不同注浆压力条件下的浆液扩散规律,建立瞬态模型 ,Comsol模拟; 随机裂隙浆液扩散模型; 浆液重力影响; DFN插件; 达西定律模块储水模型; 注浆压力条件; 浆液扩散规律; 瞬态模型,Comsol浆液扩散模型:随机裂隙下考虑重力的瞬态扩散分析
A simple fast, easy use distributed file system written by golang(similar fastdfs).go-fastdfs
手机编程-1738391552157.jpg