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整合自定义注解做方法日志配置(源码在附件)的更多相关文章

  1. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  2. SpringAOP的自定义注解实践

    springaop属于spring的重要属性,在java中有相当广泛的用途,大家一般都接触过aop实现事务的管理,在xml里配好声明式事务,然后直接在service上直接加上相应注解即可, 今天我们来 ...

  3. spring自定义注解拦截器的配置

    1.创建注解文件 (文件格式为注解) 这里面什么都不需要写 文件名就是注解名称 如下 是@anno package com.ABC123.anno; import java.lang.annotati ...

  4. Spring Boot 自动配置 源码分析

    Spring Boot 最大的特点(亮点)就是自动配置 AutoConfiguration 下面,先说一下 @EnableAutoConfiguration ,然后再看源代码,到底自动配置是怎么配置的 ...

  5. gorm的日志模块源码解析

    gorm的日志模块源码解析 如何让gorm的日志按照我的格式进行输出 这个问题是<如何为gorm日志加traceId>之后,一个群里的朋友问我的.如何让gorm的sql日志不打印到控制台, ...

  6. 读取xml文件转成List<T>对象的两种方法(附源码)

    读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...

  7. SpringBoot自动配置源码调试

    之前对SpringBoot的自动配置原理进行了较为详细的介绍(https://www.cnblogs.com/stm32stm32/p/10560933.html),接下来就对自动配置进行源码调试,探 ...

  8. Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)

    场景 Winform中实现ZedGraph中曲线右键显示为中文: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100115292 ...

  9. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

随机推荐

  1. Double H

    ##Double H Team 1.队员 王熙航211606379(队长) 李冠锐211606364 曾磊鑫211606350 戴俊涵211606359 聂寒冰211606324 杨艺勇2116063 ...

  2. leetcode python 033 旋转数组查找

    ## 假设升序,import random def find(y):    l,m=len(y),0    while l>1:        n=int(l/2)        if y[0] ...

  3. 初学者如何迅速学习web前端开发

    首先告诉你的是,零基础学习开始学习web前端肯定难,web前端的专业程度本身就不简单,学习这事本来就是一件非常煎熬的事情,人都不愿意学习,可是没办法,为了生存掌握一个技能,你必须学,如果你认真的对待, ...

  4. element-ui(或者说Vue的子组件)绑定的方法中传入自定义参数

    比如el-upload中的 :on-success= fn,其实是给组件el-upload传递一个prop,这样写的话fn只能接受upload组件规定的参数,如果想自己传递父组件中的参数比如b,要写成 ...

  5. 原生Ajax--XmlHttpRequest对象和jQuery.ajax()

    Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE) 1.XmlHttpRequest对象介绍 XmlHttpRequest对象的主要 ...

  6. 前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例

    HTML5 动画在Canvas 上得到了充分的发挥,我们 VIP 视频也分享过很多相关的动画特效制作视频,这次给大家带来 6 款超炫酷的HTML5 canvas 动画的 demo,一起来看看吧~ 文内 ...

  7. 通过SSH去连接 github 和bitbucket

    github 和 bitbucket 都是项目托管服务器, 1 创建SSH private key and public key 首先需要安装git命令, 并且请检查是否有ssh 命令. 打开 Git ...

  8. 简单透析cookies,sessionStorage和localStorage

    首先大致说一下 1.sessionStorage是会话层的一种存储方式,当会话关闭或者退出,sessionStorage就会被清除,有效期较短 2.localStorage是浏览器提供的本地存储方式, ...

  9. xss处理

    今天学习了xss,主要记载如下: https://blog.csdn.net/sdauzyh/article/details/74942737

  10. 四:客服端防护HTTP发送请求类

    一.源代码: public class swtDefendOperate{private BackgroundWorker backgroundWorker;//DefendType的值 Verify ...