Spring中关于AOP的实践之Scheme方式实现通知
(刚开始写东西,不足之处还请批评指正)
关于AOP的通知编写方式有两种,使用Schema-baesd或者使用AspectJ方式,本篇主要介绍Schema-baesd方式的代码实现。
(注:代码中没有添加任何业务逻辑,只是单纯的输出语句,若读者大人有什么业务逻辑希望本人实现作为参考的可以给我留言)
一. 实现通知方法
1.前置通知需要实现:MethodBeforeAdvice接口,并重写before方法
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice; public class BeforAdvice implements MethodBeforeAdvice { @Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("准备设备,准备武器弹药,组织救援人员");
}
}
其中的几个参数:
1)Method method:切点方法
2)Object[] objects:切点方法参数(可能有多个或者没有)
3)Object o:切点所在类的对象
2.后置通知的实现需要实现:AfterReturningAdvice接口,并重写afterReturning方法
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice; public class AfterAdvice implements AfterReturningAdvice { @Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1)
throws Throwable {
System.out.println("人员已救出,生命状态良好,无生命危险");
}
}
其中的几个参数解释:
1)Object o:切点方法的返回值
2)Method method:切点方法
3)Object[] onjects:切点方法参数
4)Object o1:切点所在的类的对象
3.异常通知的实现需要实现:ThrowsAdice接口,由于ThrowsAdvice接口没有方法可重写,可以自己自定义一个方法,唯一要注意的是方法参数是切点将会抛出的异常名称,如果嫌麻烦可以使用Exception作为方法参数
import org.springframework.aop.ThrowsAdvice; public class ErrorAdvice implements ThrowsAdvice {
public void afterThrowing(Exception e)throws Throwable{
System.out.println("任务执行异常,任务失败"); } }
4.环绕通知的实现需要实现:MethodInterceptor接口,并重写invoke方法
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; public class ArroundAdvice implements MethodInterceptor { @Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
//前置通知
System.out.println("环绕通知:准备设备,准备武器弹药,组织救援人员");
//放行,调用切点方法
Object result=methodInvocation.proceed();
//后置通知
System.out.println("环绕通知:人员已救出,生命状态良好,无生命危险");
return result;
}
}
二. 实现切点所在的类
package com.xkx.pojo; public class People {
private int age;
private String name;
private String sexual; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSexual() {
return sexual;
} public void setSexual(String sexual) {
this.sexual = sexual;
} @Override
public String toString() {
return this.getAge()+"--"+this.getName()+"--"+this.getSexual();
} public People() {
} public People(int age, String name, String sexual) {
this.age = age;
this.name = name;
this.sexual = sexual; }
public void crraped(){
System.out.println(this.getName()+"已被绑架");
} public void show(){
System.out.println("切点执行:解救"+this.getName()+"任务");
} public void covert(){
System.out.println("解救成功,召开新闻发布会");
} }
三. 在Spring的配置文件:applicationContext.xml中进行配置
1.添加aop依赖,可以去spring-framework中的Core technologies中搜索文档,搜索关键字:xmlns:aop
2.添加配置
<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id ="beforeAdvice" class="com.xkx.adviceDemo.BeforAdvice"></bean>
<bean id="afterAdvice" class="com.xkx.adviceDemo.AfterAdvice"></bean>
<bean id="errorAdvice" class="com.xkx.adviceDemo.ErrorAdvice"></bean>
<bean id="arroundAdvice" class="com.xkx.adviceDemo.ArroundAdvice"></bean> <aop:config>
<aop:pointcut expression="execution(* com.xkx.pojo.People.show())" id="mypeople" ></aop:pointcut>
<aop:advisor advice-ref="beforeAdvice" pointcut-ref="mypeople"></aop:advisor>
<aop:advisor advice-ref="afterAdvice" pointcut-ref="mypeople"></aop:advisor>
<aop:advisor advice-ref="errorAdvice" pointcut-ref="mypeople"></aop:advisor>
<aop:advisor advice-ref="arroundAdvice" pointcut-ref="mypeople"></aop:advisor>
</aop:config> <bean id ="people" class="com.xkx.pojo.People">
<constructor-arg index="0" name="age" type="int" value="22"></constructor-arg>
<constructor-arg index="1" name="name" type="java.lang.String" value="吾先生"></constructor-arg>
<constructor-arg index="2" name="sexual" type="java.lang.String" value="male"></constructor-arg>
</bean>
</beans>
四. 测试
package com.xkx.demotest; import com.xkx.pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test2 { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = ac.getBean("people",People.class);
people.crraped();
people.show();
people.covert(); } }
Spring中关于AOP的实践之Scheme方式实现通知的更多相关文章
- Spring中关于AOP的实践之AspectJ方式实现通知
(本文中如有不当之处,恳请批评指正) AspectJ方式的简化了通知的出现复杂度.但是对配置文件的操作复杂度有了一定的提升 一. 配置通知 package com.xkx.adviceDemo; im ...
- Spring中关于AOP的实践之概念
一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...
- Spring官网阅读(十八)Spring中的AOP
文章目录 什么是AOP AOP中的核心概念 切面 连接点 通知 切点 引入 目标对象 代理对象 织入 Spring中如何使用AOP 1.开启AOP 2.申明切面 3.申明切点 切点表达式 excecu ...
- Spring中的AOP
什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...
- Spring中的AOP 专题
Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...
- spring中的AOP 以及各种通知 配置
理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...
- Spring学习笔记(四)—— Spring中的AOP
一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...
- 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)
Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...
- JavaWeb_(Spring框架)认识Spring中的aop
1.aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切 2.Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他 ...
随机推荐
- 女皇武则天:我不愿被 extends
01. 利用继承,我们可以基于已存在的类构造一个新类.继承的好处在于,子类可以复用父类的非 private 的方法和非 private 成员变量. is-a 是继承的一个明显特征,就是说子类的对象引用 ...
- 在ASP.NET Core中使用EPPlus导入出Excel文件
这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件(Excel).在考虑使用.NET处理excel时,我们总是寻找第三方库或组件.使用Open Offic ...
- 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览
年关将至,首页技术含量文章真是越来越少,理解大家盼着放假过年,哥们我何尝不是,先给大家拜个早年. 兄弟我从11月底发了神经,开启了 ORM 功能库的开发之旅,历时两个月编码和文档整理,目前预览版本更新 ...
- .NETCore 基于 dbfirst 体验快速开发项目
简介 今天出场是进化了多年的生成器工具,根据数据库结构(表.视图.存储过程.外键.各种类型.备注)快速生成一个项目,并自带后台管理系统.篇幅有限本文只讲解快速开发的使用过程,具体开发中的细节日后有空再 ...
- VS2017中使用组合项目_windows服务+winform管理_项目发布_测试服务器部署
前言:作为一名C#开发人员,避免不了常和windows服务以及winform项目打交道,本人公司对服务的管理也是用到了这2个项目的组合方式进行:因为服务项目是无法直接安装到计算器中,需要使用命令借助微 ...
- 在阿里云服务器windows server2012r iis上部署.net网站
先说一堆废话:之前在阿里云上租了一个服务器,也配置了相关的环境,然后准备把自己手上的一个小网站挂上去,就按照我的上篇博客记载的方法把发布好的网站发布到服务器的iis上,结果发布之后死活访问不了,始终显 ...
- .Net 反射学习
Why?为什么使用反射 MVC ORM EF 都是用的反射.反射可以让程序的扩展性,灵活性得到加强.一起即可动态创建 what 反射原理 动态加载类库 ,先添加引用类库,或者复制debug里 ...
- apache-jmeter-5.0的简单压力测试使用方法
同事交接工作,压测部分交给我,记录一下使用方法 我将下载下来的压缩包解压后放置在E盘 然后配置环境变量: 变量名JMETER_HOME,变量值 E:\javatool\apache-jmeter-5. ...
- PowerShell禁止执行脚本解决方法
无法加载文件 C:\***.p s1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 "get-help about_signing". 所在位置 行:1 字符: 18 + .\ ...
- NLP第八条
今日!我虽啥也没干,但我还是有着学习的心的~ 也许是“遵义会议”呢 那也说不定 留下这句话再说 哈哈哈哈哈哈 只能抄抄NLP第八条了 谁叫我选了个灰常有意义的通识课咧 八,每一 ...