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可以将容器中管理对象生成动态代理对象,前提是我们对他 ...
随机推荐
- 腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列
说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯 ...
- git解析日志常用命令
git diff --name-only ORIG_HEAD 获取变更列表 git log -p 查看每个提交引入的实际更改. git log --oneline --decorate 查看日志列表 ...
- Netbeans IDE 安装Emmet插件并解决Emmet插件无效果问题
Emmet是许多流行文本编辑器的插件,它极大地改进了HTML和CSS工作流程:在Netbeans IDE 下安装Emmet:1.打开Netbeans IDE编辑器,选择 工具—>插件选项,在 可 ...
- 『Zap Möbius反演』
Zap Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为F ...
- Mqtt学习指南
MQTT是物联网应用当中一种非常重要的,轻量级的协议,现将该协议的重要学习资源整理一下,希望能为初学者提供一个完整的学习资源. MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议.它的设计思 ...
- 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...
- C# 获取系统当前IE版本号
1. 注册表中,IE的位置: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer 2. 通过注册表读取IE配 ...
- 【学习笔记Part 1 ● Linux】
本章目标 Linux简介 Linux发展 Linux界面熟悉 Linux常用命令 Linux简介 经常看到的或者熟悉的操作系统: Windows操作系统:Window 10或者Window 7 Mac ...
- Docker 创建 Crucible4.6.1 以及与 Crowd3.3.2 实现 SSO 单点登录
目录 目录 1.介绍 1.1.什么是 Crucible? 2.Crucible 的官网在哪里? 3.如何下载安装? 4.对 Crucible 进行配置 4.1.破解 Crucible 第一步 4.2. ...
- 如何设置Linux(Centos)系统定期任务(corntab详细用法)
如何设置Linux(Centos)系统定期任务(crontab详细用法) 1.Crontab简介 Linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非 ...