springAop整合自定义注解做方法日志配置(源码在附件)
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 ...
随机推荐
- 命令行运行Android Robotium自动化用例或单元测试用例
本文目录 1.运行所有的测试用例 2.运行单个测试类或某个TestSuite 3.运行某个测试类里面的某个测试方法 4.运行两个不同的测试类或类中的方法 命令行运行Android Robotium自动 ...
- react Hooks
useEffect 1.useEffect是didMount和didUpdate和willUnmount三个函数的集合 2.useEffec(fun):fun会在每次组件render之后执行,而fun ...
- css a的伪类顺序
a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问的链接 */ a:hover {color: #FF00FF ...
- change事件同一文件多次选中
最近在做图片上传的时候,碰到了一点问题,那就是选择内容相同,change事件执行不了 网上搜索了答案,使用off('change')好像也不行 最终找到一种解决办法 使用replaceWith重置in ...
- 了解box-sizing 盒子模型
最近看到别人代码有用到box-sizing属性,自己没用过,记录一下 box-sizing:border-box 指定宽度和高度(最小/最大属性)确定元素边框box 理解:假设宽高为100px,设置了 ...
- tensorFlow入门实践(一)
首先应用TensorFlow完成一个线性回归,了解TensorFlow的数据类型和运行机制. import tensorflow as tf import numpy as np import mat ...
- tomcat web漏洞整改--Apache Tomcat examples directory vulnerabilities
在利用AWVS等弱扫工具对网站进行漏洞扫描时,经常会出现一些Tomcat漏洞问题,一般在弱扫报告中,都会给出简单的处理办法,但有时这些办法可能不太适合我们,或者在一些正式使用的环境中,不好操作,那么我 ...
- java 对同一个文件进行读写操作
同一个文件是不可以进行同时的读写的,因为我们写入文件会覆盖原文件的,如果这样,对于同一文件来来说,文件发生覆盖,无法进行下次读取 当然,对于两个不同的文件,可以一边读一边写的操作 题目:一个文本中存储 ...
- django(channel)到 ubuntu
1.准备工作 删除各app/migrations/下的以数字开头的数据库同步日志文件: 假设你使用的是Pycharm,我们要生成环境包: pip freeze > requirements.tx ...
- 常见问题一之拼接表格 js传递参数变量 Json接收值
1.前台拼接表格时,有时候需要使用拼接html字符串,需要多次循环拼接的,放在方法里边: //ary可以是数组中的一组数据.function(ary){var MyHtml="<tr& ...