第一步:编写自定义注解
@Target({ElementType. METHOD}) @Retention(RetentionPolicy.RUNTIME ) @Documented public @interface JpfLog { String moduleName(); //模块名称 String logType(); //日志类别 String desc() default "无描述信息" ;// }
@Aspect @Component public class LogAspect { @Autowired private JFLogService jFLogService; //标注该方法体为后置通知,当目标方法执行成功后执行该方法体 @AfterReturning("within(com.xxx.*.web..*) && @annotation(rl)") public void insertLogSuccess(JoinPoint jp, JpfLog rl){ String moduleName = rl.moduleName() ; String signature = jp.getSignature().toString(); //获取目标方法签名 String methodName = signature.substring(signature.lastIndexOf("." )+1, signature.indexOf("(")); JFLog jFLog = new JFLog(); jFLog.setId(CodeHelper. createUUID()); jFLog.setModuleName(moduleName); jFLog.setMethodName(methodName); jFLog.setExceptionContent( ""); jFLog.setLogType(rl.logType()); HttpServletRequest request=ContextHolderUtils. getRequest(); String broswer=BrowserUtils. checkBrowse(request); jFLog.setBroswer(broswer); jFLog.setOperateTime( new Date()); jFLog.setUser(ResourceUtil. getSessionUserName()); String ip = oConvertUtils. getIpAddrByRequest(request); //如果访问路径为localhost,则获得的ip值为“0:0:0:0:0:0:0:1” if( "0:0:0:0:0:0:0:1".equals(ip)){ ip = "127.0.0.1"; } jFLog.setIp(ip); jFLog.setFlag(StringConstant. SUCCESS); jFLog.setRemark(rl.desc()); jFLogService.saveLog(jFLog); } //标注该方法体为异常通知,当目标方法出现异常时,执行该方法体 @AfterThrowing(pointcut= "within(com.xxx.*.web..*) && @annotation(rl)", throwing="ex") public void insertLog(JoinPoint jp, JpfLog rl, CRUDException ex){ String moduleName = rl.moduleName() ; String signature = jp.getSignature().toString(); //获取目标方法签名 String methodName = signature.substring(signature.lastIndexOf("." )+1, signature.indexOf("(")); JFLog jFLog = new JFLog(); jFLog.setId(CodeHelper. createUUID()); jFLog.setModuleName(moduleName); jFLog.setMethodName(methodName); jFLog.setExceptionContent(ex.getMessage()); jFLog.setLogType(rl.logType()); HttpServletRequest request=ContextHolderUtils. getRequest(); String broswer=BrowserUtils. checkBrowse(request); jFLog.setBroswer(broswer); jFLog.setOperateTime( new Date()); jFLog.setUser(ResourceUtil. getSessionUserName()); String ip = oConvertUtils. getIpAddrByRequest(request); //如果访问路径为localhost,则获得的ip值为“0:0:0:0:0:0:0:1” if( "0:0:0:0:0:0:0:1".equals(ip)){ ip = "127.0.0.1"; } jFLog.setIp(ip); jFLog.setFlag(StringConstant. ERROR); jFLog.setRemark(rl.desc()); jFLogService.saveLog(jFLog); } }
注:@AfterReturning为注解方法体成功执行后,执行的方法。@AfterThrowing为注解方法体抛出CRUDException 异常时执行的方法。JoinPoint jp参数可以获得注解方法体的相关值,包括类名、方法名、参数等信息。JpfLog rl参数为自定义注解的类,可以获得自定义注解的值。
第三步:Spring mvc配置文件
<!-- 启用@AspectJ支持,从而可以实现通过注解方式将通知编织到非公共方法中 --> <aop:aspectj-autoproxy />
第四步:自定义注解的使用
/** * 保存新增的人员 * @param modelMap * @param user * @return * @throws CRUDException * @throws Exception */ @JpfLog(moduleName="人员",logType=StringConstant. Log_Type_INSERT,desc= "") @RequestMapping(value = "/saveByAdd") public ModelAndView saveUserByAdd(ModelMap modelMap, User user) throws CRUDException { userService.saveUser(user); return new ModelAndView(StringConstant. ACTION_DONE, modelMap); }
相关推荐
总结,Spring MVC结合AOP和自定义注解可以方便地实现日志记录功能,无需侵入业务代码。这种方法具有良好的可扩展性和灵活性,可以轻松适应不同场景的日志需求。同时,通过调整切面的定义,我们可以控制日志记录的...
综上所述,本项目结合了Spring MVC、MyBatis Plus和AOP,构建了一个具备日志记录和存储功能的系统,为开发团队提供了一种有效的监控和分析手段,有助于提升应用的稳定性和可维护性。由于提供了数据库支持,开发者...
通过实现`HandlerInterceptor`接口或继承`AbstractHandlerInterceptor`,我们可以自定义拦截逻辑,比如记录日志、权限检查、性能监控等。在这个实例中,可能使用了拦截器来增强功能或确保安全。 4. **数据库操作**:...
在Spring框架中,自定义注解结合AOP(面向切面编程)是实现业务逻辑与非业务逻辑分离的一种有效方式。通过自定义注解,可以针对不同的业务场景灵活地添加功能,比如权限控制、日志记录、事务管理等。本文将详细讨论...
在Spring MVC中,AOP(面向切面编程)是一种强大的工具,可以让我们在不修改代码的情况下,对程序的特定部分进行增强,例如日志记录、事务管理或性能监控。在这个场景中,我们将讨论如何利用AOP来实现Controller的...
在IT行业中,日志记录是系统监控和故障排查的关键环节,但同时也涉及到用户隐私保护的问题。日志脱敏就是一种确保敏感数据在日志中不被泄露的技术手段。本资源包含的是关于`SpringMVC`、`Log4j2`、`Logback`以及`...
拦截器可以用来实现通用的功能,如登录检查、日志记录、性能监控等。在Spring MVC中,自定义的拦截器需要实现`HandlerInterceptor`接口并注册到`HandlerMapping`。 10. **异常处理**: Spring MVC提供了统一的...
4. **拦截器**:Spring MVC支持自定义拦截器,可以实现登录验证、日志记录等功能。 5. **异常处理**:通过@ControllerAdvice和@ExceptionHandler可以全局处理异常,提供统一的错误页面。 二、MyBatis 框架 1. **...
在Spring MVC中,AOP可以用于在Controller方法执行前后添加拦截器,实现如性能监控、安全检查等功能。 2. **Spring JDBC (Java数据库连接)** `spring-jdbc-3.2.0.RELEASE.jar` 提供了对JDBC的抽象层,简化了数据库...
通过实现HandlerInterceptor接口或者使用自定义注解+@AspectJ实现。 6. **配置**:Spring MVC的配置通常包括Spring的Context配置(如bean定义、依赖注入)和Spring MVC的DispatcherServlet配置(如视图解析器、拦截...
在"spring mvc annotation interceptor"这个主题中,我们将深入探讨如何利用注解来配置和实现Spring MVC的拦截器。 1. **注解驱动的Spring MVC** - `@Controller`: 这个注解标记一个类为处理HTTP请求的控制器。它...
源码中可能会包含自定义的拦截器实现,这些拦截器可以进行权限校验、日志记录、性能监控等预处理或后处理操作。 6. **异常处理**: 通过 `@ExceptionHandler` 或全局异常处理器,你可以定制化错误页面和异常处理...
在Java中,自定义注解通常与Spring MVC的拦截器或AOP(面向切面编程)一起使用,以实现更灵活的控制流。 创建自定义注解包括以下几个关键部分: 1. **注解声明**:自定义注解以`@interface`关键字开头,定义一个...
开发者可以通过实现HandlerInterceptor接口,创建自定义拦截器,实现如权限验证、日志记录等功能。拦截器是比过滤器更高级的概念,因为它可以访问到更多的请求上下文信息。 过滤器(Filter)在Servlet规范中定义,...
在Spring MVC中,MyBatis可以通过Spring的`SqlSessionFactoryBean`和`MyBatisSqlSessionFactoryBean`配置,结合`@Mapper`注解的接口,实现DAO层的简单易用。 5. **Freemarker**: Freemarker是一个模板引擎,用于...
Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、高性能和灵活的Web应用程序。它作为Spring框架的一部分,...此外,持续集成、自动化测试和日志监控也是不可或缺的部分,这些都使得开发流程更加规范和高效。
通过实现HandlerInterceptor接口或者使用Spring MVC提供的预定义拦截器,可以轻松地添加自定义拦截逻辑。 九、上传下载文件 Spring MVC支持文件上传和下载功能。通过MultipartFile接口处理上传的文件,而文件下载则...
通过提供泛型的Repository接口,Spring Data JPA能够自动实现常见的CRUD操作,同时支持自定义查询方法。开发者只需要定义接口,无需编写实现类,极大地提高了开发效率。JPA则是Java EE规范,用于对象关系映射,使得...
- **注解式控制器**是Spring MVC推荐的一种控制器实现方式。 - **主要注解**: - `@Controller`:标记类为控制器。 - `@RequestMapping`:映射请求到处理方法。 - `@RequestParam`:获取请求参数。 - `@...
10. **AOP(面向切面编程)**:Spring MVC可以与Spring的AOP模块结合,实现如日志记录、事务管理等横切关注点。 11. **国际化的支持**:通过消息资源文件和`@MessageSource`,Spring MVC允许应用支持多语言环境。 ...