SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around
一、首先在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的更多相关文章
- Spring之注解实现aop(面向切面编程)
1:Aop(aspect object programming)面向切面编程,名词解释: 1.1:功能:让关注点代码与业务逻辑代码分离 1.2:关注点 重复代码就叫做关注点 ...
- Spring注解式AOP面向切面编程.
1.AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式.aop底层是动态代理. package com.bie.config; import org.aspectj.lan ...
- Spring Aop面向切面编程&&自动注入
1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...
- 谈一谈AOP面向切面编程
AOP是什么 : AOP面向切面编程他是一种编程思想,是指在程序运行期间,将某段代码动态的切入到指定方法的指定位置,将这种编程方式称为面向切面编程 AOP使用场景 : 日志 事务 使用AOP的好处是: ...
- Spring——AOP(面向切面编程)@AspectJ注解方式
一.什么是AOP? AOP: (Aspect Oriented Programming)即面向切面编程. 试想这样的场景:项目中需要在业务方法执行完打印日志记录.最笨的办法就是在每个方法核心业务执行完 ...
- SpringAOP 面向切面编程
AOP的相关概念 AOP:全称是 Aspect Oriented Programming 即:面向切面编程. 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改 ...
- Spring注解 - AOP 面向切面编程
基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...
- AOP面向切面编程(使用注解和使用配置文件)
Aop(面向切面编程) 使用注解的方式: 加入相应的jar包: com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspe ...
- Spring-AOP面向切面编程
AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...
随机推荐
- CoderFocers-620C
There are n pearls in a row. Let's enumerate them with integers from 1 to n from the left to the rig ...
- 2018HDU多校二 -F 题 Naive Operations(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6315 In a galaxy far, far away, there are two integer ...
- 19.DjangoRestFramework学习二之序列化组件、视图组件
一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},] C ...
- 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享
写在前面的话&&About me 网上写spring的文章多如牛毛,为什么还要写呢,因为,很简单,那是人家写的:网上都鼓励你不要造轮子,为什么你还要造呢,因为,那不是你造的. 我不是要 ...
- 最全的linux基础命令
第1章 linux命令 1.1 线上查询及帮助命令 help命令*** help前面接你要查询的命令:例如ls [root@server02 ~]# ls --help 用法:ls [选项]... [ ...
- Java并发编程系列-(1) 并发编程基础
1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...
- 蛋疼的 qii 神马警告才是需要注意的警告?(由于警告引起的截然不同的运行结果)解决总结
接上文!! 蛋疼一天,折腾一天,没找到具体原因,但是找到了具体操作办法! 1.果断删除没用的文件 特别是sdc文件,旧的没用,果断删除,否则系统会默认使用,带来副作用 2.files 添加系统用到的i ...
- Seata 配置中心实现原理
Seata 可以支持多个第三方配置中心,那么 Seata 是如何同时兼容那么多个配置中心的呢?下面我给大家详细介绍下 Seata 配置中心的实现原理. 配置中心属性加载 在 Seata 配置中心,有两 ...
- C语言每日一练——第6题
一.题目要求 计算500~800区间素数的个数cnt,并按所求素数的值从大到小的顺序,计算其间隔间的减.加之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数.....的值sum.最后把 ...
- CCF-CSP题解 201503-4 网络延时
求树的直径. 两遍\(dfs\)就好了. #include <cstdio> #include <cstring> #include <algorithm> #in ...