AOP编程之后置通知、环绕通知、异常通知、引入通知

Spring AOP 前置通知、返回通知、异常通知、后置通知、环绕通知 前置技能: Java、JDBC、Spring IOC快速入门 、 Spring IOC 注解方式注入 什么是AOP: 面向切口编程(Aspect Oriented Programming),AOP是OOP的延续,是Spring框架的一个重要内容。 AOP利用称为"横切"的技术,剖解开封装的对象内部,把多个类的公共行为封装到一个可重用模块中,便于减少重复代码,降低模块之间的耦合度,AOP符合开闭原... 阅读详情

1、后置通知

        当需要在街口方法调用后统一处理事务,如关闭资源,可以使用后置通知。Spring中的后置通知(After Returning advice)必须实现 org.springframework.aop.AfterReturningAdvice 接口,如下:

public class MyAfterReturningAdvice implements AfterReturningAdvice {

	@Override
	public void afterReturning(Object returnValue, Method method, Object[] args, Object tagert) throws Throwable {
		// TODO Auto-generated method stub
        System.out.println("close resource");
	}

}

2、环绕通知

    当需要在调用接口方法前和调用方法后统一处理事务,可以使用环绕通知。实现环绕通知的MethodInterceptor应当实现下面的接口:

package com.mdd.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MyMethodInterceptor implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("调用方法前执行");
		Object obj= arg0.proceed();
		System.out.println("调用方法后执行");
		return obj ;
	}

}

该接口同前两种通知有两个重要区别:1.该通知能够控制目标方法是否真的被调用。通过invocation.proceed()方法来调用。

该通知可以控制返回的对象。可以返回一个与proceed()方法返回对象完全不同的对象。但要谨慎使用。


3、异常通知

    当目标对象的方法出现异常,会统一在异常通知处理。如果连接点抛出异常,异常通知(throws advice)将在连接点返回后被调用。

package com.mdd.aop;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

public class MyThrowsAdvice implements ThrowsAdvice {
	
	public void afterThrowing(Method m, Object[] os, Object 
			target, Exception e)
	{
		System.out.println("出大事了"+ e.getMessage());
	}

}

4、引入通知

    若只需要目标对象指定的方法织入特定的通知,而不是所有的方法,则需要配置引入通知。通过org.springframework.aop.support.NameMatchMethodPointcutAdvisor来进行配置引入通知。


5、各种通知的配置

接口1:Test2ServiceInter.java

package com.mdd.aop;

public interface Test2ServiceInter {
	public void sayBye();

}


接口2:TestServiceInter.java

package com.mdd.aop;


public interface TestServiceInter {
	public void sayHello();
	

}


实现类:Test1Service.java,实现了上面两个接口

package com.mdd.aop;


public class Test1Service implements TestServiceInter, Test2ServiceInter{

	private String userName;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	private int age;
	@Override
	public void sayHello() {
		// TODO Auto-generated method stub
		System.out.println("Hello "+userName +"Age " +age);
//		int i = 9/0;
//		System.out.println(i);
	}
	@Override
	public void sayBye() {
		// TODO Auto-generated method stub
		System.out.println("ByeBye "+userName +"Age " +age);
	}

}


通知的配置如下:

<?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:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
				
<bean id="test1Service" class="com.mdd.aop.Test1Service">
<property name="userName">
<value>madingding</value>
</property>
<property name="age" value="25"/>
</bean>
<bean id="myAfterReturningAdvice" class="com.mdd.aop.MyAfterReturningAdvice"/>
<!--配置环绕通知  -->
<bean id="myMethodInterceptor" class="com.mdd.aop.MyMethodInterceptor"/>
<bean id ="myThrowsAdvice" class="com.mdd.aop.MyThrowsAdvice"/>
<!--定义后置通知的切入点  -->
<!--定义只对代理接口的sayHello方法织入后置通知,其他方法不会有后置通知 -->
<bean id="myMethodAfterAdviceFilter" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="myAfterReturningAdvice"/>
<property name="mappedNames">
	<list>
	<value>sayHello</value>
	</list>
