使用注解实现SpringAOP的功能:
例子:

//表示这是被注入Spring容器中的
@Component

//表示这是个切面类
@Aspect
public class AnnotationHandler {
/*
* 在一个方法上面加上注解来定义切入点
* 这个切入点的名字就是这个方法的名字
* 这个方法本身不需要有什么作用
* 这个方法的意义就是:给这个 @Pointcut注解一个可以书写的地方
* 因为注解只能写在方法、属性、类的上面,并且方法名作为切入点的名字
* */ //简单来说就是将查到的方法用myPointCut()方法名代替
@Pointcut("execution(public * com.briup.aop.service..*.*(..))")
public void myPointCut(){} //注:这里面的所有方法的JoinPoint类型参数都可以去掉不写,如果确实用不上的话
@Before("myPointCut()")//在myPointCut()中查到的方法之前切入
public void beforeTest(JoinPoint p){
System.out.println(p.getSignature().getName()+" before...");
} /*
* @After和@AfterReturning
*
* @After标注的方法会在切入点上的方法结束后被调用(不管是不是正常的结束).
* @AfterReturning标注的方法只会在切入点上的方法正常结束后才被调用.
* */
@After("myPointCut()")//在myPointCut()中查到的方法之后切入
public void afterTest(JoinPoint p){
System.out.println(p.getSignature().getName()+" after...");
}
@AfterReturning("myPointCut()")
public void afterReturningTest(JoinPoint p){ System.out.println(p.getSignature().getName()+" afterReturning"); } @Around("myPointCut()")//在myPointCut()中查到的方法环绕切入
public Object aroundTest(ProceedingJoinPoint pjp)throws Throwable{
System.out.println(pjp.getSignature().getName()+" is start..");
//调用连接点的方法去执行
Object obj = pjp.proceed();
System.out.println(pjp.getSignature().getName()+" is end..");
return obj;
} //在切入点中的方法执行期间抛出异常的时候,会调用这个 @AfterThrowing注解所标注的方法
@AfterThrowing(value="myPointCut()",throwing="ex")
public void throwingTest(JoinPoint p,Exception ex){
System.out.println(p.getSignature().getName()+" is throwing..."+ex.getMessage()); } }

xml配置:注意给例子中使用的其他的类上面也使用注解

<aop:aspectj-autoproxy/>
<context:component-scan base-package="com.briup.aop"/> <!-- 让Spring扫描注解 -->
<context:component-scan base-package="com.briup.aop"></context:component-scan>
<!-- 识别AspectJ的注解 -->
<aop:aspectj-autoproxy/>

注意:<aop:aspectj-autoproxy proxy-target-class="true"/>这样配置则是强制使用CGLIB进行代理

最新文章

  1. EasyPR--开发详解(5)颜色定位与偏斜扭转
  2. log4j.properties配置详解(转)
  3. ArrayList与LinkedList实现比较
  4. 利用Ajax把前端的数据封装成JSON格式发送到服务器端并写成XML格式在服务器的硬盘上
  5. 中国25位最具影响力的IC人物
  6. read和onload jquery.val
  7. SQL基础学习_05_函数、谓词、CASE表达式
  8. mysql的学习笔记(三)
  9. FPGA小例子
  10. 实用的shell脚本面试题和答案
  11. pycharm介绍
  12. VS2015 项目中 添加windows服务
  13. Ionic app 上传图片之webApi接口
  14. SqlDependency和SqlCacheDependency缓存的用法及具体步骤
  15. epoll_wait 时 POLLERR 与 POLLIN 同时返回的现象解析(转)
  16. Oracle-归档日志详解(运行模式、分类)
  17. mysql中delimiter
  18. 小程序的movable-view怎么持续移动
  19. form表单token错误
  20. docker使用命令汇总

热门文章

  1. Java-Class-@I:io.swagger.annotation.ApiParam
  2. CSS:教程
  3. Linux之nginx-uwagi-django 搭建
  4. 7、jmeter-定时器介绍与使用
  5. Linux的初始页表
  6. 2019杭电多校第三场hdu6608 Fansblog(威尔逊定理)
  7. python-Request模块使用
  8. createBottomTabNavigator: 怎么在切换tab的时候让页面重新渲染
  9. 笔记:Python的浅复制和深复制
  10. fork执行一个进程