前提条件:
除了spring相关jar包外,还需要引入aspectj包。
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.7.2</version> </dependency>
要实现此功能,必须完成以下几步:
1.在springmvc-servlet.xml中实现对AOP的支持
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <aop:aspectj-autoproxy proxy-target-class="true"/> <bean class="com.yusj.interceptor.LogAspect" /> . . . . </beans>
2.注解的方法实现Aspect
package com.yusj.core.interceptor; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.google.gson.Gson; /** * * @ClassName: LogAspect * @Description: 日志记录AOP实现 * @author shaojian.yu * @date 2014年11月3日 下午1:51:59 * */ @Aspect public class LogAspect { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private String requestPath = null ; // 请求地址 private String userName = null ; // 用户名 private Map<?,?> inputParamMap = null ; // 传入参数 private Map<String, Object> outputParamMap = null; // 存放输出结果 private long startTimeMillis = 0; // 开始时间 private long endTimeMillis = 0; // 结束时间 /** * * @Title:doBeforeInServiceLayer * @Description: 方法调用前触发 * 记录开始时间 * @author shaojian.yu * @date 2014年11月2日 下午4:45:53 * @param joinPoint */ @Before("execution(* com.yusj.controller..*.*(..))") public void doBeforeInServiceLayer(JoinPoint joinPoint) { startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间 } /** * * @Title:doAfterInServiceLayer * @Description: 方法调用后触发 * 记录结束时间 * @author shaojian.yu * @date 2014年11月2日 下午4:46:21 * @param joinPoint */ @After("execution(* com.yusj.controller..*.*(..))") public void doAfterInServiceLayer(JoinPoint joinPoint) { endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间 this.printOptLog(); } /** * * @Title:doAround * @Description: 环绕触发 * @author shaojian.yu * @date 2014年11月3日 下午1:58:45 * @param pjp * @return * @throws Throwable */ @Around("execution(* com.yusj.controller..*.*(..))") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { /** * 1.获取request信息 * 2.根据request获取session * 3.从session中取出登录用户信息 */ RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes)ra; HttpServletRequest request = sra.getRequest(); // 从session中获取用户信息 String loginInfo = (String) session.getAttribute("username"); if(loginInfo != null && !"".equals(loginInfo)){ userName = operLoginModel.getLogin_Name(); }else{ userName = "用户未登录" ; } // 获取输入参数 inputParamMap = request.getParameterMap(); // 获取请求地址 requestPath = request.getRequestURI(); // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行 outputParamMap = new HashMap<String, Object>(); Object result = pjp.proceed();// result的值就是被拦截方法的返回值 outputParamMap.put("result", result); return result; } /** * * @Title:printOptLog * @Description: 输出日志 * @author shaojian.yu * @date 2014年11月2日 下午4:47:09 */ private void printOptLog() { Gson gson = new Gson(); // 需要用到google的gson解析包 String optTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTimeMillis); logger.info("\n user:"+userName +" url:"+requestPath+"; op_time:" + optTime + " pro_time:" + (endTimeMillis - startTimeMillis) + "ms ;" +" param:"+gson.toJson(inputParamMap)+";"+"\n result:"+gson.toJson(outputParamMap)); } }
相关推荐
5. **单例模式(Singleton)**:Spring AOP中的`SingletonTargetSource`保证了每个目标对象只被创建一次,实现了单例模式,确保在整个应用程序中只有一个共享的实例存在,提高了资源利用效率。 6. **适配器模式...
【标题】"spring-aop.rar_java aop_spring aop" 涉及的主要知识点是Spring框架中的面向切面编程(AOP)以及Java基础知识。这个压缩包可能包含了一个...同时,提供的测试类可以帮助理解每个组件的工作原理和使用方法。
Spring AOP是Spring框架中处理AOP的一种实现,它允许你通过在Spring的配置文件中使用<aop:config>元素来配置切面、通知以及切点。Spring AOP使用代理模式和动态代理技术来拦截方法调用,根据切点表达式匹配的方法会...
本教程将详细讲解如何在SSH框架中利用Spring AOP实现日志记录,并结合ThreadLocal存储用户和请求信息。 首先,理解AOP的基本概念。AOP允许我们定义“切面”,这些切面可以包含方法拦截器,这些拦截器在目标方法执行...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、安全性等。本示例"Spring-AOP demo"旨在展示如何在Java四层架构(表示层、...
为了实现日志的拦截和统一输出,日志组件需要集成到每个微服务中。这通常通过AOP(面向切面编程)来实现,比如使用Spring AOP的切面来拦截方法的调用,然后在进入和离开方法时记录日志。在方法的入口,记录请求参数...
- SpringAOP:这个例子将演示如何在Spring中实现AOP。可能包含了一些切面、通知和切入点的定义,以及如何将它们应用到目标对象上。这将帮助你理解AOP的工作原理以及如何在实际项目中使用。 通过这三个例子,你可以...
- **Mapper接口**:MyBatis允许创建Mapper接口,每个方法对应一个SQL语句,通过Mapper XML文件定义SQL和结果映射。 - **一对一映射**:项目名中的"OneForOne"可能指的是一对一关联映射,MyBatis提供了`...
我们将详细探讨在"springaop-demo01"中实现的注解AOP以及"SSM-MybatisOneForOne-demo01"中的MyBatis一对一映射。 首先,让我们深入了解一下注解AOP在"springaop-demo01"中的应用。AOP(面向切面编程)是Spring框架...
在开发过程中,通过编写JUnit测试用例,可以对代码进行自动化测试,确保每个独立的代码单元都能正常工作。这有助于提高代码质量和稳定性。 4. **AOP(面向切面编程)**:Spring 提供了AOP支持,使得开发者可以将...
在这个项目中,我们利用自定义的Aop注解来实现数据源的动态切换。自定义注解可以附加在方法上,当该方法被调用时,AOP会捕获这个调用并执行相应的逻辑,即切换到指定的数据源。 具体实现步骤如下: 1. 定义数据源...
- 缓存雪崩:确保每个缓存都有过期时间,避免大量缓存同时失效导致的数据库压力骤增。 在实际应用中,`student-web`可能是一个包含学生管理功能的Web应用,使用Spring AOP和Memcached可以高效地缓存学生的查询结果...
本资源包含Spring IOC和AOP的实现代码,使得开发者可以深入理解其内部原理,便于调试和学习。 **Spring IOC(Inversion of Control)** IOC,即控制反转,是一种设计模式,它将对象的创建和管理交给专门的容器来...
- **权限校验**:在方法调用前进行权限验证,避免在每个业务方法中重复代码。 **6. Struts与Hibernate的整合** Struts作为MVC框架负责处理用户请求,Hibernate则用于持久化数据。SSH整合中,通常通过Struts的...
3. **作用域问题**:在非单例bean上使用AOP可能导致意外的结果,因为每个请求都会创建一个新的bean实例,从而忽视了AOP代理。 4. **通知顺序**:当有多个通知应用于同一个切点时,它们的执行顺序可能不符合预期。...
以事务管理为例,假设我们在处理多个数据操作的方法中都需要进行事务控制,传统的做法是在每个方法中手动开启和提交事务,但如果使用Spring的AOP,我们只需在服务层接口或实现类的方法上添加`@Transactional`注解,...
例如,可能会有一个`@Before`通知在每个服务方法执行前记录请求信息,一个`@AfterReturning`通知收集方法执行时间以进行性能分析,以及一个`@Transactional`注解确保所有数据库操作都在一个事务中完成。 通过这样的...
AopLogAopLog是基于SpringAop和ThreadLocal实现的一个对请求方法埋点记录与处理的日志工具包。设计目的和场景:使用Spring Aop拦截程序,基本上都是同一个小异,不想日后每个项目都柏林都写一份这样的Aop拦截处理...
在AOP中,权限控制可以通过定义切入点(pointcut)来实现,即在特定方法执行前后插入权限检查的逻辑,而无需在每个涉及权限的方法内部重复编写代码。 在J2EE应用程序开发中,AOP的拦截能力尤为关键。通过拦截器,...
3. 配置`web.xml`:将`GetContextFilter`配置为全局过滤器,使用通配符`*`匹配所有URL,确保每个请求都会经过该过滤器。 ```xml <filter-name>sessionFilter <filter-class>...