`
Eric.Yan
  • 浏览: 324079 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个log的重构

阅读更多

×××××××××××××××××××××××××××××

项目最近在enhancement,很多东西现在一看都需要重构,特别是本人以前写的,哎,才疏学浅啊,还要努力学习才行。
项目中有个记log的功能(可以理解的很简单,点击link就记一条log),是嵌在各个功能方法里边写的,这么写即难看,又不利于维护,而且对性能还会造成影响,所以现在考虑重构,重新来过。
目前有3种方案:
1)用log4j
2)用spring3.0自带的一个asynchronous logging来做
3)自己用动态代理的模式实现
如果可以的话,每种方法都想试一下,目前比较倾向于3),用动态代理,新new一个thread专门去做log的记录,这样的结构要好很多,易维护;

 

一>先看一个简单的dynamic proxy case:
------------------------interface

public interface Phone
{
 public void call(int s, String p);
}

 ------------------------implements

public class CellPhone implements Phone
{
 @Override
 public void call(int s, String p)
 {
  System.out.println("this is cellphone");
 }
}

 ------------------------proxy

public class DynamicProxyFactory implements InvocationHandler
{
 private Object ob;

 
 public Object createProxyInstance(Object targetObject)
 {
  this.ob = targetObject;
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
 }
 
 @Override
 public Object invoke(Object arg0, Method arg1, Object[] arg2)
   throws Throwable
 {
  System.out.println("dynamic start!");
  System.out.println("again dynamic start!");
  Object result = arg1.invoke(ob,arg2);
  System.out.println("again dynamic end!");
  System.out.println("dynamic start!");
  return result;
 }
}

 -----------------------test class

public class MainPhone
{

 /**
  * @param args
  */
 public static void main(String[] args)
 {
  //static delegate
  /*Phone cell = new CellPhone();
  cell.call(1,"static delegate");
  
  Phone audioCell = new AudioCellPhone(cell);
  audioCell.call(1,"static delegate");
  
  Phone videoAudioCell = new VideoAudioCellPhone(audioCell);
  videoAudioCell.call(1,"static delegate");*/
  
  //dynamic delegate
  Phone cellPhone = new CellPhone();
  DynamicProxyFactory delegate = new DynamicProxyFactory(); 
  Phone proxyPhone = (Phone)delegate.createProxyInstance(cellPhone);
  proxyPhone.call(5,"dynamic love");
 }

}

 

从上往下,依次是接口-实现类-动态代理类-main入口,结果预期:

dynamic start!
again dynamic start!
this is cellphone
again dynamic end!
dynamic start!

 

如果你想在现有的操作下再套一层(比如说,原来那个方法实现了user request,你现在用代理模式成功的添加了日志,以后user如果要求再添加什么功能,可以直接在DynamicProxyFactory中写,‘again dynamic start!’).
但是实际将动态代理应用在项目中一直会有问题,即前一篇blog, 不过问题都解决了。

 

二>动态代理模式已经建立,下面用new thread来使perfermence更加完善.

thread的用法参考上一篇blog,运用的时候一般用runnable接口来实现,把你想让这个thread做的事情放在override的run()方法中,但是这时又碰到一些问题,参数的问题。
run()中可能需要project传来的参数,从而来完成一些操作,但是run()并没有参数可以让你传递,怎么办?

 

其实有2种基本方法可以向线程传递参数,不再详细说明:


通过构造方法传递
通过变量(set方法)传递

此仅为方案三,如果有时间我会一并实现其他方案……

分享到:
评论

相关推荐

    论文研究-基于log-sum范数的压缩感知重构算法 .pdf

    基于log-sum范数的压缩感知重构算法,成萍,刘婷婷,压缩感知中基于l1范数的最小优化算法,并不是对l0范数的最有效的逼近方法。随着测量值的减少,l1范数恢复信号的能力也在下降。针对

    《重构改善既有代码的设计第2版》第1章 重构,第一个示例重构过程

    本章聚焦于重构的第一个实例,通过实际的代码示例,详细展示了重构的整个流程,并利用Git进行版本控制,确保每一步改动都有迹可循。 首先,重构的核心是识别代码中的坏味道(code smell),即那些暗示设计问题的不...

    Log4j2简介及与Log4j效率对比

    ### Log4j2简介 Log4j2是Apache软件基金会推出的日志框架,它是Log4j 1.x的重构版本,旨在提供更为高效且灵活的日志解决方案。...对于寻求高性能日志解决方案的应用开发者来说,Log4j2无疑是一个值得考虑的选择。

    java代码重构经验分享

    7. 依恋情节:我们看到某个函数为了计算某值,从另一个对象哪儿调用几乎半打的取值函数(getting method),疗法是把这个函数移至它该去的另一个地方,Move method。 8. 数据泥团:你常常可以看到很多地方有相同的三或...

    java代码重构经验总结

    在上述代码片段中,可以看到一个典型的异常处理模式: ```java OutputStreamWriter out = null; java.sql.Connection conn = null; try { // 数据库操作 Statement stat = conn.createStatement(); ResultSet rs...

    02-Log丑陋设计分析

    02-Log丑陋设计分析 重构 Log设计臭味-拙劣设计的症状及解决方法

    Log4j2手册阅读随笔(Log4j2新特性)

    相比Log4j1.x,Log4j2在设计上进行了重构,采用零拷贝(Zero-Copy)技术,减少了内存操作,提高了日志记录的效率。此外,它引入了Async Loggers,通过异步处理日志事件,进一步降低了日志记录对应用程序性能的影响。...

    apache-log4j-2.3-bin.tar.gz

    Apache Log4j是Java平台上的一个著名日志记录框架,它允许应用程序进行灵活且高效的日志记录。在标题中提到的"apache-log4j-2.3-bin.tar.gz"是一个压缩包,包含了Log4j 2.3版本的二进制文件。这个版本可能包含了Log4...

    CS_OMP.zip_K._OMP信号稀疏_OMP稀疏重构_信号稀疏重构

    描述中提到的条件“M>=K*log(N/K)”是OMP算法的一个常见重构阈值,表明在满足这个条件时,理论上可以实现信号的近乎完全重构。 OMP算法步骤大致如下: 1. 初始化:选择第一个非零系数对应的原子,更新残差。 2. ...

    log4j小测试

    为了按日志级别分文件,我们需要创建一个继承自FileAppender的自定义Appender,并重写其确定文件名的方法。 在自定义Appender中,我们可以根据接收到的日志事件(LoggingEvent)的级别来动态计算文件名。例如,当...

    小波压缩、编码、重构、信噪比求取(附程序代码)

    在给定文件中,通过一个具体实例说明了一维哈尔小波变换的过程。哈尔小波是最简单的小波基之一,特别适合于教学目的和理解小波变换的基本原理。 **哈尔小波变换(`haardwt.m`):** ```matlab function posidwt = ...

    一种离散小波变换的快速分解和重构算法

    ### 一种离散小波变换的快速分解和重构算法 #### 摘要与背景介绍 本文探讨了一种改进的离散小波变换(DWT)的快速分解和重构算法。通过对实序列的快速傅里叶变换(FFT)算法进行推导,并结合Mallat算法的原理,提出了...

    Go-ozzo-log是给Go程序提供加强型日志功能的go包

    Go-ozzo-log是专为Go语言程序设计的一个强大的日志处理库,旨在提供超过标准库`log`的增强型日志功能。这个库的主要目标是帮助开发者在编写Go应用时,实现更高效、更灵活的日志记录,以满足不同场景下的需求。下面将...

    基于log-map的编译码

    turbo码的关键之处在于它的迭代译码算法,它使用了软输入软输出(SISO)的解码器,在每一次迭代过程中,解码器将前一个分量码译码器的软输出信息作为自身的先验信息,从而改进自身的译码性能。这种迭代过程一直进行...

    Unity debug重构

    2. 自定义Debug类:创建一个自定义的Debug类,将所有的Debug输出集中管理。这样可以方便地开关整个调试输出,而不需要逐个修改代码。 3. 日志级别:根据日志的重要性,定义不同的日志级别,如info、warning、error...

    log4j介绍.doc

    随着时间的发展,Log4j经过不断的优化和重构,最终成为了一个功能强大、易于使用的日志框架,并在Apache Public License下发布。 #### 二、为什么要使用Log4j? 1. **简化日志操作**:Log4j的设计理念之一就是使...

    Log 这是一个Android 轻量级简单易用的Log组件

    支持添加拦截器,添加拦截器后它会在最终打印输出前进行拦截处理,可以对日志信息进行重构处理 支持添加全局回调,在不影响底层输出的情况下,所有信息会回调至全局接口里,可以在这里按各种级别类型保存你需要的...

    【配电网重构】基于yalmip求解含sop+二阶锥配电网重构附matlab代码.zip

    【配电网重构】基于YALMIP求解含SOP(Second-Order Cone Programming)的二阶锥配电网重构是一个重要的电力系统优化问题。在现代电力系统中,配电网的重构旨在通过改变开关状态,优化网络性能,提高供电可靠性、经济...

    logtxt-命名行记录日志

    可以有多个参数. 正常记录方法: logtxt.exe 有事发生记录下来 logtxt.exe 重要 关键错误 vbs调用如下: Dim objShell Set objShell = CreateObject("Wscript.Shell") objShell.Run "logtxt.exe 记录消息",0 把...

Global site tag (gtag.js) - Google Analytics