</property>
</bean>

<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">


<!--代理接口集  -->
<property name="proxyInterfaces">
	<list>
	     <value>com.mdd.aop.TestServiceInter</value>
	     <value>com.mdd.aop.Test2ServiceInter</value>
	</list>
</property>

<!-- 将通知织入到代理对象 -->
<property name="interceptorNames">
    <!-- 植入后置通知 -->
    <list>
    <value>myThrowsAdvice</value>
    <!--使用自定义切入点来控制后置通知 ,通过引入通知来控制某个方法织入的通知 -->
	<value>myMethodAfterAdviceFilter</value>
	<value>myMethodInterceptor</value>
	</list>
</property>

<!-- 配置被代理对象 -->
<property name="target" ref="test1Service"/>


</bean>


</beans>


执行结果如下,从结果可以看出,通过引入通知过滤之后,只有sayHello方法织入了后置通知,其他方法没有后置通知。

调用方法前执行
Hello madingdingAge 25
调用方法后执行
close resource
*********************
调用方法前执行
ByeBye madingdingAge 25
调用方法后执行




aop环绕通知下全局异常捕获失效 aop的环绕通知存在的情况下配置全局异常失去作用 ,主要是因为在环绕通知中将发生的异常没有抛出从而导致全局异常捕获不到. 解决方案就是讲aop环绕通知中的异常再次抛出 @Aspect @Component public class LogAspect { @Pointcut("@annotation(com.dh.platform.entity.LogAnnotate)") pu... 阅读详情

相关推荐

Android13配置selinux让system应用可读sys,proc,SN号

Android13预置的system应用,需要读/sys, /proc目录,读(SN)serial number号, 需要修改selinux配置,否则会报avc错.其修改方法会比Android11复杂一些.。

zmlovelx(帅得不敢出门 程序员群31843264) 2654

Spring之aop(关键性概念,前置,后置,环绕,异常,过滤通知的用法及作用)

AOP中关键性概念 : ①、连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出, ②、目标(Target):被通知(被代理)的对象 注1:完成具体的业务逻辑 ③、通知(Advice):在某个特定的连接点上执行的动作,同时Advice也是程序代码的具体实现,例 如一个实现日志记录的代码(通知有些书上也称为处理) 注2:完成切面编程 ④、代理(Proxy):将通知应用到目标对象后创建的对象(代理=目标+通知), 例子:外科医生+护士 注3...

小宝的宝呢的博客 3002

PyCharm配置及使用Git教程

平时习惯在Windows下开发,但是我们又需要实时将远方仓库的代码clone到本地,也需要将自己修改的代码push到远端服务器。

酒酿小圆子呀~ 4万+

spring_AOP前置通知&后置通知&返回通知&环绕通知

Spring AOPAspectJ:(Java社区里最完整最流行的AOP框架)spring自身也有一套AOP框架,但相比较于AspectJ,更推荐AspectJ在Spring2.0以上版本中,可以使用基于AspectJ注解或基于XML配置的AOP。基于AspectJ注解:用AspectJ注解声明切面要在Spring中声明AspectJ切面,只需要在IOC容器中将切面声明为Bean实例,当在Spri...

jingde528的博客 1808

WPF 解决listview值更改时页面没有刷新

WPF 解决listview值更改时页面没有刷新。

weixin_52475977的博客 1385

openEuler 20.03 LTS面向RK3399移植系列(3)—openEuler 20.03 LTS面向Firefly RK3399的第一个版本(Linux kernel 4.4)

任务动机:完成openEuler面向RK3399开发板的移植。 任务描述:按照固件烧写准备,固件获取,固件打包和烧写的步骤实现openEuler面向RK3399开发板的移植,整理过程和相关命令记录到文档。 1. 制作openEuler的rootfs.img 1.1 开发环境 树莓派--openEuler系统 openEuler 20.03 LTS 的内测版本镜像,下载。 1.2 具体操作 1.2.1 ssh远程连接树莓派 确定树莓派IP ssh连接 1.2.2 制作rootfs.img

火种源码的机器人技术专栏 2366

Spring AOP

目录 Spring AOP 一、前言 二、AOP 概念 三、Spring AOP包含以下类型的通知 四、Spring AOP的功能和目标 五、允许@AspectJ的支持 六、代码示例 Spring AOP 一、前言 使用Spring面向切面编程: 面向切面编程(Aspect-oriented Programming 简称AOPAOP) ,是相对面向对象编程(Object-oriented Programming 简称OOP)的框架,作为OOP的一种功能补充. OOP主要的模块单元是类(c

Me_xuan的博客 427

STM32单片机远程升级

stm32远程升级

fang_yang_wa的博客 1万+

Spring的AOP机制---- AOP后置通知---- AOP后置通知

333 转载于:https://www.cnblogs.com/1020182600HENG/p/6175624.html

A458545418的博客 166

安卓app逆向破解脱壳教程

From:Hook 神器家族的 Frida 工具使用详解:https://blog.youkuaiyun.com/FlyPigYe/article/details/90258758 详解 Hook 框架 frida (信抢红包):https://www.freebuf.com/company-information/180480.html APP逆向神器之Frida【Android初级篇】:https://www.jianshu.com/p/2d755beb1c54 frida 官网文档:https://fr..

sinat_28371057的博客 2万+

ABAP代码使用OAuth2.0 Client Credential调用外部API

ABAP-OAuth2.0-调用外部API

m0_74015269的博客 1954

Spring中的环绕通知

环绕通知 问题: 当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了 分析: 通过对比动态代理的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用.而我们的没有,需要调用切入点方法去执行。 解决: Spring框架为我们提供了一个接口,proceedingJoinPoint.该接口有一个方法proceed()此方法就相当于明确调用切入点方法. 该接口可以作为环绕通知的方法参数,...

stay hungry,stay foolish! 484

CST与MATLAB连接设置

打开MATLAB,点击"Set Path"按钮,然后点击"Add Folder"。在CST中,点击"Options"菜单,然后选择"Advanced"选项。在弹出的对话框中,点击"COMSOL"选项卡,并确保"Enable COMSOL"复选框被选中。通过上述步骤和示例代码,你可以开始使用MATLAB与CST进行集成,并根据你的具体需求进行进一步的开发和应用。通过这个简单的示例,你可以开始在MATLAB中与CST进行交互,并根据你的需求进行更复杂的操作,如参数化仿真、优化和数据处理等。

TechPulseZ的博客 1966

Spring框架——AOP前置、后置、环绕、异常通知

通知类型: 步骤: 1.定义接口 2.编写对象(被代理对象=目标对象) 3.编写通知(前置通知目标方法调用前调用) 4.在beans.xml文件配置 4.1配置 被代理对象=目标对象 4.2配置通知 4.3配置代理对象 是 ProxyFactoryBean的对象实例 4.3.1代理接口集--> 4.3.2织

Lizhifun 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring学习之深入AOP面向切面编程

AOP(Aspect Oriented Programming,面向切面编程)的主要目的是针对业务处理过程中的切面进行提取,所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。可以通过预编译方式和运行时动态代理,实现在不修改源代码的请你工况下,给程序动态添加功能的一种技术。在OOP中模块化的关键单元是类,而在AOP中模块化的单元是切面。切面能对关注点进行模块化,例如

逆风奔跑。。不要去考虑什么天赋异禀,一切都来自经历和渴望。 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

springboot与aop的整合

AOP (Aspect Oriented Programming) AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。 引入AOP依赖 在springboot项目中使用aop,首先需要使用引入spring-boot-starter-aop依赖,完成ao...

qq_43091340的博客 111

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring AOP面向切面编程

首先引用pom依赖 &lt;!--引入AOP依赖start--&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-aop&lt;/artifactId&gt; &lt;/dependency...

xuxin132133的博客 251

Java 面向切面 AOP

参考: :http://www.blogjava.net/supercrsky/articles/174368.html AOP: Aspect Oriented Programming 即面向切面编程,可以弥补面向对象的不足。 概念: 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中...

weixin_33835690的博客 94

aop注解配置切点 spring_Spring注解驱动开发之十二——Spring 中AOP介绍以及测试

本文包含以下内容:什么是AOP引入AOP依赖、创建测试类建立配置类,并交由Spring管理通过Spring 管理AOP 测试1.什么是AOPAOP为Aspect Oriented Programming的缩写,是面向切面编程。在应用层面可以理解为:在某个指定的方法执行的前,执行后,执行异常时等不同状态时,运行指定的方法。指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程...

weixin_36418584的博客 172

Spring——AOP

一、AOP:面向切面编程;   底层实现:    1)代理类有接口:使用JDK动态代理;    2)代理类有接口:可以强制使用CGlib动态代理;    3)代理类没有接口:使用CGlib动态代理; 二、概念:   1)连接点(Join point):     能够被拦截的地方:Spring AOP是基于动态代理的,所以是方法拦截的。每个成员方法都可以称之为连接点;   ...

