一、首先在Springmvc.xml文件中引入如下内容(本示例是在ssm框架基础上实现的)

  1、引入命名空间

xmlns:aop="http://www.springframework.org/schema/aop"

  2、在xsi:schemaLocation中引入如下内容(注意看清自己的spring版本号)

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd

  3、在<beans></beans>节点中添加如下内容

<!-- 开启扫描包,需要去掉service层不进行扫描,避免事务失效 -->
<context:component-scan base-package="com.hp">
<!-- 配置不需要扫描 service层注解 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->
<aop:aspectj-autoproxy />

二、切面类

/**
* @Aspect 将此类声明为切面类
* @Component 将此类交由spring管理
* @author wsl
*
*/
@Component
@Aspect
public class MyAop {
/*
   * sayings()方法只是一个代理对象,个人理解就是将此方法加上
* @Pointcut 注解后 其他方法 只需要将value设为 此方法名即可 若有错误请指正
* @Pointcut 注解作用为定义切点 value值为准确切点位置 这里的意思是 com.hp.controller包下所有的方法
   */
@Pointcut(value = "execution(* com.hp.controller..*.*(..))")
private void sayings() {} long time = 0; // 方法执行前执行 注意这里的value 是上面定义的代理对象 sayings()
@Before(value = "sayings()")
private void before() {
time = new Date().getTime();
System.out.println("方法执行前执行");
} // 方法执行后执行
@After(value = "sayings()")
private void after() {
System.out.println("方法执行后执行,执行时间为" + (new Date().getTime() - time));
} // 环绕通知。注意要有ProceedingJoinPoint参数传入。同时必须要有返回值,否者程序会中断执行,web应用中会报页面404;
@Around(value = "sayings()")
public Object sayAround(ProceedingJoinPoint pjp) {
Object proceed = null;
System.out.println("注解类型环绕通知..环绕前");
long time2 = new Date().getTime();
try {
proceed = pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("注解类型环绕通知..环绕后,执行时间" + (new Date().getTime() - time2));
return proceed;
} }

三、关于 @Pointcut 注解的拓展

  1、任何的Public方法

execution(public * *(..))

  2、以set开头的方法

execution(* set*(..))

  3、定义在com.hp.in接口中的方法

execution(* com.hp.in.*(..))

  4、com.hp.wsl包中的所有方法

execution(* com.hp.wsl.*.*(..))

  5、com.hp.wsl包及其子包中的所有方法

execution(* com.hp.wsl..*.*(..))

四、致谢

  本文借鉴了:

    trayvon 前辈的  《Spring AOP 之二:Pointcut注解表达式》 一文,原文地址:https://my.oschina.net/u/2474629/blog/1083448

    小Cai先森 前辈的《spring中aop的注解实现方式简单实例》 一文,原文地址:https://www.cnblogs.com/caijh/p/7154691.html

      如有不对的地方,谢谢指正;

SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around的更多相关文章

  1. Spring之注解实现aop(面向切面编程)

    1:Aop(aspect object programming)面向切面编程,名词解释:    1.1:功能:让关注点代码与业务逻辑代码分离    1.2:关注点        重复代码就叫做关注点  ...

  2. Spring注解式AOP面向切面编程.

    1.AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式.aop底层是动态代理. package com.bie.config; import org.aspectj.lan ...

  3. Spring Aop面向切面编程&&自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

  4. 谈一谈AOP面向切面编程

    AOP是什么 : AOP面向切面编程他是一种编程思想,是指在程序运行期间,将某段代码动态的切入到指定方法的指定位置,将这种编程方式称为面向切面编程 AOP使用场景 : 日志 事务 使用AOP的好处是: ...

  5. Spring——AOP(面向切面编程)@AspectJ注解方式

    一.什么是AOP? AOP: (Aspect Oriented Programming)即面向切面编程. 试想这样的场景:项目中需要在业务方法执行完打印日志记录.最笨的办法就是在每个方法核心业务执行完 ...

  6. SpringAOP 面向切面编程

    AOP的相关概念 AOP:全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改 ...

  7. Spring注解 - AOP 面向切面编程

    基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...

  8. AOP面向切面编程(使用注解和使用配置文件)

    Aop(面向切面编程) 使用注解的方式: 加入相应的jar包: com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspe ...

  9. Spring-AOP面向切面编程

    AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...

随机推荐

  1. jQuery中的基本的选择器学习(补充版)

    先看整体代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  2. nginx编译安装配置模块大全

    使用configure命令配置构建.它定义了系统的各个方面,包括允许nginx用于连接处理的方法.最后,它会创建一个Makefile.该configure命令支持以下参数:--help 打印帮助信息. ...

  3. idea实现简单热部署

    首先我们打开设置tomcat的页面         

  4. 东拼西凑完成一个“前端框架”(4) - Tabs页

    目录 东拼西凑完成一个后台 "前端框架" (1) - 布局  东拼西凑完成一个后台 "前端框架" (2) - 字体图标 东拼西凑完成一个"前端框架&q ...

  5. Neety的基础使用及说明

    BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一个线程 伪异步IO:创建线程池,由线程池里边的线程负责连接处理,M个个请求进来时,会在线程池创建N个线程.容易出现线程 ...

  6. cordova 打包出现transformClassesWithDexForDebug一类错误的解决办法

    Cordova在添加了插件后,或者是本身文件很多,文件很大的情况下打包时候可能会出现 transformClassesWithDexForDebug或者transformClassesWithDexF ...

  7. C# yield关键字

    关于yield关键字,网上有很多文章介绍了,但是看了之后,虽然明白了"哦,原来是这么回事",但是在日常开发中并没有真正的用起来,所以,写此一篇,介绍一下在真正的项目中怎么使用这个关 ...

  8. uni-app开发小程序入门到崩溃

    最近一段时间公司要做一个小程序项目,还要支持,微信小程序,头条小程序,百度小程序.一套代码,实现三个平台.当时接到这个任务,就不知道怎么去下手,一套代码,分别要发布三个平台,赶紧就去上网了解这些东西, ...

  9. [UIApplication sharedApplication].keyWindow和[[UIApplication sharedApplication].delegate window]区别

    参考链接:https://www.cnblogs.com/henusyj-1314/p/11643189.html 结论1.在获取到window时最好使用[[UIApplication sharedA ...

  10. LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da | ε (3)B -> cC (4)C -> aADC | ε (5)D -> b | ε 验证文法 G ...