文档章节

四大通知

n
 name_by_back_fire
发布于 2017/05/19 11:39
字数 807
阅读 2
收藏 0
点赞 0
评论 0

1.前置通知,实现  MethodBeforeAdvice 接口,重写

            public  void  before(Method  method, Object[]  args, Object  target) throws Throwable方法

     

    import java.lang.reflect.Method;

    import org.springframework.aop.MethodBeforeAdvice;

    public class TestMethodBeforeAdvice implements MethodBeforeAdvice {

        /** arg0  方法

         * arg1 参数

         * arg2 操作对象

         * */

        @Override

        public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {

          System.out.println("前置通知:----》方法:"+arg0.getName()+"传入参数"+arg1+"操作象"+arg2);

        }

     }

2.后置通知,实现 AfterReturningAdvice  接口,重写

      public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable 方法

 

      import java.lang.reflect.Method;

      import org.springframework.aop.AfterReturningAdvice;

      public class TestAfterReturningAdvice implements AfterReturningAdvice{

            /**

             * arg0:return 的返回值

             * arg1:执行的方法对象

             * arg2:方法执行中传递过来的参数

             * arg3:执行方法的对象

             */

            @Override

            public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {

               System.out.println("后置通知:----》方法:"+arg1.getName()+"返回值:"+arg0+"执行方对象:"+arg3);

            }  

      }

 

3.环绕通知, 实现 MethodInterceptor  接口,重写

      public  Object  invoke(MethodInvocation  invocation) throws Throwable 方法

 

      import java.lang.reflect.Method;

      import org.aopalliance.intercept.MethodInterceptor;

      import org.aopalliance.intercept.MethodInvocation;

      public class TestMethodinterceptor implements MethodInterceptor {

          @Override

          public Object invoke(MethodInvocation invocation) throws Throwable {

              Method method = invocation.getMethod() ; //方法

              Object[] objs = invocation.getArguments() ; //参数

              Object obj = invocation.getThis() ; //操作对象

              System.out.println("环绕通知:-----》 开始: 方法:"+method.getName()+"传入的参数:"+objs+" 操作对象:"+obj);

              Object result = invocation.proceed() ;   //放行

              System.out.println("环绕通知:-----》 结束:  返回值:"+result);

              return result ;

          }

      }

 

4.异常通知,实现 ThrowsAdvice 接口,重写

         public void afterThrowing(Method  m, Object  args, Object  target,Throwable  e) 方法

 

    import java.lang.reflect.Method;

    import org.springframework.aop.ThrowsAdvice;

    public class TestThrowsAdvice implements ThrowsAdvice {

         public void afterThrowing(Method m, Object args, Object target, Throwable e) {  

                 System.out.println("异常通知:方法"+m.getName()+"发生异常,"+e.getMessage());

                 System.exit(0);

         }

     }

注意:查看ThrowsAdvice源码会发现这个接口里面没有定义方法,但是这个方法必须这么写,

 

Spring 3.X 以后版本

 

    import org.aspectj.lang.JoinPoint;

    import org.aspectj.lang.ProceedingJoinPoint;

    public class TestAdvice {

       public void before(JoinPoint joinPoint){ //前置通知

          System.out.println("操作者"+joinPoint.getTarget()+"参数             "+joinPoint.getArgs()[0]);

          System.out.println("*********************前置通知*********************");

       }

       //后置通知:当方法执行完会触发,出错则不执行

       public void afterReturning(JoinPoint joinPoint,Object obj){

            System.out.println("后置通知");

            System.out.println("返回结果:"+obj);

        }

        //最终通知

        public void after(JoinPoint joinPoint){

            System.out.println("最终通知");

            System.out.println("调用的方法"+joinPoint.getSignature());

        }

        //异常通知

        public void throwAdvice(Exception exception){

            System.out.println("--------异常通知--------");

            System.out.println("异常消息"+exception.getMessage());

        }

        //环绕通知

        public Object around(ProceedingJoinPoint proceedingJoinPoint){

            System.out.println("环绕通知开始");

            try {

              Object  obj = proceedingJoinPoint.proceed() ;

              System.out.println("环绕通知结束");

              return obj ;

            } catch (Throwable e) {

              e.printStackTrace();

            }

            return null ;

      }

  }

 

