一、首先在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. [TimLinux] 系统配置 CentOS7配置Samba

    1. 安装软件 yum install -y samba samba-client samba-common 2. 配置用户 useradd tim passwd tim # 设置用户登录密码 smb ...

  2. LightOJ1284 Lights inside 3D Grid (概率DP)

    You are given a 3D grid, which has dimensions X, Y and Z. Each of the X x Y x Z cells contains a lig ...

  3. 纯手工搭建K8s(单节点)

    准备说明: 因为为纯手动搭建,所以针对安装时需要的一些安装包需提前下载好 cfssl_linux-amd64. cfssljson_linux-amd64. cfssl-certinfo_linux- ...

  4. 【Git】Windows 配置 SSH-Key

    查看本地公钥是否存在 执行以下语句来判断是否已经存在本地公钥 cat ~/.ssh/id_rsa.pub 如果出现如下截图,则本地公钥不存在,继续按步骤进行. 如果看到一长串以 ssh-rsa 或 s ...

  5. Java 从入门到进阶之路(十三)

    在之前的文章我们介绍了一下 Java 类的 private,static,final,本章我们来看一下 Java 中的抽象类和抽象方法. 我们先来看下面一段代码: // 根据周长求面积 class S ...

  6. Spring Integration - WS Outbound Gateway

    1.通过MessageSender客户化http连接参数 AbstractHttpWebServiceMessageSender有若干实现子类: - CommonsHttpMessageSender( ...

  7. 面试连环炮系列(十五):说说Eureka的高可用方案

    说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...

  8. CentOS7.2下部署zabbix4.0

    整体部署采用centos7+php+apache+mariadb 基础环境配置优化 1. 关闭防火墙 [root@monitor_53 ~]$ systemctl stop firewalld [ro ...

  9. Java多态之向下转型

    目录 Java多态之向下转型 强制类型转换 instanceof Java多态之向下转型 往期回顾:我们学习了向上转型和动态绑定的概念,可以知道在继承关系中,将一个子类对象赋值给父类的引用变量,调用父 ...

  10. JS---封装缓动(变速)动画函数---增加任意多个属性&增加回调函数

    封装缓动(变速)动画函数---增加任意多个属性&增加回调函数 回掉函数fn,在所有元素到达目的位置后,判断是否传入一个函数,有就调用 if(fn){fn()}; 这样一次点击,产生多个动画 & ...