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 ...
随机推荐
- react native进一步学习(NavigatorIOS 学习)
特别申明:本人代码不作为任何商业的用途,只是个人学习的一些心得,为了使得后来的更多的程序员少走一些弯路.*(如若侵犯你的版权还望见谅)*. 开发工具:WebStorm,xcode 1. rn的创建的时 ...
- C/C++中的预编译指令(转)
reference:https://blog.csdn.net/sunshinewave/article/details/51020421 程序的编译过程可以分为预处理.编译.汇编三部分,其中预处理是 ...
- 将float数据类型转换为str
示例程序: #include <stdio.h> . . void UART_send_byte(char dat); void UART_send_string(unsigned cha ...
- linux安装mysql(shell一键安装)
1. 相关文件(install_mysql.sh.my.cnf.mysqld相关内容在文中最后面) 2. 将上面的文件上传到linux服务器某一目录下 3.给install_mysql.sh赋执行权限 ...
- Spring 发送内嵌图片的邮件 遇到的问题
问题1:spring 发送带图片的html格式的邮件? 解决方法1:直接在发送内容里面添加 <img src="http://www.rgagnon.com/images/jht.gi ...
- NGINX 502错误排查(转)
一.NGINX 502错误排查 NGINX 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多.将网上找到的一些和502 Bad Gateway错误有关 ...
- 专业的“python爬虫工程师”需要学习哪些知识?
学到哪种程度 暂且把目标定位初级爬虫工程师,简单列一下吧: (必要部分) 熟悉多线程编程.网络编程.HTTP协议相关 开发过完整爬虫项目(最好有全站爬虫经验,这个下面会说到) 反爬相关,cookie. ...
- pytest自动化2:测试用例setup和teardown
前言: pytest支持函数和类两种用例方式,针对每种情况都有不同的代码 pytest用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(s ...
- CSS&JS小结
回顾:html: 作用:展示 文件标签: <html> <head> <title></title> </head> <body> ...
- Spark笔记
Spark基础 第一节:什么是Spark?Spark的特点和结构 1.什么是Spark? Spark是一个针对大规模数据处理的快速通用引擎. 类似MapReduce,都进行数据的处理 2.Spark的 ...