|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
多谢指点,其实我对.net网页编程和ruby也不是很了解,对与java也只是刚起步的阶段,只是在学习中有了点想法就写出来了,现在俺本科还没毕业,所以对大型项目基本上也没有什么经验。断点是我们一样平常开辟最为罕见和高效的调试手腕,比拟较输出日记它赐与更多的形态信息和天真的察看角度,但断点调试是有条件和范围的.
- 必要一个界面友爱,功效壮大的IDE,
- 对照合适于在单机的开辟情况中举行.
企业使用开辟中,我们经常会碰到没法断点调试的困境,比方:
- 这个非常仅在临盆情况呈现,开辟情况里没法重现;
- 存在内部体系依附,开辟情况没法摹拟等.
这迫使我们不能不回到日记调试的老门路下去.
PrintvsLogging
复杂点的话,我们用- System.out.println("debuginfomation");
复制代码 就是由于过于复杂,当必要更多信息(如线程,工夫等),或是界说输入形式和情势就必要编写更多代码,因而我们有了Log4j.
为何要基于AOP
Log4j挺好用的,只是与System.out.print一样,在代码中到处可见,但却没有营业代价.
更使人头痛的是,并不是每次我们都有充足的履历告知本人应当在那里增加这些语句,乃至于调试中不休的由于调正它们的在代码中的地位,而重复编译–打包–公布体系.这类膂力活,太没艺术感了,!
换而言之,我们会但愿:
- 将Logging剥离于营业以外,让代码更容易于保护,
- 无需从头编译,乃至可以运转时,可调剂输入日记的地位.
AOP完整能够匡助我们做到上述两点.
这完整不是甚么奇怪概念,这在任何先容AOP文章中,城市提到Logging是其最典范的使用场景.
以是这儿将基于Guice,会商怎样完成一个非侵进式的,且能无需从头编译便可调正Logging地位的复杂示例.
一个基于Guice的示例
我已经用过一个叫Log4E的Eclipse插件,它可依据我们事后的设置,主动的为我们在编写的代码中拔出logging的语句,如办法挪用的入口和出口:- 01publicintsum(inta,intb){02if(logger.isDebugEnabled()){03logger.debug("sum-start:ais"+a+",bis"+b);04}0506intresult=a+b;0708if(logger.isDebugEnabled()){09logger.debug("sum-end:returnis"+result);10}11}
复制代码 从上例不难发明,我们在调试过程当中,常常会经由过程一个办法的进进或加入的形态(参数,前往值或非常)来剖析成绩出在甚么中央.那末,借助MethodInterceptor我们能够如许做:
Logging拦阻器
- 01publicclassLoggingInterceptorimplementsMethodInterceptor{0203@Override04publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{05try{06Objectresult=invocation.proceed();0708//logging??,??????09log(invocation.getMethod(),invocation.getArguments(),result);1011returnresult;12}catch(Throwablethrowable){1314//logging??,?????15error(invocation.getMethod(),invocation.getArguments(),throwable);1617throwthrowable;18}19}20}
复制代码 接上去,我们必要设置这个拦阻器,并向Guice声明它.- 01publicclassLoggingModuleextendsAbstractModule{0203@Override04publicvoidconfigure(){05bindInterceptor(Matchers.any(),Matchers.any(),newLoggingInterceptor());06}0708}0910publicclassMain{11publicstaticvoidmain(String[]args){12Injectorinjector=Guice.createInjector(newBusinessModule(),newLoggingModule());1314}15}
复制代码 很复杂,不是吗?如许我们的营业模块的代码完整不必编写输入日记的代码,只必要在创立Injector的时分到场LoggingModule就能够了.
等等,仿佛忘了往完成怎样设置日记输入的地位.好吧,这个实在很复杂:
设置Logging地位
- 01bindInterceptor(Matchers.any(),Matchers.any(),newLoggingInterceptor());
复制代码 bindInterceptor办法的第一个参数界说了拦阻器将婚配一切类,第二个参数界说了拦阻器将婚配一个类一切办法.那末,我们要做的仅仅是经由过程内部参数调剂这两个参数就能够啦.这儿就演示一个用正则表达式婚配要Logging的办法的例子:
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 |
|