完整源码:https://github.com/947133297/cgLibDemo

通过AOP来便捷地输出日志,能更加方便排查系统的bug,这个例子中简单输出自定义文件和函数执行时的参数,函数要不要输出日志,可以通过注解来控制。

两个服务类代码如下:

@Service
@EnableLogger
public class ServiceA {

    @LogBeforeExec("show方法执行前输出")
    public void show(int dataA, String dataB, boolean dataC){
        System.out.println("ServiceA show方法执行");
    }
}

@Service
public class ServiceB {
    public void show(int dataA, String dataB, boolean dataC){
        System.out.println("ServiceB show方法执行");
    }
}

服务类A中,添加了自定义注解来控制,代表需要输出日志,而服务类B没有添加注解,程序运行效果,不管通过单元测试还是控制器来执行服务代码,都会输出:

show方法执行前输出 - [[1, 2, false]]
ServiceA show方法执行
ServiceB show方法执行

实现原理:通过BeanPostProcessor加工bean,加工过程中通过cgLib织入AOP增强bean的功能。

拓展:

因为spring应用中基本都是单例,AOP拦截中获取到的对象都会是同一个,所以可以通过map将被代理对象与某片内存数据关联起来,拦截方法之后,可以做一些方法缓存之类的功能。

这个输出日志的功能,可能其他工程也需要。所以可以抽取出来以便于复用,抽取方式:将BeanPostProcessor的bean抽取到一个单独的配置类X中,然后通过@Import将配置类X引入到当前工程中即可。X类相关的东西都存放到一个单独的jar包中。

最新文章

  1. 解决asp.net mvc的跨域请求问题
  2. ORACLE查看SQL的执行次数/频率
  3. Caused by: java.sql.BatchUpdateException: Transaction error, need to rollback. errno:1205 Lock wait timeout exceeded; try restarting transaction
  4. linux服务器使用
  5. (String) | String.valueOf()
  6. 测试GeoGebra博客
  7. SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则
  8. 什么是 .manifest 文件
  9. U3D 脚本添加和获得对象
  10. linux 日常命令(磁盘空间)
  11. Python 引用、浅拷贝、深拷贝解析
  12. acm->stl
  13. 笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)
  14. R语言︱构造新序列
  15. SpringMvc+AngularJS通过CORS实现跨域方案
  16. spark伪分布式的安装
  17. 【转】Python 内置函数 locals() 和globals()
  18. python-----函数参数类型
  19. Android GPS定位测试(附效果图)
  20. spring基于通用Dao的多数据源配置详解【ds1】

热门文章

  1. Java面向对象_常用类库api——二分查找算法
  2. Java NIO基本使用介绍
  3. Have启动报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  4. java使用线程请求访问每次间隔10分钟连续5次,之后停止请求
  5. jQuery读取和设定KindEditor值的方法
  6. centos执行apt-get提示不存在
  7. Bootstrap学习笔记(三)
  8. Django之model基础(查询补充)
  9. Vue.js(2.x)之插值
  10. java集合杂谈