一、首先在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. 原生js 复制内容到剪切板

    代码: function copyHandle(content){ let copy = (e)=>{ e.preventDefault() e.clipboardData.setData('t ...

  2. 201871010119-帖佼佼《面向对象程序设计(java)》第六—七周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  3. 我的 FPGA 学习历程(15)—— Verilog 的 always 语句综合

    在本篇里,我们讨论 Verilog 语言的综合问题,Verilog HDL (Hardware Description Language) 中文名为硬件描述语言,而不是硬件设计语言.这个名称提醒我们是 ...

  4. 计算密集型和 io 密集型项目的使用场景分析和代码演示

    from threading import Thread from multiprocessing import Process import time 计算密集型 def work1(): res= ...

  5. 《CSAPP》实验二:二进制炸弹

    二进制炸弹是第三章<程序的机器级表示>的配套实验,这章主要介绍了x64汇编,包括:操作数的表示方式,数据传送指令,算术和逻辑指令,控制流跳转指令,过程(procedure)的实现与运行时栈 ...

  6. python的memory_profiler模块使用

    本文主要介绍了python内存分析工具: memory_profiler,可以展示每一行代码执行所增加的内存,方便做内存调优和排除bug memory_profiler是第三方模块,需要安装才能使用 ...

  7. d3.js 共享交换平台demo

    今天在群里遇到一张图  遂来玩一玩,先来上图!! 点击相应按钮,开关线路,此项目的重点是计算相应图形的位置,由于是个性化项目就没有封装布局.好了直接上代码. <!DOCTYPE html> ...

  8. Python面向对象-定制方法

    Python中的class可以定义许多定制方法,可以让我们方便的生成特定的类. 我们之前介绍了__slots__.__len__(),python中还有许多这样的特殊函数: __str__ >& ...

  9. isNotBlank()和isNotEmpty()总结

    import org.apache.commons.lang.StringUtils; import org.junit.Test; public class Test{ //总结:isNotBlan ...

  10. 初识PMP PMBOK初解(指南第一章引论)

    引论 1.1指南概述和目的 普遍认可:大多数时候是适用于大多数项目,价值和有效性已获得一致认可. 良好实践:知识.技能.工具和技术能够达到预期的商业价值和成果,提高很多项目成功的可能性. 确定过程.输 ...