package com.aop.log.anno; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)//运行期
@Target({ElementType.METHOD,ElementType.TYPE})//作用于方法上,类上
public @interface Mylog { public String value() default "";//日志信息值 boolean ingore() default false;//是否忽略 }
package com.aop.log.aspect; import com.aop.log.anno.Mylog;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date; @Component
@Aspect
public class LogAspect { private Logger logger= Logger.getLogger(LogAspect.class);
private static final String dateFormat="yyyy-MM-dd HH:mm:ss"; @Pointcut(value = "execution(* com.aop.log.dao.*.*(..))")
public void pointCut1(){} @Around(value = "LogAspect.pointCut1()")
public Object aroundLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { //日志信息
StringBuffer loginfo=new StringBuffer(); //获得方法签名
MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
//获得方法对象
Method method = methodSignature.getMethod();
//获得字节码对象
Class<?> clazz = method.getDeclaringClass();
//获得类上注解
Mylog mylog_anno_clazz = clazz.getAnnotation(Mylog.class);
//获得方法上注解
Mylog mylog_anno_method = method.getAnnotation(Mylog.class);
//方法上参数
Object[] args = proceedingJoinPoint.getArgs();
//判断类上是否有注解
if (mylog_anno_clazz!=null){
if (mylog_anno_clazz.ingore()) {
//忽略日志 直接执行方法
return proceedingJoinPoint.proceed(args);
}
}
//判断方法上是否有注解
if (mylog_anno_method!=null){
if (mylog_anno_method.ingore()){
//忽略日志 直接执行方法
return proceedingJoinPoint.proceed(args);
}
} //拼凑日志信息
String target=clazz.getName()+"##############"+method.getName();//类名+方法名
//参数
StringBuffer params=new StringBuffer();
if (args.length>0){
for (Object arg : args) {
params.append(","+arg.getClass().getName());
}
params.substring(1);
} //日志信息
loginfo.append(target+params);
//获得起始时间
SimpleDateFormat sdf=new SimpleDateFormat(dateFormat);
String start = sdf.format(new Date()); //日志方法 前置通知
logger.error("开始调用"+loginfo+"时间:"+start);
long currentTimeMillis = System.currentTimeMillis();
//方法执行
Object proceed = proceedingJoinPoint.proceed(args);
long currentTimeMillis2 = System.currentTimeMillis();
//方法耗时
long wastetime=((currentTimeMillis2-currentTimeMillis)/1000);
String end = sdf.format(new Date());
logger.error("方法耗时:"+wastetime+"s"+"时间:"+end);
return proceed;
} }
切面日志环绕通知
package com.aop.log.bean; public class User { private int id; private String name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
package com.aop.log.dao; import com.aop.log.bean.User; //@Mylog(value = "user dao log",ingore = true)
//@Mylog(value = "user dao log",ingore = false)
public interface UserDao { //@Mylog(value = "user dao log",ingore = false)
//@Mylog(value = "user dao log",ingore = true)
public void save(User user) throws InterruptedException; public void delete();
public void update();
public void find(); }
package com.aop.log.dao; import com.aop.log.bean.User;
import org.springframework.stereotype.Repository; @Repository("userDaoImpl")
public class UserDaoImpl implements UserDao {
@Override
public void save(User user) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(user);
} @Override
public void delete() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("delete user!!!");
} @Override
public void update() {
System.out.println("update user!!!");
} @Override
public void find() {
System.out.println("find user!!!");
}
}
package com.aop.log.test; import com.aop.log.bean.User;
import com.aop.log.dao.UserDao;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; @RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml" )
public class Test { @Resource(name = "userDaoImpl")
private UserDao userDaoImpl; @org.junit.Test
public void test1() {
User user=new User();
user.setId(1);
user.setName("abc"); //userDaoImpl.save(user);
userDaoImpl.delete(); }
}
springAop整合自定义注解做方法日志配置(源码在附件)的更多相关文章
-
spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
-
SpringAOP的自定义注解实践
springaop属于spring的重要属性,在java中有相当广泛的用途,大家一般都接触过aop实现事务的管理,在xml里配好声明式事务,然后直接在service上直接加上相应注解即可, 今天我们来 ...
-
spring自定义注解拦截器的配置
1.创建注解文件 (文件格式为注解) 这里面什么都不需要写 文件名就是注解名称 如下 是@anno package com.ABC123.anno; import java.lang.annotati ...
-
Spring Boot 自动配置 源码分析
Spring Boot 最大的特点(亮点)就是自动配置 AutoConfiguration 下面,先说一下 @EnableAutoConfiguration ,然后再看源代码,到底自动配置是怎么配置的 ...
-
gorm的日志模块源码解析
gorm的日志模块源码解析 如何让gorm的日志按照我的格式进行输出 这个问题是<如何为gorm日志加traceId>之后,一个群里的朋友问我的.如何让gorm的sql日志不打印到控制台, ...
-
读取xml文件转成List<;T>;对象的两种方法(附源码)
读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...
-
SpringBoot自动配置源码调试
之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...
-
Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)
场景 Winform中实现ZedGraph中曲线右键显示为中文: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100115292 ...
-
SpringBoot Profile使用详解及配置源码解析
在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...
随机推荐
-
C/C++相对论——C++中为什么要使用异常?
C++中为什么要使用异常? 很多人也许知道C++中的异常机制,很多人也许不知道.很多人知道C中常用的assert,也知道在编译时候指定NODEBUG来忽略它. 对于C语言,使用正常的if-else即是 ...
-
D7控件\dw_cd_VirtualTreeview_v4.5.2\Demos\Advanced---TVirtualStringTree用法
VST1: TVirtualStringTree; //按钮公用函数,根据不同 标签tag区分, Screen.Cursor := crHourGlass; //设置屏幕鼠标的形状为crhourGla ...
-
nginx事件模块分析(一)
nginx ngx_events_module模块分析 ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块.nginx在启动时只与events模块打交道,而由even ...
-
javascript中数组Array的方法
一.常用方法(push,pop,unshift,shift,join)push pop栈方法,后进先出var a =[1,2,3];console.log(a.push(40)); //4 返回数组的 ...
-
【CodeForces 577B】Modulo Sum
题 题意 给你n(1 ≤ n ≤ 106)个数a1..an(0 ≤ ai ≤ 109),再给你m( 2 ≤ m ≤ 103)如果n个数的子集的和可以被m整除,则输出YES,否则NO. 分析 分两种情况 ...
-
JS日期时间选择器
本文介绍一种日期和时间选择器的使用方法.此选择器由jqueryUI实现,支持精确到毫秒的时间选择. 此选择器项目地址为http://trentrichardson.com/examples/timep ...
-
Freemarker的使用方法
1. Freemarker概念 1.1 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运 ...
-
ASP.NET控件GridView的使用&; Xml操作注意事项
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6729478.html 文章主要内容 ...
-
[翻译] BezierString
BezierString https://github.com/lvnyk/BezierString Rendering NSAttributedStrings along arbitrary con ...
-
实现多线程的另一种方式-Callable
package com.mldn.thread; import java.util.concurrent.ExecutionException; import java.util.concurrent ...