配置信息

<!--Spring3.X以前-->

<!--后置通知-->

  <bean id="afterAdvice" class="com.spring.advice.TestAfterReturningAdvice"/>

<!--前置通知-->

  <bean id="beforeAdvice" class="com.spring.advice.TestMethodBeforeAdvice"/>

<!--环绕通知-->

  <bean id="interceptorAdvice" class="com.spring.advice.TestMethodinterceptor"/>

<!--异常通知-->

  <bean id="throwsAdvice" class="com.spring.advice.TestThrowsAdvice"/>

<!--Spring3.X以后整合-->

  <bean id="advice" class="com.spring.advice.TestAdvice"/>

<!-- AOP设置 -->

<aop:config>

    <aop:pointcut expression="execution(* com.spring.service.*.*(..))" id="mycut"/>

    <aop:advisor advice-ref="afterAdvice" pointcut-ref="mycut"/>

    <aop:advisor advice-ref="beforeAdvice" pointcut-ref="mycut"/>

    <aop:advisor advice-ref="interceptorAdvice" pointcut-ref="mycut"/>

    <aop:advisor advice-ref="throwsAdvice" pointcut-ref="mycut"/>

    <!-- 新版本 -->

    <aop:aspect ref="advice">

        <aop:before method="before" pointcut-ref="mycut"/>

        <aop:after-returning method="afterReturning" returning="obj" pointcut-ref="mycut"/>

        <aop:after method="after" pointcut-ref="mycut"/>

        <aop:after-throwing method="throwAdvice" throwing="exception" pointcut-ref="mycut"/>

        <aop:around method="around" pointcut-ref="mycut"/>

     </aop:aspect>

</aop:config>

两种方法:

  Spring3.X版本以前写法思路更清晰,新版本,虽然把4个通知整合在了一起,但是,如果业务复杂的话,通知较多建议分开写,

两种方法区别不是很大,具体还得开需求

 

expression的value值

任意公共方法的执行:

  execution(public * *(..))

任何一个以“set”开始的方法的执行:

  execution(* set*(..))

AccountService 接口的任意方法的执行:

  execution(* com.xyz.service.AccountService.*(..))

定义在service包里的任意方法的执行:

  execution(* com.xyz.service.*.*(..))

定义在service包或者子包里的任意方法的执行:

  execution(* com.xyz.service..*.*(..))

 

© 著作权归作者所有

共有 人打赏支持
n
粉丝 0
博文 12
码字总数 4996
作品 0
昌平
程序员
小白入门Android必须知道的四大组件

学习App开发从布局入手之后,以能够顺利识别并搭建一个页面所需要的UI组件为目标。但是搭建好的不同界面间如何切换呢?不同界面间的数据是如何传递的呢?除了我们看到的界面,App后台还能做其...

冬风破10
01/12
0
0
微软发布 iPhone 版的 Windows Live Messenger

微软今天正式为iPhone和iPod touch发布了Windows Live Messenger应用程序,iPhone用户可以使用手机与好友进行即时通信,查看好友社交网络的状态及更新,浏览、评价好友相片,时刻了解好友的最...

红薯
2010/06/21
1K
2
12.16 游戏行业财务交流 厦门

12月16日(本周六)将在美丽的厦门组织一次游戏行业财务交流活动,活动主要信息如下: 1、时间:12月16日(本周六)全天; 2、地点:小范围活动,报名成功后单独通知; 3、主题:游戏行业财务...

上善若水
2017/12/14
0
0
Spark源码之BlockManager

BlockManager是分布式块存储管理。核心机制是每个节点存储自己的内存空间和磁盘空间。BlockManagerMaster负责与其他节点的BlockManager通信并负责块在节点间的复制。BlockInfoManager负责管理...

守望者之父
06/15
0
0
极光征文 | 参赛附录说明,帮你确立选题

「写写文章就能赢 Flico,岂不美滋滋」的极光征文活动正在火热开展,本文是活动的附录说明,简单介绍了极光的产品,并推荐了一些写作主题,如果你不知道如何下笔,就来看看吧! 附录 1:你可...

极小光
2017/12/15
0
0
Activity四大组件之Service(上)

