(刚开始写东西,不足之处还请批评指正)

关于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方式实现通知的更多相关文章

  1. Spring中关于AOP的实践之AspectJ方式实现通知

    (本文中如有不当之处,恳请批评指正) AspectJ方式的简化了通知的出现复杂度.但是对配置文件的操作复杂度有了一定的提升 一. 配置通知 package com.xkx.adviceDemo; im ...

  2. Spring中关于AOP的实践之概念

    一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...

  3. Spring官网阅读(十八)Spring中的AOP

    文章目录 什么是AOP AOP中的核心概念 切面 连接点 通知 切点 引入 目标对象 代理对象 织入 Spring中如何使用AOP 1.开启AOP 2.申明切面 3.申明切点 切点表达式 excecu ...

  4. Spring中的AOP

    什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...

  5. Spring中的AOP 专题

    Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...

  6. spring中的AOP 以及各种通知 配置

    理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...

  7. Spring学习笔记(四)—— Spring中的AOP

    一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  8. 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)

    Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...

  9. JavaWeb_(Spring框架)认识Spring中的aop

    1.aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切 2.Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他 ...

随机推荐

  1. 谈谈surging引擎的tcp、http、ws协议和如何容器化部署

    1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...

  2. 描述性统计指标 - 众数 Mode

    定义- 数值型数据 - 出现频数最多的变量值- 品质型数据.单项式分组数据 - 频数最多的组为众数组,该组的变量值(类型)就是众数- 组距式分组数据 - 频数最多的组为众数组,通过公式求得众数 - 公 ...

  3. 使用elementUI的时候,使用Upload 上传的时候,使用 list-type 属性来设置文件列表的样式,before-upload方法失效

    最近在做项目的时候,使用elementUI的时候,使用Upload 上传的时候,before-upload方法失效. 情况下:使用 list-type 属性来设置文件列表的样式. 最终的优化之后:(演 ...

  4. win10安装gitLab

    从控制面板选择hyper-V进行安装 1.打开控制面板选择程序=>选择启用或关闭windows功能=>选择Hyper-v 安装ubuntu 1.下载ubuntu系统(本次安装为18.04. ...

  5. 如何使用JS来开发室内三维地图的轨迹回放功能

     在制作完成室内三维地图的功能后,最经常有的需求就是如何做人员的轨迹回放,一般流程都是从数据库中查询轨迹坐标后,经过后台查询接口返回给前端,接下来的事情都交给JS来完成. 如果想做好一个性能好的轨迹回 ...

  6. rsync命令详解、rsync用ssh隧道方式同步

    ● rsync格式安装命令 yum install -y rsync与scp的区别:scp复制为完全覆盖,rsync为增量同步,只同步修改过的数据.rsync命令格式如下: rsync 选项 源文件 ...

  7. 关于linux上postgresql的一些理解

    刚开始接触postgresql,安装后就有一个默认用户postgres,而且在启动postgresql后只能通过切换到linux的postgres用户才能登录数据库进行操作,和Mysql的登录认证居然 ...

  8. 3星|《绩效使能:超越OKR》:较全较新资料汇编,华为实施经验少

    全书是关于绩效管理与OKR的比较新比较全的资料汇编.从泰勒的科学管理说起,一直到现代的KPI.最近的OKR.梳理了工业革命以来重要的绩效管理思想的具体方法.适应情况,详细讲OKR的来龙去脉.适应情况. ...

  9. Linux文件系统类型和区别

    文件系统EXT3,EXT4和XFS的区别: 1. EXT3 (1)最多只能支持32TB的文件系统和2TB的文件,实际只能容纳2TB的文件系统和16GB的文件 (2)Ext3目前只支持32000个子目录 ...

  10. SpringBoot整合Spring Security使用Demo

    https://start.spring.io/ 生成SpringBoot项目 pom文件应该是我这样的: <?xml version="1.0" encoding=&quo ...