最近想对项目中的所有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. C/C++——C语言数组名与指针

    版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...

  2. 当while read line 遇到 ssh

    问题:while read line 中使用ssh只能读取一行? #!/bin/sh while read line do echo $line ssh root@$line "echo 1 ...

  3. 报错:Cobbler check 时报错

    报错:[root@test88 ~]# cobbler checkTraceback (most recent call last):  File "/usr/bin/cobbler&quo ...

  4. golang之结构体和方法

    结构体的定义 结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型.每个变量都叫做结构体的成员. 其实简单理解,Go语言的结构体struct和其他语言的类class有相等的地位,但是GO语 ...

  5. Loadrunner中cookie解释与用法

    loadrunner对于cookie的处理loadrunner中与cookie处理相关的常用函数如下: web_add_cookie():添加新的cookie或者修改已经存在的cookie web_r ...

  6. LoadRunner监控Linux资源

    一.LoadRunner监控Linux资源 (一).准备工作 首先,监视Linux一定要有rstatd这个守护进程,有的Linux版本里也有可能是rpc.rstatd这里只是名字不同而已,功能是一样的 ...

  7. 【Java】 奇偶数的判断

    判断方法(奇数): 错误判断方法:通过a%2==1来判断.(原因:负奇数对2取余的结果为-1) 正确判断方法:(1) 通过a%2!=0来判断.                          (2) ...

  8. 《互联网MySQL开发规范》

    一.基础规范 使用 INNODB 存储引擎 表字符集使用 UTF8  所有表都需要添加注释 单表数据量建议控制在 5000W 以内 不在数据库中存储图⽚.文件等大数据 禁止在线上做数据库压力测试 禁⽌ ...

  9. 井字棋游戏升级版 - TopTicTacToe项目 简介

    一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...

  10. navicat批量导入数据

    1.excel表导入数据 根据数据表添加excel表内容 开始导入数据