×××××××××××××××××××××××××××××
项目最近在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范数的压缩感知重构算法,成萍,刘婷婷,压缩感知中基于l1范数的最小优化算法,并不是对l0范数的最有效的逼近方法。随着测量值的减少,l1范数恢复信号的能力也在下降。针对
本章聚焦于重构的第一个实例,通过实际的代码示例,详细展示了重构的整个流程,并利用Git进行版本控制,确保每一步改动都有迹可循。 首先,重构的核心是识别代码中的坏味道(code smell),即那些暗示设计问题的不...
### Log4j2简介 Log4j2是Apache软件基金会推出的日志框架,它是Log4j 1.x的重构版本,旨在提供更为高效且灵活的日志解决方案。...对于寻求高性能日志解决方案的应用开发者来说,Log4j2无疑是一个值得考虑的选择。
7. 依恋情节:我们看到某个函数为了计算某值,从另一个对象哪儿调用几乎半打的取值函数(getting method),疗法是把这个函数移至它该去的另一个地方,Move method。 8. 数据泥团:你常常可以看到很多地方有相同的三或...
在上述代码片段中,可以看到一个典型的异常处理模式: ```java OutputStreamWriter out = null; java.sql.Connection conn = null; try { // 数据库操作 Statement stat = conn.createStatement(); ResultSet rs...
02-Log丑陋设计分析 重构 Log设计臭味-拙劣设计的症状及解决方法
相比Log4j1.x,Log4j2在设计上进行了重构,采用零拷贝(Zero-Copy)技术,减少了内存操作,提高了日志记录的效率。此外,它引入了Async Loggers,通过异步处理日志事件,进一步降低了日志记录对应用程序性能的影响。...
Apache Log4j是Java平台上的一个著名日志记录框架,它允许应用程序进行灵活且高效的日志记录。在标题中提到的"apache-log4j-2.3-bin.tar.gz"是一个压缩包,包含了Log4j 2.3版本的二进制文件。这个版本可能包含了Log4...
描述中提到的条件“M>=K*log(N/K)”是OMP算法的一个常见重构阈值,表明在满足这个条件时,理论上可以实现信号的近乎完全重构。 OMP算法步骤大致如下: 1. 初始化:选择第一个非零系数对应的原子,更新残差。 2. ...
为了按日志级别分文件,我们需要创建一个继承自FileAppender的自定义Appender,并重写其确定文件名的方法。 在自定义Appender中,我们可以根据接收到的日志事件(LoggingEvent)的级别来动态计算文件名。例如,当...
在给定文件中,通过一个具体实例说明了一维哈尔小波变换的过程。哈尔小波是最简单的小波基之一,特别适合于教学目的和理解小波变换的基本原理。 **哈尔小波变换(`haardwt.m`):** ```matlab function posidwt = ...
### 一种离散小波变换的快速分解和重构算法 #### 摘要与背景介绍 本文探讨了一种改进的离散小波变换(DWT)的快速分解和重构算法。通过对实序列的快速傅里叶变换(FFT)算法进行推导,并结合Mallat算法的原理,提出了...
Go-ozzo-log是专为Go语言程序设计的一个强大的日志处理库,旨在提供超过标准库`log`的增强型日志功能。这个库的主要目标是帮助开发者在编写Go应用时,实现更高效、更灵活的日志记录,以满足不同场景下的需求。下面将...
turbo码的关键之处在于它的迭代译码算法,它使用了软输入软输出(SISO)的解码器,在每一次迭代过程中,解码器将前一个分量码译码器的软输出信息作为自身的先验信息,从而改进自身的译码性能。这种迭代过程一直进行...
2. 自定义Debug类:创建一个自定义的Debug类,将所有的Debug输出集中管理。这样可以方便地开关整个调试输出,而不需要逐个修改代码。 3. 日志级别:根据日志的重要性,定义不同的日志级别,如info、warning、error...
支持添加拦截器,添加拦截器后它会在最终打印输出前进行拦截处理,可以对日志信息进行重构处理 支持添加全局回调,在不影响底层输出的情况下,所有信息会回调至全局接口里,可以在这里按各种级别类型保存你需要的...
【配电网重构】基于YALMIP求解含SOP(Second-Order Cone Programming)的二阶锥配电网重构是一个重要的电力系统优化问题。在现代电力系统中,配电网的重构旨在通过改变开关状态,优化网络性能,提高供电可靠性、经济...
可以有多个参数. 正常记录方法: logtxt.exe 有事发生记录下来 logtxt.exe 重要 关键错误 vbs调用如下: Dim objShell Set objShell = CreateObject("Wscript.Shell") objShell.Run "logtxt.exe 记录消息",0 把...