最近想对项目中的所有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. Jmeter命令行选项

    示例:jmeter.bat -n -j %tmp%\%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%%time:~ ...

  2. 002利用zabbix监控某个目录大小

    近期,因为JMS的消息堆积导致ApacheMQ频率故障(消息没有被消费掉,导致其数据库达到1.2G,JMS此时直接挂掉),很是郁闷!刚好自 己在研究zabbix.既然zabbix如此强大,那么它可以监 ...

  3. js中startWith、endWith 函数不能在任何浏览器兼容的问题

    在做js测试的时候用到了startsWith函数,但是他并不是每个浏览器都有的,所以我们一般要重写一下这个函数,具体的用法可以稍微总结一下 在有些浏览器中他是undefined 所以我们可以这样的处理 ...

  4. 推荐一个数据相关的网站tushare

    推荐一个网站:tushare 使用方法如下: pip install tushare 我是使用pycharm直接安装的 抓取了浦发和光大的股票数据,并通过csv进行保存,和通过plt进行图片打印 im ...

  5. Sublime Text 2.0.2,Build 2221注册码

    Help ->Enter License,输入如下序列号: ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855 ...

  6. copy深浅拷贝

    我们在很多方法里都看到copy()方法,这是对变量的复制,赋值,下面来看一下实例: 复制方法调用的是copy模块中的方法: import copy copy.copy()         #前拷贝 c ...

  7. Canvas进阶——制作小游戏【贪吃蛇】

    今天呢,主要和小伙伴们分享一下一个贪吃蛇游戏从构思到实现的过程~因为我不是很喜欢直接PO代码,所以只copy代码的童鞋们请出门左转不谢. 按理说canvas与其应用是老生常谈了,可我在准备阶段却搜索不 ...

  8. HTML 如何显示英文单、双引号

    // 过滤英文引号替换成中文引号 function pregstring($str){ return preg_replace('/"([^"]*)/','&quot${1 ...

  9. HTTP协议的重新学习

    思论:做互联网一年多了,想了想对http协议的认识还处于很笼统的阶段,抽休息时间,重新梳理一下自己的网络知识. 1.什么叫HTTP协议? HTTP协议是Hyper TEXT Transfer Prot ...

  10. 559. N叉树的最大深度

    给定一个 N 叉树,找到其最大深度. 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数. 例如,给定一个 3叉树 : 我们应返回其最大深度,3. 说明: 树的深度不会超过 1000. 树的节点 ...