aop 初探
1、首先是配置文件:
上图是让aop配置正确,不报红;
完整代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:cache="http://www.springframework.org/schema/cache"
- 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
- http://www.springframework.org/schema/cache
- http://www.springframework.org/schema/cache/spring-cache.xsd">
- <description>Spring MVC Configuration</description>
- <!-- 启用spring mvc 注解 -->
- <context:annotation-config/>
- <!-- 设置使用注解的类所在的jar包 -->
- <context:component-scan base-package="com.credi****mony.adapter"></context:component-scan>
- <!-- 完成请求和注解POJO的映射 -->
- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
- <!-- 加载配置属性文件 -->
- <context:property-placeholder ignore-unresolvable="true" location="classpath*:/application.properties"/>
- <context:property-placeholder location="classpath:log4j.properties"/>
- <!-- UTF8解决乱码问题 -->
- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
- <property name="messageConverters">
- <list>
- <bean class="org.springframework.http.converter.StringHttpMessageConverter">
- <property name="supportedMediaTypes">
- <list>
- <value>text/html;charset=UTF-8</value>
- </list>
- </property>
- </bean>
- </list>
- </property>
- </bean>
- <mvc:annotation-driven/>
- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
- <property name="messageConverters">
- <list>
- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
- </list>
- </property>
- </bean>
- <!-- 定义视图文件解析 -->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="${web.view.prefix}"/>
- <property name="suffix" value="${web.view.suffix}"/>
- </bean>
- <!-- 对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理 -->
- <mvc:default-servlet-handler/>
- <!-- 静态资源映射 -->
- <mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>
- <!-- 定义无Controller的path<->view直接映射 -->
- <mvc:view-controller path="/" view-name="redirect:${web.view.index}"/>
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- <property name="exceptionMappings">
- <props>
- <prop key="org.apache.shiro.authz.UnauthorizedException">error/403</prop>
- <prop key="java.lang.Throwable">error/500</prop>
- </props>
- </property>
- </bean>
- <!-- 开启自动切面代理 -->
- <aop:aspectj-autoproxy/>
- </beans>
2、对应的class文件,exection里的表达式要正确:
- package com.creditharmony.adapter.service.baffle;
- import com.creditharmony.common.util.DateUtils;
- import org.apache.ibatis.binding.MapperMethod;
- import org.apache.log4j.Logger;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.*;
- import org.aspectj.lang.reflect.MethodSignature;
- import org.springframework.stereotype.Component;
- import java.util.Date;
- @Aspect
- @Component
- public class InterceptorBaffle {
- private static final Logger logger = Logger.getLogger(InterceptorBaffle.class);
- // 一分钟,即60000ms
- private static final long ONE_MINUTE = 60000;
- // service层的统计耗时切面,类型必须为final String类型的,注解里要使用的变量只能是静态常量类型的
- public static final String POINT = "execution (* com.cred####ony.adapter.service..*.*(..))";
- /**
- * 进入方法后打印日志
- * @param joinPoint
- */
- @Before(POINT)
- public void before(JoinPoint joinPoint) {
- logger.debug(this.getMethodName(joinPoint)+" start "+ DateUtils.formatDateTime(new Date()));
- }
- /**
- * 方法结束打印日志
- * @param joinPoint
- */
- @After(POINT)
- public void after(JoinPoint joinPoint) {
- logger.debug(this.getMethodName(joinPoint)+" after"+ DateUtils.formatDateTime(new Date()));
- }
- /**
- * 统计方法执行耗时Around环绕通知
- * @param joinPoint
- * @return
- */
- @Around(POINT)
- public Object timeAround(ProceedingJoinPoint joinPoint) {
- // 定义返回对象、得到方法需要的参数
- Object obj = null;
- Object[] args = joinPoint.getArgs();
- long startTime = System.currentTimeMillis();
- try {
- obj = joinPoint.proceed(args);
- } catch (Throwable e) {
- logger.error("统计某方法执行耗时环绕通知出错", e);
- }
- // 获取执行的方法名
- long endTime = System.currentTimeMillis();
- MethodSignature signature = (MethodSignature) joinPoint.getSignature();
- String methodName = signature.getDeclaringTypeName() + "." + signature.getName();
- // 打印耗时的信息
- this.printExecTime(methodName, startTime, endTime);
- return obj;
- }
- /**
- * 打印方法执行耗时的信息,如果超过了一定的时间,才打印
- * @param methodName
- * @param startTime
- * @param endTime
- */
- private void printExecTime(String methodName, long startTime, long endTime) {
- long diffTime = endTime - startTime;
- if (diffTime > ONE_MINUTE) {
- logger.warn("-----" + methodName + " 方法执行耗时:" + diffTime + " ms");
- }
- }
- /**
- * 获取方法名(类的详细包路径)
- * @param joinPoint
- * @return
- */
- private String getMethodName(JoinPoint joinPoint){
- return joinPoint.getSignature().getDeclaringTypeName() +
- "." + joinPoint.getSignature().getName();
- }
- }
aop 初探的更多相关文章
- Spring入门(9)-AOP初探
Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...
- spring源码学习之路---AOP初探(六)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...
- spring.net AOP初探
AOP是什么? 面向切面编程,在OO中有一个开放关闭原则,及对修改关闭,对扩展开放.AOP可以说是设计模式的集合加强版,使用代理.工厂.策略等等模式,来实现方法的结合.这样说还比较模糊,我们先往下看. ...
- Spring AOP 初探
本文可作为北京尚学堂spring课程的学习笔记 首先谈谈什么是AOP 它能干什么 AOP Aspect Oriented Programming(面向切面的编程) 什么叫面向切面? 就是我们可以动态的 ...
- 20181122_C#中AOP初探_装饰器模式的AOP_Remoting实现AOP_Castle实现AOP
一. 什么是AOP: a) AOP是面向切面编程; 就像oop一样, 它也是一种编程思想; i. Oop思想→一切皆对象, 对象交互组成功能, 功能叠加组成模块, 模块叠加组 ...
- spring源码学习(一)--AOP初探
LZ以前一直觉得,学习spring源码,起码要把人家的代码整体上通读一遍,现在想想这是很愚蠢的,spring作为一个应用平台,不是那么好研究透彻的,而且也不太可能有人把spring的源码全部清楚的过上 ...
- spring学习(3)
bean的声明周期 为什么把生命周期当做一个重点? Servlet->servlet生命周期 Servlet生命周期分为三个阶段: 1:初始化阶段,调用init()方法 2:响应客户请求阶段,调 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...
随机推荐
- 牛客训练赛25-A-最长区间
https://www.nowcoder.com/acm/contest/158#question 这题问最长的严格连续递增序列的最长长度是多少? 最开始感觉这道题不可做,因为有1e5个点,还有1e5 ...
- 2-Twenty Second Scrum Meeting-20151222
任务安排 成员 今日完成 明日任务 闫昊 服务器关闭,开发停滞…… …… 唐彬 服务器关闭,开发停滞…… …… 史烨轩 服务器关闭,开发停滞…… …… 余帆 路径保存 路径整合 金哉仁 ...
- 数学建模-lingo使用
1.安装启动,软件下载地址:http://pc.xzstatic.com/2017/06/LINGO14 .zip.此为免安装版,打开后双击Lingo11.exe即可启动软件. 2.示例:某商品单位成 ...
- selective search
1.引言:图像的物体识别主要有两个步骤:定位.分类.在分类的过程中,需要对图像中文物体的区域划分出来.传统的方法是利用滑窗,一个窗口一个窗口得选择,将之与目标进行比较,确定物体的位置. 为了降低搜索空 ...
- wuziqi
五子棋结对人崔保雪的博客连接http://www.cnblogs.com/nuoxiaomi/ 题目简介 我们实现了一个五子棋的软件,该软件由初始化模块.下棋操作模块.人机对战模块.人人对 ...
- The Last Reader Response——13-17
Hi, everybody, nice to meet you, this is probably my best and meet you at a time, in the past a seme ...
- [转帖]TMD为你揭秘中国互联网下半场所有秘密
https://www.iyiou.com/p/35099.html 李安说,<比利.林恩的中场战事>是“一个成长的故事”.中国互联网也行至中场,下半场如何走,成长的方向在哪里,成当下关键 ...
- poj 3352 Road Construction(边双连通分量+缩点)
题目链接:http://poj.org/problem?id=3352 这题和poj 3177 一样,参考http://www.cnblogs.com/frog112111/p/3367039.htm ...
- ThreadLocal的使用场景及实现原理
1. 什么是ThreadLocal? 线程局部变量(通常,ThreadLocal变量是private static修饰的,此时ThreadLocal变量相当于成为了线程内部的全局变量) 2. 使用场景 ...
- schema举例二
schema举例二: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs=& ...