1.写一个日志自定义注解类
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ArchivesLog { /** 要执行的操作类型比如:add操作 **/ public String operationType() default ""; /** 要执行的具体操作模块比如:车型管理 **/ public String operationModule() default "";
}
2.写一个日志处理类
@SuppressWarnings("rawtypes")public class SystemLogAspect { @Autowired private HttpServletRequest request; public void beforeMethod(JoinPoint joinPoint){ } public void afterMethod(JoinPoint joinPoint) { String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); //请求参数 String operationModule = ""; //操作模块 String operationType=""; //操作类型 Class targetClass = null; try { targetClass = Class.forName(targetName); } catch (ClassNotFoundException e) { e.printStackTrace(); } Method[] methods = targetClass.getMethods(); for (Method method : methods) { if (method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if (clazzs!=null&&clazzs.length == arguments.length&&method.getAnnotation(ArchivesLog.class)!=null{ operationModule = method.getAnnotation(ArchivesLog.class).operationModule(); operationType=method.getAnnotation(ArchivesLog.class).operationType(); break; } } }
}
3.在配置spring mvc的xml中配置我们的切面:
<!--将日志处理类注入到bean中。-->
<bean id="systemLogAspect" class="com.umltech.aop.SystemLogAspect"></bean>
(1)切指定方法的切面配置:
<aop:config> <!-- 调用日志类 --> <aop:aspect ref="systemLogAspect"> <!-- 配置在controller包下所有的类在调用之前都会被拦截 --> <aop:pointcut id="logAdd" expression="(execution(* insert*(..)))||(execution(* edit*(..))))"/> <!-- 方法前触发 --> <aop:before pointcut-ref="logAdd" method="beforeMethod"/> <!-- 方法后触发 --> <aop:after pointcut-ref="logAdd" method="afterMethod"/>
</aop:aspect>
</aop:config>
(2)切指定的类的切面配置:
<aop:config>
<!-- 调用用户访问统计类 -->
<aop:aspect ref="userAccessAspect">
<!-- 配置在controller包下所有的类在调用之前都会被拦截 -->
<aop:pointcut id="userAccessAdd" expression="execution(* com.umltech.controller..OperationStatController.*(..))"/>
<!-- 方法前触发 -->
<aop:before pointcut-ref="userAccessAdd" method="beforeMethod"/>
<!-- 方法后触发 --> <aop:after pointcut-ref="userAccessAdd" method="afterMethod"/></aop:aspect>
</aop:config>
(3)切指定的包的切面配置
<aop:config>
<!-- 调用用户访问统计类 --> <aop:aspect ref="userAccessAspect"> <!-- 配置在controller包下所有的类在调用之前都会被拦截 --> <aop:pointcut id="userAccessAdd" expression="execution(* com.umltech.controller..*.*(..))"/> <!-- 方法前触发 --> <aop:before pointcut-ref="userAccessAdd" method="beforeMethod"/> <!-- 方法后触发 --> <aop:after pointcut-ref="userAccessAdd" method="afterMethod"/>
</aop:aspect>
</aop:config>
4.在方法上面添加@ArchivesLog(operationType="add",operationModule="simManage") ,operationType为操作类型,operationModule为操作模块,这俩个在数据库中分别由俩张表进行维护
5.通过日志操作类我们就可以获取操作的模块,操作类型,操作参数,这样就可以创建日志了