aop日志的简单介绍
本篇文章给大家谈谈aop日志,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Spring Boot 中使用Spring Aop实现日志记录功能
- 2、SSH 下做一个spring AOP的 操作日志记录功能
- 3、在Delphi中应用AOP实现日志功能[2]
- 4、jfinal如何用aop来做系统日志记录
- 5、在Delphi中应用AOP实现日志功能[1]
Spring Boot 中使用Spring Aop实现日志记录功能
一、创建日志注解
1、 日志类型枚举手培类
2、自定义日志注解
二、利用AOP实现日志切面统一处理
1、 日志实现类创建工厂
2、 切面类
三、 创建告薯缓日志实现类
1、添加日志接口袜模
2、添加日志接口实现类
四、controller
[img]SSH 下做一个spring AOP的 操作日志记录功能
给你提供一个思路:
1、写个静态类,定义静态变量,把所有要用到的service(假设AOP拦截到service层)实现类都写成key,value的形式,如:
Map modeMap=new HashMap();
map.put("UserServiceImpl","用户管理")//用于记录类拍启与模块的对应关系。
2、写静态变量,把定义的方樱哗法与日志中记录的描述对应。
methodMap.put("add_UserInfo",'添加用户信息'袭颂如);
methodMap.put("update_UserInfo",'修改用户信息');
3、写AOP切入点:
@Resource(name = "baseDao")
private BaseDao baseDao;
@Pointcut("execution (* com.web.*.*.service.*.*(..))")
// 切入点作用域
private void anyMethod() {
}// 声明一个切入点应用方法
@SuppressWarnings("unchecked")
@AfterReturning(pointcut = "anyMethod()", returning = "result")
public void doAfterReturning(JoinPoint join, Object result) {
String classname = join.getTarget().getClass().getName();//获取当前的类名
String method = join.getSignature().getName();//方法名
//再在上述静态MAP里找模块名字和方法描述,略..
//下述session中获取当前用户信息,略..
HttpSession session = HttpRequester.getHttpSession();
//组装日志对象,调用baseDao的方法写日志,略.
}
在Delphi中应用AOP实现日志功能[2]
通过了一番讨论 我们一致认为这个应该用AOP的思想来解决 但怎样在Delphi中来实现AOP呢 修改整个程序框架是不可能的 我们只能在现有的基础上做
正当我们要放弃的时候 突然想到了一个突破点 日志中记录的功能在程序实现的时候全部使用Action组件来做的 是否可以考虑在Action上面做文章呢?
曙光啊 曙光!
解决方式——瞒天过海
通俗点理解AOP 就是将一段代码统一 插入 某一类地方 但像Delphi这样的语言是很难实现 插入 代码的这一功能 不过我们可以通过事件机制来实现同样的效果
Action的执行代码都写在事件OnExecute中 如果能在执行事件之前和之后执行我想要的动作是不是就可以解决了?
procedure TModule acAction Execute(Sender: TObject);begin// do somethingend;
procedure TActionHook ReGISterAction(Action: TAction);begin// 记录Action与原始的OnExecute事件FActionList Add(Action);SetLength(FActionEvents Length(FActionEvents) + );FActionEvents[High(FActionEvents)] := Action OnExecute;// 瞒天过海 偷换事件Action OnExecute := HookActionExecute;end;
procedure TActionHook HookActionExecute(ASender: TObject);beginDoBeforeActionExecute(TAction(ASender));// 触发原始事件FActionEvents[FActionList IndexOf(ASender)](ASender);DoAfterActionExecute(TAction(ASender));end;
procedure TActionHook DoAfterActionExecute(Action: TAction);begin// 所有的Action执行完毕后调轮余游用此处FLog LogCommand(Action Caption);end;
相关的UML图如下
图略
采用这样的方式后 很明显我们不需要将日志相关代码分散到系统的各个地方 只需要在一个统一的地方将所有Form上的Action组件注册到TActionHook中就可以了
扩展思考
在Delphi中可以通过事件的机制实现代码注入技术 当然同样在毁型其他支持事件的语言中也可以实现 相比之下这种方法实现AOP比较简单 并且不需要在系统的整体结构上作什么调整 完全通过语言层面支持
例子中针对Action的组件来处理日志功能 将TActionHook扩展之后可以将其他的控件操作也通过这套机制记录到日志中
很多同行们都埋怨自己做的是体力活 没什么技术含量 同样在刚开始的时候 我也认为这个任务是体力活 但是如果我们能勤于思考新的解决方法 体力活绝对能够变为技术活 只有这样才能不辜负 高腊销科技 这个美誉啊
上面介绍的方法肯定不是最好的 这次拿出来和大家分享 一方面是将自己的经验献给需要的朋友 另外也特别希望大家能给一点好的建议 一起交流 共同学习
lishixinzhi/Article/program/Delphi/201311/24868
jfinal如何用aop来做系统日志记录
Interceptor 可以对方法进行拦截,吵链并提供机会在方法的前后添加切面代码,实现 AOP 的核心目标。Interceptor 接口仅仅定义了一个方法 public void intercept(Invocation inv)。以下是简单示例:
public class DemoInterceptor implements Interceptor {
public void intercept(Invocation inv) {
//文件记录或者数据库记录
LogKit.info("系统日志记录开始");
inv.invoke();
//
LogKit.info("系统日志记录结束");
}
}
以上代码中的 DemoInterceptor 将拦截目标方法,并且在目标方法调用前后向控制台输出文本。inv.invoke() 这一行代码是对目标方法的调用,在这一行代码的前后插入切面代码可以很方便地实现AOP。
注意:必须调用 inv.invoke() 方法,才能将当前调用传递到后续的 Interceptor 与 Action。
网页链接
JFinal中的AOP被划分为控制层AOP以及业务层AOP,严格来说业务层AOP并非仅限于在业务层使用,因为JFinal AOP可以应用于其它任何地方。
控制层拦截器的触发,只需发起action请求即可。业务层拦截器的触发需要先使用enhance方法对目标对象进行增强,然后调用目标方法即可。以下是业务层AOP使用的例子:
// 定义需要使用AOP的业务层类
public class OrderService {
// 配置事务拦截器
@Before(Tx.class)
public void payment(int orderId, int userId) {
// service code here
}
}
// 定义控制器,控制器提供了enhance系列方法可对目标进行AOP增强
public class OrderController extends Controller {
public void payment() {
// 使用 enhance方法对业务层进行增强,使其具有AOP能力
OrderService service = enhance(OrderService.class);
// 调用payment方法时将会触发拦截器
service.payment(getParaToInt("orderId"), getParaToInt("userId"));
}
}
以上代码中OrderService是业务层类,其中的payment方冲则法之上配置了Tx事务拦截器,OrderController是控制器,在其中使用了enhance方法对OrderSevice进行了增强,随后调用其payment方法便可触发Tx拦截器升判孙。简言之,业务层AOP的触发相对于控制层仅需多调用一次enhance方法即可,而Interceptor、Before、Clear的使用方法完全一样。网页链接
在Delphi中应用AOP实现日志功能[1]
AOP现在很火 网上有这许多支持AOP的框架 对于Delphi来说同样也有MeAOP 不过觉得这些框架太复杂了
现在有一个系统 基本上都快结束了 整体上当然是没有采用什么AOP的框架 对于这样的系统能否用上AOP的一点点好处呢?
项目组提出在现有的系统上加入日志记录的需求 大家一起来看看我是怎么来实现这个功能的吧
AOP简要说明
根据网上对AOP的解释 它具有下面的特征
将通用功能从不相关类之中分离出来 能够使得很多类共享一个功能 一旦功能发生变化 不必修改很多陆消类 只要修改这个功能就可以了 AOP的核心在于保持横切关注点的分离
日志功能
这是一个比较典型的MIS系统 现在编码基本结束 不过某个开发人员桥芦接到了一个繁琐又看上去没什么技术含量的任务——实现日志功能 这个开发者就是本人了
虽然没什么难度 但还是设计一下吧 谁让我是一个自诩为高水平的程序员呢
一个设计图就这么做出来了 其中设计一个接口ILog来封装日志实现的细节 模块甲乙丙只需要使用接口ILog就可以 满足了XXX面向对象的设计原则 太完美了!
泡杯茶 然后开始写代码实现这个简单而庞大的任务 开始编码了!
TLog ILog实现比较简单 在此略去不谈 稍微修改一下以前模块的代码 将ILog接口传入每一个模块中
接下来只需要实现日志功能的调用就可以了
模块甲
procedure TModule acAction Execute(Sender: TObject);begin……Flog LogCommand( 模块甲 操作一 );end;
procedure TModule acAction Execute(Sender: TObject);begin……Flog LogCommand( 模块甲 操作二 );end;
模块乙
procedure TModule acAction Execute(Sender: TObject);begin……Flog LogCommand( 模块乙 操作一 );end;
就这样 写了大约二十几个地方 突然觉得自己太可悲了 作为一个高科技人才就干这种体力活吗? 坏味道的早消知出现 在许许多多的地方都出现了Flog LogCommand这样的函数调用 正是这些函数调用让我崩溃 在这么做下去估计我撑不到周末了
CV大法 已经让我觉得羞愧加恼怒 系统中到处出现了这样的重复代码
无奈之中 我耷拉着脑袋走到一个同事桌前
嘿 救救我吧 我想解脱
怎么回事? 同事善意地问道
事情是这样子的……
lishixinzhi/Article/program/Delphi/201311/24869
关于aop日志和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。