http://blog.csdn.net/paincupid/article/details/50534412
自定义注解,结合AOP实现日志功能
在做AOP日志的的时候,注意:
<aop:aspectj-autoproxy proxy-target-class="true"/>
如果将上面的话放在spring-context.xml/applicationContext.xml中,这里的aop设置将不会生效!!
源代码下载地址:https://git.oschina.net/paincupid/springmvc.git
代码以下
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.paincupid.springmvc.log;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取
@Target(ElementType.METHOD)//目标是方法
@Documented//文档生成时,该注解将被包含在javadoc中,可去掉
public @interface OpLogger {
public String id() default "-1";
public enum OpType{ ADD,UPDATE, DEL, SEARCH};
OpType type() default OpType.SEARCH;
}
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.paincupid.springmvc.log;
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.paincupid.springmvc.log.OpLogger.OpType;
/**
*
* @author arthur.paincupid.lee
* @since 2016.01.18
*/
@Aspect
@Component
public class SysLogAspect {
private static final Logger logger = LoggerFactory.getLogger(SysLogAspect. class);
@Pointcut("@annotation(com.paincupid.springmvc.log.OpLogger)")
public void controllerAspect() {
}
@Before("controllerAspect()")
public void doBefore(JoinPoint joinPoint) {
System.out.println("=====SysLogAspect前置通知开始=====");
handleLog(joinPoint, null);
}
@AfterReturning(pointcut="controllerAspect()")
public void doAfter(JoinPoint joinPoint) {
System.out.println("=====SysLogAspect后置通知开始=====");
handleLog(joinPoint,null);
}
@AfterThrowing(value="controllerAspect()",throwing="e")
public void doAfter(JoinPoint joinPoint, Exception e) {
System.out.println("=====SysLogAspect异常通知开始=====");
handleLog(joinPoint, e);
}
private void handleLog(JoinPoint joinPoint,Exception e) {
try {
//获得注解
OpLogger logger = giveController(joinPoint);
if(logger == null)
{
return;
}
String signature = joinPoint.getSignature().toString(); // 获取目标方法签名
String methodName = signature.substring(signature.lastIndexOf(".") + 1,
signature.indexOf("("));
String longTemp = joinPoint.getStaticPart().toLongString();
String classType = joinPoint.getTarget().getClass().getName();
Class<?> clazz = Class.forName(classType);
Method[] methods = clazz.getDeclaredMethods();
System.out.println("methodName: " + methodName);
for (Method method : methods) {
if (method.isAnnotationPresent(OpLogger.class)
&& method.getName().equals(methodName)) {
//OpLogger logger = method.getAnnotation(OpLogger.class);
String annId = logger.id();
OpType type = logger.type();
String clazzName = clazz.getName();
System.out.println("clazzName: " + clazzName+ ", methodName: "
+ methodName + ", annId: "+ annId + ", type: "+type.toString());
}
}
} catch (Exception exp) {
logger.error("异常信息:{}", exp.getMessage());
exp.printStackTrace();
}
}
private static OpLogger giveController(JoinPoint joinPoint) throws Exception {
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method != null) {
return method.getAnnotation(OpLogger.class);
}
return null;
}
public void insertLogSuccess(JoinPoint jp, OpLogger logger) {}
public void writeLogInfo(JoinPoint joinPoint, OpLogger opLogger)
throws Exception, IllegalAccessException {}
}
[html] view plain copy 在CODE上查看代码片派生到我的代码片
<!-- 最重要:::如果放在spring-context.xml中,这里的aop设置将不会生效 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
别忘记引入:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
"
default-autowire="byName">
使用:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package com.paincupid.springmvc.json.controller;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.ibatis.builder.ParameterExpression;
import org.aspectj.lang.JoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.paincupid.springmvc.log.OpLogger;
import com.paincupid.springmvc.log.OpLogger.OpType;
import com.paincupid.springmvc.test.domain.Person;
import com.paincupid.springmvc.util.BaseJsonRst;
import com.paincupid.springmvc.util.CreatMockData;
@Controller
@RequestMapping("/jqueryFormPluginSimple")
public class JqueryFormPluginSimpleController {
private static final Logger log = LoggerFactory.getLogger(JqueryFormPluginSimpleController.class);
/**
* 在前台的访问路径为: http://localhost:8080/springmvc/jqueryFormPluginSimple/list
* @param person
* @param model
* @return
*/
@RequestMapping("/list")
@OpLogger(id = "18611112222", type=OpType.SEARCH)
public String listPerson() {
return "json/jqueryFormPluginSimple";
}
/**
* 请求接收的是一个Java类
* @param person
* @return
*/
@ResponseBody
@OpLogger(id = "18633334444", type=OpType.SEARCH)
@RequestMapping(value="/getForm", method=RequestMethod.POST)
public BaseJsonRst<List<Person>> getForm(Person person, @RequestParam("currentPage") int currentPage){
log.info("\r\nid: "+person.getId()+", name: "+person.getName()+", currentPage: "+currentPage);
BaseJsonRst<List<Person>> ret = new BaseJsonRst<List<Person>>();
List<Person> list = CreatMockData.createPersonList(20,currentPage);
ret.setResult(list);
ret.setTotalCounts(250);
ret.setCurrentPage(person.getCurrentPage());
ret.setSuccess(true);
/**
* 如果抛出异常,刚可以被日志捕获到,但如果是try catch的话,就不得调到public void doAfter(JoinPoint joinPoint, Exception e) 方法了
*/
//throw Exception("error happen!");
return ret;
}
private Exception Exception(String string) {
// TODO Auto-generated method stub
return null;
}
public static void main(String[] args){
int a = (int)Math.ceil(1.002);
System.out.println(a);
}
}
分享到:
相关推荐
本项目“Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源”正是针对这一需求提供的一种解决方案。下面将详细介绍这个项目中的关键技术点和实现原理。 首先,Spring框架是Java企业级应用开发的核心...
在这个场景中,我们将讨论如何利用AOP来实现Controller的日志管理,以捕获并记录应用程序中的异常。 首先,我们需要了解Spring AOP的基础概念。AOP允许我们定义“切面”,这些切面是关注点的模块化,如日志记录。切...
SpringMVC自定义注解与AOP实现日志记录的方法 在本文中,我们将探讨如何使用SpringMVC自定义注解与AOP(Aspect-Oriented Programming)来实现日志记录的方法。该方法可以在项目中记录业务操作的日志,并提取关键...
本资源包含的是关于`SpringMVC`、`Log4j2`、`Logback`以及`Jackson`的日志脱敏实现源码,提供了多种实现方式,旨在帮助开发者在保障信息安全的同时,充分利用日志进行系统分析。 1. **基于正则表达式的日志脱敏实现...
接下来,我们讨论"AOP和自定义注解"。AOP的核心思想是将那些分散在多个类中的横切关注点(如日志、事务管理、安全检查等)抽取出来,形成独立的模块,这样可以降低代码的耦合度,提高可维护性。在Spring中,我们可以...
这个项目旨在帮助开发者理解如何通过注解来配置和实现AOP,以便进行日志记录、事务管理或其他跨功能的需求。下面我们将详细探讨SpringMVC与AOP的结合以及其核心概念。 AOP是一种编程范式,允许我们定义关注点(如...
本项目"Spring MVC AOP通过注解方式拦截Controller等实现日志管理demo版本2"是基于注解的AOP实践,旨在帮助开发者了解如何利用AOP来记录应用程序中的关键操作日志。以下是关于这个主题的详细解释: 1. **Spring AOP...
在代码实现上,我们需要创建自定义的切面类,继承自Spring的AspectJExpressionPointcutAdvisor或实现MethodBeforeAdvice接口,然后在Controller方法中使用@Autowired注解注入需要记录日志的服务。 总结来说,本项目...
- **拦截器(Interceptor)**:自定义拦截器可以实现全局的功能,比如权限验证、日志记录、性能统计等。通过实现HandlerInterceptor接口并将其注册到SpringMVC配置中,即可在请求处理前后执行自定义逻辑。 - **...
5. **Interceptor**: 拦截器允许在请求处理前后进行预处理和后处理,例如权限验证、日志记录等。 6. **ModelAndView**: 用于将模型数据和视图名称一起返回给DispatcherServlet。 **Hibernate框架** Hibernate是一个...
AOP是Spring框架的核心特性之一,它允许我们将关注点(如日志、事务管理、安全检查等)从主业务逻辑中分离出来,实现代码的解耦。Spring AOP主要通过两种方式实现: 1. 声明式AOP:基于注解的AOP,通过在方法上添加...
注解的学习主要在于理解不同注解的作用,例如@Controller、@Service、@Autowired等,并掌握如何自定义注解和使用元注解。 最后,学习拦截器,你需要知道如何注册拦截器,实现拦截器的preHandle、postHandle和...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、性能监控等,并将它们模块化为可重用的组件,称为切面。本实例主要探讨如何在Spring AOP中实现拦截器。 ...
9. **AOP(面向切面编程)**:SpringMVC与Spring AOP紧密集成,可以方便地实现事务管理、日志记录等功能,提高代码的可维护性和可复用性。 10. **RESTful风格**:SpringMVC支持创建RESTful API,通过@...
SpringMVC 可以结合 Spring 的 AOP(面向切面编程)来实现全局行为,如日志记录、权限控制等。另外,`HandlerInterceptor` 实现类可以自定义拦截器,对请求处理流程进行扩展。 综上所述,SpringMVC 提供了一个强大...
8. **AOP(面向切面编程)**:SpringMVC利用Spring的AOP功能实现拦截器(Interceptor),可以在请求处理前后执行自定义逻辑,如日志记录、权限检查等。 9. **异常处理**:SpringMVC提供了一套优雅的异常处理机制,...
本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...
8. **AOP(面向切面编程)**:SpringMVC利用AOP进行事务管理和日志记录等,使得这些跨切面的职责可以与核心业务逻辑分离。 9. **IoC(控制反转)**:SpringMVC使用IoC容器管理对象及其依赖关系,允许在运行时注入...