最近想对项目中的所有bean进行一个代理。然后监控bean得方法的使用情况。

        刚开始想的方法是:重写项目的beanFactory,然后再getBean的使用,对结果object进行一个代理,达到我的目的。但是发现重写getBean的方法,无法对bean中的依赖注入的bean(set进来的bean)进行代理。
 
       正好看到了beanPostProcessor的使用方法。可以在spring的xml的配置一个BeanPostProcessor,然后对所有的bean进行一个代理处理,正好可以满足我的需求!
 
BeanPostProcessor代码如下:
  1. import java.lang.reflect.Proxy;
  2. import java.util.Map;
  3. import java.util.concurrent.ConcurrentHashMap;
  4. import org.springframework.beans.BeansException;
  5. import org.springframework.beans.factory.config.BeanPostProcessor;
  6. import com.alibaba.common.logging.Logger;
  7. import com.alibaba.common.logging.LoggerFactory;
  8. public class MyBeanPostProcesser implements BeanPostProcessor {
  9. private Map map = new ConcurrentHashMap(100);
  10. private static final Logger log = LoggerFactory.getLogger("myBeanPostProcesser");
  11. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  12. MyProxy proxy = new MyProxy();
  13. if (beanName.contains("DB")) {
  14. return bean;
  15. }
  16. if (bean.toString().contains("Proxy")) {
  17. log.info(beanName + "为代理类,不进行再次代理!");
  18. return bean;
  19. }
  20. if (beanName.contains("TransactionTemplate")) {
  21. log.info(beanName + "为TransactionTemplate类,不进行再次代理!该类为:" + bean);
  22. return bean;
  23. }
  24. if (map.get(beanName) != null) {
  25. log.info(beanName + "已经代理过,不进行再次代理!");
  26. return map.get(beanName);
  27. }
  28. proxy.setObj(bean);
  29. proxy.setName(beanName);
  30. Class[] iterClass = bean.getClass().getInterfaces();
  31. if (iterClass.length > 0) {
  32. Object proxyO = Proxy.newProxyInstance(bean.getClass().getClassLoader(), iterClass, proxy);
  33. map.put(beanName, proxyO);
  34. return proxyO;
  35. } else {
  36. log.info(beanName + "么有接口不进行代理!");
  37. return bean;
  38. }
  39. }
  40. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  41. return bean;
  42. }
  43. }
 
代理类Proxy代码如下:
  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import com.alibaba.common.logging.Logger;
  4. import com.alibaba.common.logging.LoggerFactory;
  5. import sun.reflect.Reflection;
  6. public class MyProxy implements InvocationHandler {
  7. private static final Logger log = LoggerFactory.getLogger("myself");
  8. private Object obj;
  9. private String name;
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public Object getObj() {
  17. return obj;
  18. }
  19. public void setObj(Object obj) {
  20. this.obj = obj;
  21. }
  22. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  23. System.out.println("begin================" + "bean 名称为【" + name + "】方法为【" + method.getName() + "】========="
  24. + obj.getClass());
  25. log.error("begin================" + "bean 名称为【" + name + "】方法为【" + method.getName() + "】========="
  26. + obj.getClass());
  27. return method.invoke(obj, args);
  28. }
  29. public void printDetail(String detail) {
  30. log.error(detail);
  31. }
  32. }
感觉还是比较好使的!记录一下。以后再有监控的需求,可以考虑使用这种方式了!

BeanPostProcessor使用心得的更多相关文章

  1. SpringMvc学习心得(五)控制器产生与构建

    SpringMvc学习心得(五)控制器产生与构建 标签: springspring mvc框架 2016-03-22 15:29 140人阅读 评论(0) 收藏 举报  分类: Spring(4)  ...

  2. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  3. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  4. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  6. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  7. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  8. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  9. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. MySQL 操作总结

    1. 数据库级别操作 1.1 创建数据库 CREATE DATABASE db1 default charset utf8 collate utf8_general_ci; 1.2 删除数据库 DRO ...

  2. 解决uc浏览器不支持vw单位的方法

    插入下段代码,使用rem来代替vw <script type="text/javascript"> (function (doc, win) { var docEl = ...

  3. HDU 2053 Switch Game(开灯问题,完全平方数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2053 题目大意:灯开始是关着的,有n盏灯,i从1数到n每当灯的序号是i的倍数的时候就对灯进行一次操作( ...

  4. Jmeter中的逻辑控制器(四)

    Jmeter中的逻辑控制器 (Logic Controller) [线程组]右键—>[添加]—>[逻辑控制器] 简单控制器(Simple Controller ) 没有特殊功能,目的是形成 ...

  5. lr中用strtok函数分割字符串

    需要在loadrunner里面获得“15”(下面红色高亮的部分),并做成关联参数. ,6,5,0,4,0,3,0,3,2,0,0,0,1 用web_reg_save_param取出“8,7,5,15, ...

  6. Typo: In word 拼写检查

    Settings->Inspections > Spelling > Typo 评写检查,

  7. 三 Python解释器

    当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 由于整个Python语言从规范到解释器都是开源的 ...

  8. 用vue-wechat-title为微信动态设置标题

    1.安装插件 cnpm install vue-wechat-title --save 2.在main.js中引入 Vue.use(require('vue-wechat-title')) 3.在路由 ...

  9. vue引入Vue-Awesome

    Vue-Awesome建立在Font Awesome上 v4.5.0,取决于Vue.js v2.0.1 +,所以安装了Vue-Awesome就可以直接使用Font Awesome的字体图标. 1.安装 ...

  10. ref:一系列用于Fuzzing学习的资源汇总

    ref:http://www.freebuf.com/articles/rookie/169413.html 一系列用于Fuzzing学习的资源汇总 secist2018-04-30共185833人围 ...