转载自:http://743389831.iteye.com/blog/1755241
AOP的概念大家应该都知道吧,Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
我们这样理解,AOP就是一个监控者,它在外面看着我们程序运行,同时也可以定一些规则,决定程序运行不运行,也可以在一个方法运行前进行处理,也可以在一个方法后进行一些逻辑处理。
以上是我对AOP一些简单的理解,我们知道他可以在方法前进行处理,方法后进行处理,那我们可以做的时候就很多了,例如我们可以监控一些方法运行的时间,例如我们项目中使用它监控了sql语句的执行时间。请看代码。
- package net.zoneland.test.common.util.aop;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Map;
- import org.aopalliance.intercept.MethodInterceptor;
- import org.aopalliance.intercept.MethodInvocation;
- import org.apache.commons.lang.time.StopWatch;
- import org.apache.log4j.Logger;
- /**
- *用来监控方法的执行时间-- 对应配置文件是spring-method-aop.xml
- * @author wangyong
- * @version $Id: MethodTimeAdvice.java, v 0.1 2012-9-18 下午4:30:32 wangyong Exp $
- */
- public class MethodTimeAdvice implements MethodInterceptor {
- private final static Logger logger = Logger.getLogger("DAL-MONITOR");
- /**
- * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
- */
- public Object invoke(MethodInvocation invocation) throws Throwable {
- //用 commons-lang 提供的 StopWatch 计时,Spring 也提供了一个 StopWatch
- StopWatch clock = new StopWatch();
- clock.start(); //计时开始
- Object result = null;
- //监控的类名
- String className = invocation.getMethod().getDeclaringClass().getSimpleName();
- //监控的方法名
- String methodName = className + "." + invocation.getMethod().getName();
- try {
- //这个是我们监控的bean的执行并返回结果
- result = invocation.proceed();
- } catch (Throwable e) {
- //监控的参数
- Object[] objs = invocation.getArguments();
- logger.error("数据库执行异常,方法名:" + methodName + "参数:" + getString(objs), e);
- throw e;
- }
- clock.stop(); //计时结束
- if (logger.isInfoEnabled()) {
- logger.info("执行时间:" + clock.getTime() + " ms [" + methodName + "]");
- }
- return result;
- }
- /**
- * 这个类主要是用于输出方法的参数
- *
- * @param objs
- * @return
- */
- @SuppressWarnings("unchecked")
- public String getString(Object[] objs) {
- StringBuffer stringBuffer = new StringBuffer();
- for (int i = 0, len = objs.length; i < len; i++) {
- if (objs[i] instanceof String) {
- stringBuffer.append("String类型:" + objs[i].toString());
- } else if (objs[i] instanceof Map) {
- HashMap<String, Object> hashMap = (HashMap<String, Object>) objs[i];
- HashMap<String, Object> map = hashMap;
- HashSet<String> set = (HashSet<String>) map.keySet();
- stringBuffer.append("Map类型");
- for (String str : set) {
- stringBuffer.append(str + "=" + map.get(str));
- }
- } else if (objs[i] instanceof Integer) {
- stringBuffer.append("整数类型:");
- stringBuffer.append(objs[i].toString());
- } else {
- stringBuffer.append(objs[i].toString());
- }
- }
- return stringBuffer.toString();
- }
- }
相对应的配置文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
- "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="methodTimeAdvice" class="net.zoneland.ums.common.dal.aop.MethodTimeAdvice" />
- <!-- 根据 Bean 的名字自动实现代理拦截 -->
- <bean
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="interceptorNames">
- <!-- 我们的监控方法 -->>
- <list>
- <value>methodTimeAdvice</value>
- </list>
- </property>
- <property name="beanNames">
- <list>
- <!-- 添加到其中的 Bean 自动就被代理拦截了 -->
- <value>*Mapper</value>
- </list>
- </property>
- </bean>
- </beans>
这样配置之后我们就可以监控以Mapper结尾的方法了。同时我们可以监控其他的各种方法,只要我们进行相应的配置。
使用这种方式记录日志,下回分享。
相关推荐
使用场景及目标: 在生产环境中,通过巧妙的AOP机制,实现对日志的细致记录和处理。我们的目标是提高日志记录的效率和规范性,为监控和故障排查提供更为轻松便捷的工具。 其他说明: 这一方法极为便捷,不仅简化了...
在本案例中,我们将探讨如何利用 Spring AOP 来创建一个系统操作日志模块。 首先,我们需要理解 AOP 的基本概念。在 Spring 中,切面由两部分组成:通知(Advice)和切点(Pointcut)。通知是实际执行的代码,比如...
代理模式是Spring AOP的基础,它会在运行时为匹配切点的对象创建代理,代理会在方法调用前后执行额外的逻辑。AspectJ注解则提供了更强大的表达能力,可以直接在代码中定义切面,使得切面和业务逻辑更加紧密地结合。 ...
本项目“com-aop-annotation-permission-demo”是一个基于SpringBoot的示例,它巧妙地结合了AOP(面向切面编程)和注解,旨在实现日志记录和请求权限校验的功能。本文将深入探讨该项目中的关键技术点,以期帮助...
Spring TX允许开发者通过@Transactional注解来声明一个方法需要在事务中执行,而具体的事务管理细节则由Spring自动处理。这大大简化了事务管理的复杂性,使得代码更加简洁。 Spring TX的核心接口是...
AOP则允许我们定义横切关注点,如日志记录、事务管理等,这些关注点可以跨越多个类或方法执行,提高了代码的复用性。 接着,Struts作为表现层框架,主要处理HTTP请求和响应,以及视图和控制器的交互。在水电管理...
在这个"超市管理系统示例项目"中,SSH框架被巧妙地运用,尽管项目并未完全完成,但已充分展示了SSH的核心特性。 首先,让我们深入理解SSH框架的各个组成部分: 1. **Struts2**:这是一个基于MVC设计模式的Web应用...
"StudentSystem easy UI struts2+hibernate+spring实现"是一个典型的企业级应用实例,它巧妙地融合了三个流行的技术框架:Struts2、Hibernate和Spring,构建出一个易于使用的用户界面。这个项目的核心目标是提供一个...
3. 模板方法模式:Spring的`JdbcTemplate`和`RestTemplate`等类使用了模板方法模式,定义了操作的基本骨架,而将一些步骤延迟到子类中。 4. 观察者模式:Spring支持事件驱动的编程,通过`ApplicationEvent`和`...
《家庭财务管理系统基于SpringMVC3+Spring3+Mybatis3+EasyUI的实现详解》 在现代家庭生活中,管理财务已经成为一项不可或缺...对于希望学习和了解这些技术在实际项目中应用的开发者来说,这是一个值得研究的优秀案例。
4.3 通知的执行:Spring在代理类中拦截方法调用,执行相应的通知。 五、Spring事务管理 5.1 事务传播行为:定义了在一个事务方法被另一个事务方法调用时,如何处理事务。 5.2 回滚规则:Spring提供了声明式事务...
本项目“JAVA开发车辆管理系统”是一个典型的企业级应用实例,它巧妙地集成了Struts、Hibernate、Spring和Oracle数据库,构建了一个高效、稳定且功能丰富的系统。以下将详细解析这个系统的各个组成部分及其工作原理...
在本项目中,"Java项目:网盘系统设计和实现(java+ssm+jpa)",开发者采用了一系列先进的Java技术和框架来构建一个具有文件上传和分享功能的云存储平台。这个项目的核心目标是创建一个用户友好的、可靠的网络硬盘系统...
在这个“SSH实现的网上书城”项目中,这些技术被巧妙地结合在一起,为用户提供了功能丰富的在线图书购物体验。下面将分别详细介绍这三个组件以及它们在项目中的作用。 1. **Struts2**:Struts2 是一个基于MVC...
在人力资源管理系统中,Spring可能被用来管理对象的生命周期,处理事务,并通过AOP实现跨切面的关注点,如日志记录、安全控制等。 再者,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得...
标题中的"designpattern-demo:springboot学习"表明这是一个关于Spring Boot设计模式的示例项目,主要目的是为了教学或演示如何在Spring Boot应用中使用设计模式。Spring Boot是Java生态系统中的一个流行框架,它简化...
总的来说,"S2SH在线书签"项目是一个实践性极强的学习资源,通过这个项目,开发者不仅可以深化对Spring、Hibernate和Struts2的理解,还能提升在实际项目中运用这些技术的能力。对于想要涉足JavaWeb开发的初学者或是...
在项目中,每个联系人被视为一个实体对象,对应数据库中的一个记录。Hibernate的XML配置文件定义了这些实体类与数据库表的映射关系,而Spring则负责管理Hibernate的SessionFactory,确保在需要时可以创建和关闭...
综合来看,这个基于SSM框架的智能快递分拣系统是一个典型的Java Web项目,它利用现代软件工程的方法,结合具体业务需求,展示了Java编程和企业级框架在实际项目中的应用。对于学习者来说,这是一个很好的实践案例,...
在Java编程语言中,注解(Annotation)是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不必改变代码的行为。注解在软件开发中扮演着重要的角色,尤其是在编译器检查、代码分析、依赖注入、持久化等...