一、前言
基于spring的org.springframework.context.ApplicationListener事件监听器、org.springframework.context.ApplicationEvent事件对象、org.springframework.context.ApplicationEventPublisherAware注册事件源三个依赖基类实现通用日志组件,在不同业务模块服务(如UserService用户服务模块中)中按照注册不同事件行为来记录日志。
二、代码示例
1. 如上所述,主要代码类依赖图如下所示,完整的源码下载
2. SecurityManager类 - 注册发布事件源,代码如下
import org.springframework.context.ApplicationEvent;@b@import org.springframework.context.ApplicationEventPublisher;@b@import org.springframework.context.ApplicationEventPublisherAware;@b@import com.xwood.test.log.entity.ILog;@b@@b@public class SecurityManager implements ApplicationEventPublisherAware {@b@ @b@ private static ApplicationEventPublisher eventPublisher;@b@ @b@ @b@ public void setApplicationEventPublisher(@b@ ApplicationEventPublisher applicationEventPublisher) {@b@ @b@ eventPublisher = applicationEventPublisher;@b@ }@b@ @b@ public static void publishEvent(ApplicationEvent event){@b@ eventPublisher.publishEvent(event);@b@ }@b@ @b@ public static void log(ILog log){@b@ eventPublisher.publishEvent(new LogEvent(log));@b@ }@b@ @b@}
用户服务类UserService,代码如下
import org.springframework.beans.factory.annotation.Autowired;@b@import com.xwood.test.log.LogHelper;@b@import com.xwood.test.log.entity.User;@b@import com.xwood.test.log.persist.IPersistDao;@b@@b@@b@public class UserService implements IUserService {@b@@b@ private IPersistDao dao;@b@ @b@ public IPersistDao getDao() {@b@ return dao;@b@ }@b@ @Autowired@b@ public void setDao(IPersistDao dao) {@b@ this.dao = dao;@b@ }@b@ @b@ public String create(User u) {@b@ onAdd(u);@b@ return null;@b@ }@b@ @b@ public void delete(User u){@b@ onDelete(u);@b@ }@b@ @b@ /*----- 发布事件 -----*/@b@ protected void onAdd(User user){@b@ LogHelper.actionLog("add","", user);@b@ }@b@ @b@ protected void onUpdate(User old, User user){@b@ LogHelper.actionLog("update","", user);@b@ }@b@ @b@ protected void onDelete(User user){@b@ LogHelper.actionLog("delete","", user);@b@ }@b@ @b@ @b@}
LogEvent类 - 事件对象,代码如下
import org.springframework.context.ApplicationEvent;@b@@b@import com.woopa.sf.log.ILog;@b@ @b@public class LogEvent extends ApplicationEvent {@b@ @b@ private static final long serialVersionUID = 8807576919145507907L;@b@@b@ public LogEvent(ILog log) {@b@ super(log);@b@ }@b@}
3. 事件监听器 - ActionLogAppender类,代码如下
import com.xwood.test.log.entity.ActionLog;@b@import com.xwood.test.log.entity.ILog;@b@import com.xwood.test.log.service.IActionLogService;@b@@b@public class ActionLogAppender implements ILogAppender {@b@@b@ private IActionLogService actionLogService;@b@ @b@ public IActionLogService getActionLogService() {@b@ return actionLogService;@b@ }@b@ @b@ public void setActionLogService(IActionLogService actionLogService) {@b@ this.actionLogService = actionLogService;@b@ }@b@ public void append(ILog log) {@b@ actionLogService.save((ActionLog) log);@b@ }@b@@b@ @SuppressWarnings("rawtypes")@b@ public boolean supports(Class logClass) {@b@ return ActionLog.class.isAssignableFrom(logClass);@b@ }@b@@b@}
ILogAppender类
import com.xwood.test.log.entity.ILog;@b@@b@public interface ILogAppender {@b@ @b@ void append(ILog log);@b@ @b@}
ActionLogAppender类
import com.xwood.test.log.entity.ActionLog;@b@import com.xwood.test.log.entity.ILog;@b@import com.xwood.test.log.service.IActionLogService;@b@@b@public class ActionLogAppender implements ILogAppender {@b@@b@ private IActionLogService actionLogService;@b@ @b@ public IActionLogService getActionLogService() {@b@ return actionLogService;@b@ }@b@ @b@ public void setActionLogService(IActionLogService actionLogService) {@b@ this.actionLogService = actionLogService;@b@ }@b@ public void append(ILog log) {@b@ actionLogService.save((ActionLog) log);@b@ }@b@@b@ @SuppressWarnings("rawtypes")@b@ public boolean supports(Class logClass) {@b@ return ActionLog.class.isAssignableFrom(logClass);@b@ }@b@@b@}
ErrorLogAppender类
import com.xwood.test.log.entity.ErrorLog;@b@import com.xwood.test.log.entity.ILog;@b@import com.xwood.test.log.service.IErrorLogService;@b@@b@public class ErrorLogAppender implements ILogAppender {@b@@b@ private IErrorLogService errorLogService;@b@ @b@ public IErrorLogService getErrorLogService() {@b@ return errorLogService;@b@ }@b@ @b@ public void setErrorLogService(IErrorLogService errorLogService) {@b@ this.errorLogService = errorLogService;@b@ }@b@ public void append(ILog log) {@b@ errorLogService.save((ErrorLog) log);@b@ }@b@@b@ @SuppressWarnings("rawtypes")@b@ public boolean supports(Class logClass) {@b@ return ErrorLog.class.isAssignableFrom(logClass);@b@ }@b@@b@}
ActionLogService类
import org.springframework.beans.factory.annotation.Autowired;@b@import org.springframework.stereotype.Service;@b@import com.asc.common.persist.IPersistDao;@b@import com.xwood.test.log.entity.ActionLog;@b@ @b@@Service@b@public class ActionLogService implements IActionLogService {@b@ @b@ private IPersistDao dao;@b@ @b@ public IPersistDao getDao() {@b@ return dao;@b@ }@b@ @Autowired@b@ public void setDao(IPersistDao dao) {@b@ this.dao = dao;@b@ }@b@ @b@ public void save(ActionLog log) {@b@ dao.save(log);@b@ }@b@ @b@}
4. Spring上线文配置文件如下
<?xml version="1.0" encoding="UTF-8"?>@b@<beans xmlns="http://www.springframework.org/schema/beans"@b@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"@b@ xmlns:context="http://www.springframework.org/schema/context"@b@ xmlns:aop="http://www.springframework.org/schema/aop"@b@ xmlns:mvc="http://www.springframework.org/schema/mvc"@b@ xsi:schemaLocation="@b@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd@b@ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd@b@ http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd@b@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">@b@ @b@ <!-- 自动扫描Action加入Spring上下文 Scope:prototype -->@b@ <context:component-scan base-package="com.xwood.test" scope-resolver="org.springframework.context.annotation.Jsr330ScopeMetadataResolver"/>@b@ @b@ <bean id="actionLogAppender" class="com.xwood.test.log.registry.ActionLogAppender" autowire="byName" />@b@ <bean id="errorLogAppender" class="com.xwood.test.log.registry.ErrorLogAppender" autowire="byName" />@b@ @b@ <bean class="com.xwood.test.log.registry.LogAppenderRegistry">@b@ <property name="logAppenders">@b@ <list>@b@ <ref bean="actionLogAppender"/>@b@ <ref bean="errorLogAppender"/>@b@ </list>@b@ </property>@b@ </bean>@b@ @b@ <bean id="securityManager" class="com.xwood.test.log.SecurityManager" autowire="byName"/>@b@ @b@ @b@</beans>