weixin_30526593的博客 77

AOP的一些基本概念

AOP的基本概念 • [b]切面[/b](Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。 • [b]连接点[/b](Joinpoint): 在程序执行过程中某个特定的点,比如某方...

nenty的专栏 142

AOP概念

AOP概念 首先让我们从定义一些重要的AOP概念开始。这些术语不是Spring特有的。 不幸的是,AOP术语并不是特别的直观;如果Spring使用自己的术语,将会变得更加令人困惑。 切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普...

青青子呤,悠悠我心 167

spring AOP

在传统的面向对象编程中,我们通常把某个功能集中在某个类的某个方法中,并且java代码的执行顺序是从上至下(纵向)的,AOP则通过在纵向代码的特定位置植入额外的代码(横切关注点),实现面向切面编程。Spring AOP基于代理模式实现,它使用动态代理技术在运行时为目标对象创建一个代理对象,以拦截和处理与横切关注点相关的方法调用。切点定义了在何处应用通知,而通知则定义了在切点处执行的操作。通知(Advice): 通知是在切点处执行的具体操作。方法在切点匹配的方法成功执行并返回结果后执行,输出方法名和结果。

lizsy的博客 129

Spring学习之旅(四):面向切面编程(AOP)

Spring框架的核心是依赖注入和面向切面编程 面向切面(AOP)的术语是理解AOP的重要内容: 一.通知(Advice):通知定义了切面是什么,定义了切面的功能代码以及什么时候使用。 Spring切面可以应用五种类型的通知: 1.前置通知(Before):在目标方法被调用之前调用通知功能。 2.后置通知(After):在目标方法被调用之后调用通知功能。 3.返回通知(After-re...

qq_40837310的博客 229

spring AOP 理论知识点总结

1.1 AOP的概念 简单地说,AOP就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理(Transactions),日志管理(logging, tracing, profiling and monitoring 记录跟踪 优化 校准),权限控制(Authentication),同步(Synchronization), 封装起来,便于减少系统的重复代码,降低模块间的耦合度

502

【Spring Boot】Spring AOP中的环绕通知

Aspect Oriented Programming(面向切面编程)AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是IoC)AOP是一种思想,是对某一类事情的集中处理。其中在下面的学习中我们会学习到拦截器、统一异常处理,统一结果处理等,这些都是运用了AOP的统一思想来实现的。

smile_sundays的博客 7547
上一篇: AOP编程之前置通知
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值