Service是一种可以在后台执行长时间任务的没有交互界面的应用组件,Service运行在进程中的主线程中,它不能自己建立线程处理长时间的事务,所以需要你手动为你的Service创建独立的线程来避免...

steve.ming
2012/04/26
0
0
海南金垦赛博信息科技有限公司获智慧农业解决方案供应商新锐奖

传统的农业耕作模式已经不能满足信息化时代步伐,环境恶化、产品质量问题突出、市场产品多样化需求和农业资源不足等诸多问题。智慧农业通过物联网、大数据、机器视觉、机器学习等技术,在精准...

玄学酱
03/05
0
0
React 回忆录(一)新的旅程

Hi 各位,好久不见 👋,即将陆续发布的系列文章《React 回忆录》将会总结我对 React 框架的一些理解和心得,希望可以帮助 React 初学者理解 React 框架所涵盖的基本内容与内在逻辑。也希望...

libinfs
07/13
0
0
万达网科大规模裁员,员工由6000裁至300名

  【IT168 资讯】“万达网科没有倒下,局部的调整是为了更快更好更健康的发展”,针对媒体报道的万达网科大规模裁员的消息,万达网络科技集团总裁曲德君在朋友圈回应。   万达旗下的万达...

it168网站
2017/12/29
0
0
先是 MSN “死”了,现在 MSN 中文网也要关闭了

5月1日上午消息,MSN中文网近日发出了关于停止服务的通知,称网站将于2016年6月7日停止提供简体中文服务,并表示用户以后仍能继续访问该网站推荐的其他网站。 MSN中文网是微软旗下面向白领用...

oschina
2016/05/02
4.2K
17

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Tomcat内存设置

第一步骤: 1、路径是Tomcat目录下的/bin/catalina.bat文件 打开catalina.bat文件 加入下面这句代码: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m 2、路径是...

一梦心草
11分钟前
0
0
IDEA 及 Gradle 使用总结

IDEA 及 Gradle 使用总结 自动编译组件 目前Android开发的主流开发工具是 Eclipse 和 IDEA 目前主流的自动化打包工具时 ant,maven,gradle。 maven工具中有自己的依赖仓库维护,很多开源支持...

舒文joven
11分钟前
0
0
lombok 引入后,测试类始终找不到get,set方法。

开发环境为idea,jdk1.7,maven3.5. 网上直接搜出来的方法有: 1、在setting里安装lombok的plugins; 2、如下图,勾选enable annocation processing选项 3、升级maven plugins插件 我尝试了以...

Kidult
13分钟前
0
0
Duang,HUAWEI DevEco IDE全面升级啦

想感受全新UI带来的视觉及交互体验、 HiKey970开发板调测、 HiAI API推荐和收藏、 深度AI模型分析等新功能, 体验高清晰度和流畅度的远程AI真机调测吗? 全新的UI设计 采用最优秀的视觉及交互...

华为终端开放实验室
22分钟前
0
0
阻止事件冒泡,阻止默认事件

1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开, 2.event....

闫亚亚
24分钟前
0
0
网络监控工具类

package com.guorentong.learn.organ.utils;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManage......

王先森oO
24分钟前
0
0
命令

sudo nginx -s reload 重启nginx sudo lsof -i -P | grep -i "listen" 查看端口占用

那个猴子
28分钟前
0
0
用scrapy-redis爬去新浪-以及把数据存储到

需求:爬取新浪网导航页(http://news.sina.com.cn/guide/)所有下所有大类、小类、小类里的子链接,以及子链接页面的新闻内容。 准备工作: a.安装redis(windows或者linux) b.安装Redis Des...

丁典
28分钟前
0
0
PHP常用函数篇

1.为什么要使用函数? 除了内建的PHP函数,我们可以创建我们自己的函数。 函数是可以在程序中重复使用的语句块。 使代码逻辑更清晰 避免过多的全局变量 封装后避免相同逻辑重复代码,只需调用...

天地有涯风有信_大海无量不见人
29分钟前
0
0
对List分组

在日常工作中会遇到这样的情景,我们需要对List按照List中对象的一个值进行分组。比如一个Human的List,我们要根据性别分组,传统的方法是做双层循环,逐个对比,今天我要介绍一种详单简单的...

珂jack
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部