精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-08
本文是Magic AOP:面向切面的业务日志框架设计的第二部分,第一部分请见http://lee5593.iteye.com/admin/show/88163 3.1. 业务日志记录组件设计业务日志记录组件的设计思路是通过事先定义好的业务类型和操作类型对业务方法进行两个维度的分类,利用BusinessLog注解对需要记录业务日志的业务方法进行声明,然后用AOP对声明了BusinessLog注解的业务方法进行拦截,取到注解中的参数组装业务日志消息对象,调用业务日志输出组件进行输出。 <o:p></o:p> 对一个业务方法进行业务方法进行声明的代码看起来象这样: java 代码
对于业务日志信息中的会话信息(如用户标识、客户端机器标识),采用了ThreadLocal通过Filter获取后,直接在业务日志消息对象构造方法中进行赋值,以避免客户端开发人员手动编码。 我们推荐使用上述的方式来记录业务日志,当然你也可以将BnLog对象直接注入到你的业务对象中通过显式方法调用来记录业务日志,甚至可以直接拿到BnLogConfiguration对象来按需生成BnLog对象,一切取决于你的喜好,这里只是演示了一种Best Practice。 <o:p></o:p> 业务日志记录组件中的主要接口和类清单如下: BnLog<o:p></o:p> 业务日志记录接口,包含了多个log方法 BnLogItem<o:p></o:p> 业务日志对象,使用JPA进行数据库表映射,数据库相应的表名需要与对象类名相同。主要属性有业务类型、事件类型、详细信息、记录时间、用户标识、客户端机器标识、是否成功标识。如果扩展该业务日志对象,用JPA对扩展属性进行配置即可,表名需要与扩展对象类名相同。 BnLogConfiguration<o:p></o:p> 业务日志配置类,主要负责初始化业务类型、事件类型和维护业务日志实例缓存池。初始化业务日志框架时,该类从外部的属性文件bnlog.properties中读取定义好的参数,然后分别对业务类型、事件类型以及业务日志消息对象进行初始化,bnlog.properties的格式定义如下:
java 代码
主要的方法如下: void init()<o:p></o:p> 初始化方法<o:p></o:p> <o:p></o:p> void destory()<o:p></o:p> 销毁方法<o:p></o:p> <o:p></o:p> void setBusinessTypes(String businessTypes)<o:p></o:p> 设置业务类型 <o:p></o:p> <o:p></o:p> void setEventTypes(String eventTypes)<o:p></o:p> 设置事件类型<o:p></o:p> <o:p></o:p> BnLog getBnLog(String name)<o:p></o:p> 获取BnLog实例,所有的BnLog实例都从这里获取<o:p></o:p> <o:p></o:p> static boolean validateBusinessType(String businessType)<o:p></o:p> 验证业务类型<o:p></o:p> <o:p></o:p> static boolean validateEventType(String eventType)<o:p></o:p> 验证事件类型<o:p> </o:p> BusinessLog<o:p></o:p> 业务日志注解,用于提供方法级别的声明,配合AOP进行切面业务日志记录。<o:p></o:p> <o:p>java 代码
State<o:p></o:p> 业务操作状态枚举,配合BusinessLog注解协同工作。 java 代码
BnLogAspect<o:p></o:p> 业务日志通用切面,采用@AspectJ风格,Spring配置文件中需引入下列元素来启用对@AspectJ的支持。<o:p></o:p> java 代码
3.2. 业务日志输出组件相对于业务日志记录组件,业务日志输出组件要简单得多,我们采用了ActiveMq来对业务日志消息对象进行异步处理,以便隔离业务日志输出异常给业务操作带来的影响。你也可以不用异步处理机制,只需要实现Appender接口,重新编写一种实现来替换默认的输出机制。Appender接口非常简洁,其中只定义了一个doAppend()方法。 <o:p></o:p> 业务日志记录组件中的主要接口和类清单如下: Appender<o:p></o:p> 业务日志输出接口,定义了一个doAppend(BnLogItem bnLogItem)方法,实现类需实现该方法对业务日志消息对象进行输出 DefaultAppenderImpl<o:p></o:p> 默认的业务日志输出类,实现了Appender接口,将业务日志持久化到数据库 <o:p></o:p> BnLogMessageProducer<o:p></o:p> 业务日志JMS消息生产者,实现了Appender接口 <o:p></o:p> BnLogMessageConverter<o:p></o:p> 业务日志消息转换类 <o:p></o:p> BnLogMessageConsumer<o:p></o:p> 业务日志消息消费者,接受注入的Appender对象对业务日志消息进行真正地输出 3.3. 业务日志查询组件业务日志查询组件定义了一个BnLogQuery接口,包含了多个查询方法,接口定义如下: java 代码
该查询组件相对来说没有什么难度,本文不再予以详细描述。 4. 总结本文通过我们在实际企业级项目中应用AOP的实际经验,总结了通过AOP来进行业务日志框架设计的一些经验供大家参考,并希望借此起到抛砖引玉的效果,寻求更加优秀的AOP设计方案,使面向方面软件设计(AOSD)深入人心,来改善目前面向对象设计在某些特定问题领域的不足之处,让我们试目以待。 </o:p>声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 5997 次