spring3: 切面及通知实例 Aspectj的aop

1.前置通知

接口:

package chapter1.server;public interface IHelloService {public void sayAdvisorBefore(String param) ;
}

  实现

package chapter1.service.impl;import chapter1.server.IHelloService;public class HelloService implements IHelloService {	public void sayAdvisorBefore(String param) {// TODO Auto-generated method stubSystem.out.println("============say " + param);}}

  配置:

<!-- 启动对Aspectj的支持 -->					
<aop:aspectj-autoproxy/>			
<bean id="helloService" class="chapter1.service.impl.HelloService" />		
<bean id="aspect" class="chapter1.aop.HelloAspect"/>

  aop:

package chapter1.aop;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;@Aspect
public class HelloAspect {//定义切入点@Pointcut(value="execution(* chapter1..*.sayAdvisorBefore(java.lang.String)) && args(param)", argNames = "param")public void beforePointcut(String param) {}//定义通知@Before(value = "beforePointcut(param)", argNames = "param")public void beforeAdvice(String param) {System.out.println("===========before advice param:" + param);}
}

  测试程序:

//前置通知public void testAspectj(){ApplicationContext context = new ClassPathXmlApplicationContext("chapter1/aspectj.xml");IHelloService hello = context.getBean("helloService", IHelloService.class);hello.sayAdvisorBefore("before");}

  

 

2.后置返回通知

接口

package chapter1.server;public interface IHelloService2 {public int sayAfterReturning(String param);
}

  实现

package chapter1.service.impl;import chapter1.server.IHelloService2;public class HelloService2 implements IHelloService2 {public int sayAfterReturning(String param) {// TODO Auto-generated method stubSystem.out.println("============ say after returning:" + param);return 1;}}

  配置:

<aop:aspectj-autoproxy/>
<bean id="helloService" class="chapter1.service.impl.HelloService2" />
<bean id="aspect" class="chapter1.aop.HelloAspect2"/>

  aop:

package chapter1.aop;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.AfterReturning;@Aspect
public class HelloAspect2 {//方法一//通知@AfterReturning(	//value="execution(* chapter1..*.sayAdvisorBefore(java.lang.String)) and args(param)",value="execution(* chapter1..*.sayAfterReturning(..))",			argNames="retVal", returning="retVal")public void afterReturningAdvice(Object retVal){System.out.println("================= return after advice : " + retVal);}//方法二//定义切入点@Pointcut(value="execution(* chapter1..*.sayAfterReturning(java.lang.String) and args(param))", argNames="param")public void returnPointcut(String param) {}public void afterReturningAdvice2(Object retVal){}}

  测试程序:

//后置返回通知public void testAspectAfterReturning(){ApplicationContext context = new ClassPathXmlApplicationContext("chapter1/aspectj2.xml");IHelloService2 hello = context.getBean("helloService", IHelloService2.class);hello.sayAfterReturning("hahah");}

  

 

 

3.后置错误通知

接口

package chapter1.server;public interface IHelloService3 {public boolean sayAfterThrow(String param);
}

  实现:

package chapter1.service.impl;import chapter1.server.IHelloService3;public class HelloService3 implements IHelloService3 {public boolean sayAfterThrow(String param) {// TODO Auto-generated method stubSystem.out.println("=========say after throw:" + param);throw new RuntimeException();	}}

  配置:

<!-- 开启对Aspectj的支持 -->	
<aop:aspectj-autoproxy />	
<bean id="helloService" class="chapter1.service.impl.HelloService3" />	
<bean id="aspect" class="chapter1.aop.HelloAspect3" />

  aop:

package chapter1.aop;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;@Aspect
public class HelloAspect3 {@AfterThrowing(value="execution(* chapter1..*.sayAfterThrow(java.lang.String))", argNames="exception", throwing="exception")public void afterThrowAdvice(Exception exception){System.out.println("=========after throwing advice : " + exception);}
}

  测试程序:

//后置错误通知	public void testAfterThrow(){ApplicationContext context = new ClassPathXmlApplicationContext("chapter1/aspectj3.xml");IHelloService3 hello = context.getBean("helloService", IHelloService3.class);hello.sayAfterThrow("error");}

  

 

 

4.环绕通知

接口:

package chapter1.server;public interface IHelloService4 {public void sayAround(String param);
}

  实现:

package chapter1.service.impl;import chapter1.server.IHelloService4;public class HelloService4 implements IHelloService4 {public void sayAround(String param) {// TODO Auto-generated method stubSystem.out.println("============= say around: " + param);}}

  配置:

<!-- 开启对Aspectj的支持 -->		
<aop:aspectj-autoproxy/>			
<bean id="helloService" class="chapter1.service.impl.HelloService4" />
<bean id="aspect" class="chapter1.aop.HelloAspect4"/>

  aop:

package chapter1.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;@Aspect
public class HelloAspect4 {@Around(value="execution(* chapter1..*.sayAround(java.lang.String))", argNames="param")public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable{System.out.println("========= around before advice");Object retVal = pjp.proceed(new Object[] {"我被替换了呀"});System.out.println("========= around before advice");return retVal;}
}

  测试程序:

//环绕通知	public void testAround(){ApplicationContext context = new ClassPathXmlApplicationContext("chapter1/aspectj4.xml");IHelloService4 hello = context.getBean("helloService", IHelloService4.class);hello.sayAround("gaga ya xia ba");}

  

 

 

5.引入(结合chatper1.service.IHelloService程序来试验)

接口:

package chapter1.server;public interface IHelloService5 {public void sayDeclare();
}

  实现:

package chapter1.service.impl;import chapter1.server.IHelloService5;public class HelloService5 implements IHelloService5 {public void sayDeclare() {// TODO Auto-generated method stubSystem.out.println("=========== say declare  " );	}}

  配置:

<!-- 开启对Aspect的支持 -->
<aop:aspectj-autoproxy/>					
<bean id="helloService" class="chapter1.service.impl.HelloService"/>		
<bean id="aspect" class="chapter1.aop.HelloAspect5"/>	

  aop:

package chapter1.aop;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;import chapter1.server.IHelloService5;
import chapter1.service.impl.HelloService5;@Aspect
public class HelloAspect5 {@DeclareParents(value="chapter1..*.HelloService+",defaultImpl=HelloService5.class)public IHelloService5 ihelloService5;}

  测试程序:

//引入@Testpublic void testDeclare(){ApplicationContext context = new ClassPathXmlApplicationContext("chapter1/aspectj5.xml");IHelloService5 hello = context.getBean("helloService", IHelloService5.class);hello.sayDeclare();}

  

 

转载于:https://www.cnblogs.com/achengmu/p/8580207.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微型计算机接口与技术期末,微机原理与接口技术期末考试试题及答案.pdf

微机原理与接口技术期末考试题库1. 微机系统的硬件由哪几部分组成&#xff1f;答&#xff1a;三部分&#xff1a;微型计算机 (微处理器&#xff0c;存储器&#xff0c;I/0接口&#xff0c;系统总线)&#xff0c;外围设备&#xff0c;电源。2. 什么是微机的总线&#xff0c;分为…

html对图片轮播脚本怎么调用,【jquery前端开发】可调整的幻灯片(图片轮播)

第一次写博客&#xff0c;希望接下来写的东西 或多或少能帮到些人&#xff0c;虽然这些东西都是一些大神前辈们写了无数遍的东西&#xff0c;但我尽量以一名小白的视角把代码写得清楚点&#xff0c;好心人的就给点赞吧。1.前期准备这是我们编写代码前必须要做的事&#xff0c;在…

数据类型总结(干货)

Java中的数据类型和C的数据类型基本是一致的&#xff0c;本来以为不需要怎么看&#xff0c;后来发现还是有些地方需要好好总结一下。 基本的就不说了&#xff0c;直接上干货。 我总结了下&#xff0c;数据类型的转换和赋值有以下几点是比较麻烦的&#xff1a; 1、整数直接量可以…

计算机主机信息怎么看,本机电脑硬件配置信息怎么看?Win7/Win10查看详细电脑配置方法...

电脑配置决定了一台电脑的性能好坏&#xff0c;如果电脑配置没有达到游戏或者软件的要求&#xff0c;那么肯定无法流畅运行的。对于一些小白用户不知道如何查看电脑硬件配置&#xff0c;那么本机电脑硬件配置信息怎么看&#xff1f;下面装机之家小编分享一下Win7/Win10查看详细…

软件工程网络15个人阅读作业2(201521123024丁树乐)

提出问题 question1.我看到书P27中写到“100%的代码覆盖率并不等同于100%的正确性”那么怎么样去确保100%的正确性&#xff1f; 写代码注意结构和代码规范&#xff0c;注释要写全&#xff0c;代码尽量精简&#xff0c;不要一坨坨的堆在一起。 在目前行业内的成熟方案有如下几个…

Uva 1025 - A Spy in the Metro(DP)

题目链接 https://vjudge.net/problem/UVA-1025 【题意】 某城市里的地铁是线性的&#xff0c;有n个车站&#xff08;2<n<50&#xff09;&#xff0c;有M1辆列车从第1站从左往右开&#xff0c;有M2辆列车从第n站从右往左开&#xff0c;在0时刻间谍从第一站出发&a…

未来计算机控制器趋势,未来DCS控制系统技术发展4大趋势

DCS系统是继PLC之外的一大自动化控制系统&#xff0c;它在化工、火电等领域的应用极为广泛&#xff0c;但是生产方面的自动化技术需求进一步提高&#xff0c;传统的DCS系统已不能满足需要&#xff0c;需要进行技术升级。DCS系统由多台计算机分别控制生产过程中多个控制回路&…

《Java技术》第一次作业

&#xff08;一&#xff09;、学习总结 1.在java中通过Scanner类完成控制台的输入&#xff0c;查阅JDK帮助文档&#xff0c;Scanner类实现基本数据输入的方法是什么&#xff1f;不能只用文字描述&#xff0c;一定要写代码&#xff0c;通过具体实例加以说明。 文本扫描类Scanner…

计算机主机开机为什么显示器不开,电脑开机后显示器不亮怎么办?电脑开机后显示器没反应的解决办法...

电脑开机后显示器不亮怎么办&#xff1f;电脑开机故障屡见不鲜&#xff0c;最近又有用户反馈开机问题了&#xff0c;一用户反馈说&#xff0c;电脑主机是可以正常开机的&#xff0c;但就是显示器不亮&#xff0c;这是怎么回事呢&#xff1f;出现这种情况可能是显示器或主机故障…

斯坦福-随机图模型-week4.0_

title: 斯坦福-随机图模型-week4.0 tags: note notebook: 6- 英文课程-9-Probabilistic Graphical Models 1: Representation --- 斯坦福-随机图模型-week4.0 最大期望收入模型 简答的决策 我们使用随机图模型进行决策需要的原料是什么ne ? 我们需要决策的情景一些列的可能的行…

西北农林科技大学计算机老师 癌症,西北农林科大攻克苹果树“癌症”

由西北农林科技大学主持完成的“苹果树腐烂病等重大病害生物学及防治技术研究”项目&#xff0c;12月12日在陕西杨凌农科城通过鉴定。鉴定委员认为该成果在苹果树腐烂病菌、轮纹病菌的生物学基础研究方面达到了国际领先水平。我国苹果栽培面积和产量分别占世界总量的2/5和1/3&a…

计算机行业哪个会议论文最好,《第三次全国电子计算机专业学术会议论文选集》...

1964年12月&#xff0c;国防工业出版社出版了《第三次全国电子计算机专业学术会议论文选集》(以下简称《选集》)&#xff0c;由中国电子学会计算机专业委员会编辑&#xff0c;《选集》内容覆盖之广令人震惊。《选集》的内容表达了1961年以来国内计算技术在理论与实际方面的工作…

maven运行tomcat6出现错误Exception starting filter encodingFilter怎么解决

严重: Exception starting filter encodingFilterjava.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filterat org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.j…

windows系统OLLVM + NDK 混淆编译环境搭建

一、环境搭建&#xff1a; 系统&#xff1a;win10_X64 ndk版本&#xff1a;ndk-r12b&#xff08;ndk-r12b后续版本也适用&#xff09; cmake-3.9.1-win64-x64.msi 用于针对不同编译器生成源代码构建文件&#xff0c;如使用VS则生成(.sln)等VS配置文件&#xff0c;如果使用gcc则…

计算机组成实验微程序控制器实验,计算机组成原理实验报告3++微程序控制器实验.doc...

文档介绍&#xff1a;计算机组成原理实验报告3微程序控制器实验计算机组成原理实验报告实验三微程序控制器实验一.实验目的与要求:实验目的:1.理解时序产生器的原理,了解时钟和时序信号的波形;2.掌握微程序控制器的功能,组成知识;3.掌握微指令格式和各字段功能;4.掌握微程序的编…

展开符和解构赋值

一、展开符展开符(剩余操作符)&#xff1a;...1.展开符号use strict; let arr_one [1,3]; let arr_two [4,5,...arr_one]; console.log(arr_one);//[ 1, 3 ] console.log(...arr_one);//1 3 console.log(arr_two);//[ 4, 5, 1, 3 ]2.剩余操作符&#xff08;类似arguments&…

a开头的计算机语言,我们刚开始接触计算机语言大多从Hello world 开始

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼char szClassName[] "MainWnd";HINSTANCE hInstance;int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){HWND hwnd;MSG msg;WNDCLASSEX wincl;hInstance hInst;wincl.cbS…

2.1 linux C 进程与多线程入门--(1)进程和程序的区别

进程和程序的区别: j进程是活动的程序&#xff0c;而程序是一个代码的集合。进程是加载到内存中的程序&#xff0c;而程序没有加载到内存中&#xff0c;只是在磁盘上存储着。 1234567891011121314151617181920212223242526272829303132#include<sys/types.h>#include<…

计算机一级表格样式在哪儿,word表格样式在哪 word表格样式在哪里

word2007中设置好正文样式怎样设置表格样式1. 打开word(以2007为例)【开始】--> 【样式】&#xff0c;打开样式右下角的小箭头&#xff0c;或者alt shift ctrl S&#xff0c;打开全部式样 2. 在全部式样里&#xff0c;选择你要改的类型&#xff0c;点击该类型右边的下拉箭…

day11_用例执行顺序、跳过用例skip用法

用例执行顺序是按照test后面的字母排序进行的&#xff0c;字母靠前先执行&#xff0c;靠后后执行 import unittestclass My(unittest.TestCase): def test_a(self): print(haha) def test_z(self): print(哈哈哈哈)unittest.main() unittest提供了一些跳过…