最近想对项目中的所有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. caffe Python API 之可视化

    一.显示各层 # params显示:layer名,w,b for layer_name, param in net.params.items(): print layer_name + '\t' + ...

  2. Learning a Deep Compact Image Representation for Visual Tracking

    这篇博客对论文进行了部分翻译http://blog.csdn.net/vintage_1/article/details/19546953,不过个人觉得博主有些理解有误. 这篇博客简单分析了代码htt ...

  3. fail2ban安全设置

    1.先安装fail2ban服务包(这里我采用的是fail2ban-0.8.14.tar.gz) 2.解压安装包 cd /data/software tar xzf fail2ban-0.8.14.ta ...

  4. ISSCC 2017论文导读 Session 14 Deep Learning Processors,DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN

    转载请注明,本文出自Bin的专栏http://blog.csdn.net/xbinworld,谢谢! DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN Process ...

  5. webapi调用post时自动匹配参数

    [HttpPost] public async Task<string> Post() { dynamic model = await Request.Content.ReadAsAsyn ...

  6. 【UOJ】#79. 一般图最大匹配

    题解 板子!我相信其实没人来看我的板子!但是为了防止我忘记,我还是要写点什么 我们考虑二分图,为什么二分图就能那么轻松地写出匹配的代码呢?因为匹配只会发生在黑点和白点之间,我们找寻增广路,必然是一黑一 ...

  7. 【caffe-Windows】微软官方caffe之matlab接口配置,以及安装caffe的注意事项

    1.在此之前,记录一下之前的错误,在参考博客[caffe-Windows]caffe+VS2013+Windows+GPU配置+cifar使用进行caffe的安装时,其中的一些步骤可以不做,具体见下图 ...

  8. Codeforces Round #302 (Div. 1) D - Road Improvement 树形dp

    D - Road Improvemen 思路:0没有逆元!!!! 不能直接除,要求前缀积和后缀积!!! #include<bits/stdc++.h> #define LL long lo ...

  9. RSA私钥和公钥文件格式 (pkcs#1, pkcs#8, pkcs#12, pem)

    RSA私钥和公钥文件格式 (pkcs#1, pkcs#8, pkcs#12, pem) 2018年03月07日 11:57:22 阅读数:674 Format Name Description PKC ...

  10. 力扣:丑数II和数组中前K大的元素

    数组中的第K个元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k ...