引入项目需要的AOP包
<!--aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.6</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
要在springmvc的配置文件里加入配置文件,并指明切点类的的包,好被自动扫描
<aop:aspectj-autoproxy/>
<context:component-scan base-package="com..util"/>
<aop:aspectj-autoproxy proxy-target-class="true" />
首先编写一个annotation的注解类
import java.lang.annotation.*;
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemControllerLog {
String description() default "";
}
其次在编写用户管理的切点类,记录用户操作的的时间,ip,操作
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Date;
@Aspect
@Component
public class SystemLogAspect {
@Resource
private EwslogDao ewslogDao;
//Controller层切点,也就是上面那个注解的路径
@Pointcut("@annotation(com.util.SystemControllerLog)")
public void controllerAspect() {
}
/**
* 前置通知 用于拦截Controller层记录用户的操作
*
* @param joinPoint 切点
*/
@Before("controllerAspect()")
public void doBefore(JoinPoint joinPoint) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();
//读取session中的用户
User user = (User) session.getAttribute("user");
String name ="";
if(user!=null){
name = user.getUsername();
}else
name = "匿名用户";
//请求的IP
String ip = request.getRemoteAddr();
String description="";
try {
description = getControllerMethodDescription(joinPoint);
} catch (Exception e) {
e.printStackTrace();
}
Ewslog ewslog = new Ewslog();
ewslog.setLoginName(name);
ewslog.setLogDate(new Date());
ewslog.setDescription(description);
ewslog.setIpAddr(ip);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+name);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+description);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ip"+ip);
ewslogDao.save(ewslog);
}
public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String description = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(SystemControllerLog. class).description();
break;
}
}
}
return description;
}
}
在需要记录的切面类上只需要添加一个注解就可以完成aop了。spring真是太强大了。
@RequestMapping("/loginOut")
@SystemControllerLog(description = "用户登出")
public String index(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("user", null);
return "../index";
}
cankao http://blog.csdn.net/qq_24486393/article/details/52201915
相关推荐
总结,Spring MVC结合AOP和自定义注解可以方便地实现日志记录功能,无需侵入业务代码。这种方法具有良好的可扩展性和灵活性,可以轻松适应不同场景的日志需求。同时,通过调整切面的定义,我们可以控制日志记录的...
Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar
Spring AOP 自定义注解方式实现日志管理的实例讲解 在本文中,我们将探讨如何使用 Spring AOP 实现日志管理,并使用自定义注解方式来记录日志信息。这种方式可以灵活地实现日志管理,提高系统的可维护性和可扩展性...
本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring AOP的基本概念。AOP是一种编程范式,它允许我们在不修改代码的情况下,为程序添加额外的功能,如日志记录、事务管理、安全检查等。在...
本篇将深入探讨如何使用Spring AOP来记录操作日志,并通过自定义Aspect和注解实现这一功能。 首先,我们要理解Spring AOP的基本概念。AOP是面向对象编程(OOP)的一种补充,它专注于处理那些横向的、与业务逻辑无关...
在Spring框架中,自定义注解(Annotation)和AOP(面向切面编程)的结合使用,极大地增强了代码的可读性和可维护性。本文将深入探讨如何在Spring中创建自定义注解以及如何在AOP中有效地获取并利用这些注解。 首先,...
2. **Spring AOP实现方式** - **代理模式**:Spring AOP使用两种代理方式,JDK动态代理和CGLIB代理。如果目标类实现了接口,Spring会使用JDK动态代理;如果没有实现接口,Spring会使用CGLIB代理生成子类。 - **JDK...
本篇将深入探讨如何利用Spring AOP来实现鉴权和日志记录。 **二、AOP基础知识** 1. **切面(Aspect)**:AOP的核心概念,它封装了关注点,如日志记录或权限验证。一个切面通常包含一个或多个通知(advice)。 2. ...
可以查看Spring AOP的实现,尤其是`org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator`和`org.springframework.aop.aspectj.AspectJExpressionPointcut`这两个类,它们分别处理了...
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...
总结来说,Spring Boot结合AOP能够有效地实现操作日志的自动化记录,通过自定义注解和切面,我们可以轻松地将日志记录集成到业务代码中,同时还能灵活地调整日志级别和输出方式,满足不同场景的需求。
Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许我们在不修改源代码的情况下,通过在程序运行时动态地插入代码来实现横切关注点,如日志记录、事务管理、性能监控等。在Spring AOP中,日志框架...
本实践项目以"Spring_aop_annotation.zip"为载体,展示了如何利用注解在Spring框架中实现AOP的功能。下面将详细阐述该项目中的关键知识点。 一、Spring AOP概念 AOP是Aspect Oriented Programming的缩写,它是一种...
当然,除了手动编写切面和切入点,Spring还支持基于注解的切点表达式,可以直接在被代理的方法上使用`@Loggable`等自定义注解,然后在切面中解析并处理这些注解,以达到相同的效果。 在实际应用中,我们可能还需要...
Spring AOP是Spring框架的一部分,它允许我们在不修改业务代码的情况下,通过定义“切面”来插入额外的功能,如日志记录、事务管理、性能监控等。AOP的核心概念包括切点(Pointcut)、通知(Advice)和切面(Aspect...
Spring AOP,全称Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它扩展了传统的面向对象编程(OOP),使得开发者能够更好地处理系统中的横切关注点,如日志、事务管理、权限控制等。...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现代码的横切关注点,如日志记录、事务管理、性能监控等。在这个"spring aop API示例"中,我们将深入探讨如何利用Spring AOP的四...
这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP的概念。 AOP,全称Aspect-Oriented Programming,是一种编程范式,旨在将关注点分离,让开发者可以更专注...
在没有自定义注解的情况下,我们可以使用Spring AOP的其他匹配规则,如基于方法名的匹配。例如,我们可以在切面类中定义一个`@After`方法,指定在所有以"index2"结尾的方法执行后执行: ```java @Component @...