spring 中使用@aspect 控制自定义注解

1.定义系统日志注解类

@target(elementtype.method)

@retention(retentionpolicy.runtime)

@documented

public @interface syslog {

string value() default "";

}

2.定义切面处理类

package com.kxs.common.aspect;

import com.google.gson.gson;

import com.kxs.common.annotation.syslog;

import com.kxs.common.utils.httpcontextutils;

import com.kxs.common.utils.iputils;

import com.kxs.modules.sys.entity.syslogentity;

import com.kxs.modules.sys.entity.sysuserentity;

import com.kxs.modules.sys.service.syslogservice;

import org.apache.shiro.securityutils;

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.beans.factory.annotation.autowired;

import org.springframework.stereotype.component;

import javax.servlet.http.httpservletrequest;

import java.lang.reflect.method;

import java.util.date;

/**

* 系统日志,切面处理类

*

* @author

* @email

* @date

*/

@aspect

@component

public class syslogaspect {

@autowired

private syslogservice syslogservice;

@pointcut("@annotation(com.kxs.common.annotation.syslog)")//指向自定义注解路径

public void logpointcut() {

}

/**

* 切面记录系统日志

* @param point

* @return

* @throws throwable

*/

@around("logpointcut()")//

public object around(proceedingjoinpoint point) throws throwable {

long begintime = system.currenttimemillis();

//执行方法

object result = point.proceed();

//执行时长(毫秒)

long time = system.currenttimemillis() - begintime;

//保存日志

savesyslog(point, time);

return result;

}

//保存日志

private void savesyslog(proceedingjoinpoint joinpoint, long time) {

methodsignature signature = (methodsignature) joinpoint.getsignature();

method method = signature.getmethod();

syslogentity syslog = new syslogentity();

syslog syslog = method.getannotation(syslog.class);

if(syslog != null){

//注解上的描述

syslog.setoperation(syslog.value());

}

//请求的方法名

string classname = joinpoint.gettarget().getclass().getname();

string methodname = signature.getname();

syslog.setmethod(classname + "." + methodname + "()");

//请求的参数

object[] args = joinpoint.getargs();

try{

string params = new gson().tojson(args[0]);

syslog.setparams(params);

}catch (exception e){

}

//获取request

httpservletrequest request = httpcontextutils.gethttpservletrequest();

//设置ip地址

syslog.setip(iputils.getipaddr(request));

//用户名

string username = ((sysuserentity) securityutils.getsubject().getprincipal()).getusername();

syslog.setusername(username);

syslog.settime(time);

syslog.setcreatedate(new date());

//保存系统日志

syslogservice.save(syslog);

}

}

补充:为什么添加了@aspect 还要加@component

官方文档中有写:

you may register aspect classes as regular beans in your spring xml configuration, or autodetect them through classpath scanning - just like any other spring-managed bean. however, note that the @aspect annotation is not sufficient for autodetection in the classpath: for that purpose, you need to add a separate @component annotation (or alternatively a custom stereotype annotation that qualifies, as per the rules of spring's component scanner).

翻译:

您可以在spring xml配置中注册aspect类,或者通过类路径扫描自动检测它们,就像任何其他spring管理bean一样。但是,请注意,@aspect注释对于在类路径中自动检测是不够的:为了达到这个目的,您需要添加一个单独的@component注解(或者根据spring的组件扫描器的规则来定义一个定制的原型注解)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持萬仟网。如有错误或未考虑完全的地方,望不吝赐教。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

java aspect调用,在Spring 中使用@Aspect 控制自定义注解的操作相关推荐

  1. 原生java读取properties与spring中@value、@ConfigurationProperties读取配置文件

    原生java读取properties与spring中@value.@ConfigurationProperties读取配置文件 1.properties类 Properties 继承于 Hashtab ...

  2. java为什么引入注解_说说Spring中为何要引入Lookup注解

    前言 我们先探一探官方文档关于Method Injection的章节是怎么说的: In most application scenarios, most beans in the container ...

  3. java day60【 Spring 中的 JdbcTemplate[会用] 、Spring 中的事务控制 、Spring5 的新特性[了解] 】...

    第1章 Spring 中的 JdbcTemplate[会用] 1.1JdbcTemplate 概述 1.2JdbcTemplate 对象的创建 1.3spring 中配置数据源 1.3.1 环境搭建 ...

  4. Spring中的事务控制

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 1.1. 有关事务(Transaction)的 ...

  5. Spring中的IoC(控制反转)和DI(依赖注入)

    一.Spring IoC的基本概念 控制反转(IoC) 是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心. 依赖注入(DI) 是IoC的另外一种说法,只是从不同的角度 ...

  6. Spring中的事务控制学习中

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 事务管理(Transaction Manage ...

  7. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  8. Spring中解决事务以及异步注解失效

    Spring中解决事务以及异步注解失效 一.重现@Transaction失效的场景 有如下业务场景,新增订单后,自动发送短信,下面的代码在同一个类中: @Transaction public void ...

  9. 每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决...

    java程序在主线程中判断各个子线程状态的操作 每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是w ...

  10. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

最新文章

  1. Session——servlet
  2. windows编译MaskRCNN
  3. Live Migrate 操作 - 每天5分钟玩转 OpenStack(42)
  4. 文章目录 | .NET Core on K8s学习之旅 (更新至20200618)
  5. meteor 结合mysql_Meteor集合
  6. mysql8.0.17压缩包安装教程_mysql 8.0.17 解压版安装配置方法图文教程
  7. pycharm 服务器证书错误,pycharm 如何跳出服务器证书不受信任的提示
  8. Oracle 常用函数/语法总结
  9. 浏览器内核以及渲染过程
  10. thermal系列(6)-thermal-engine守护进程
  11. “蔚来杯“2022牛客暑期多校训练营5 Don‘t Starve
  12. iPad app 开发概述
  13. 前端登陆之cookie篇
  14. python中pd series_Python 数据处理(三)——pd.Series
  15. 一个非计算机专业的 软考中级 网络工程师考试之路
  16. Excel删除指定列(VB)
  17. system thread exception not handled
  18. 软件工程笔记:Pos系统的分析与设计案例
  19. 微信小程序生成海报无法保存到相册
  20. 关于破解网络验证的一点心得

热门文章

  1. 超级冷笑话,冷死人不偿命
  2. lol连接服务器失败怎么修复,英雄联盟lol连接服务器失败怎么办?解决方法大全...
  3. ios实现video自动播放
  4. VirtualBox-5.2.44的安装
  5. 如何利用任意波形发生器创建你想要的波形并输出
  6. builder设计模式,写和很好
  7. 弗洛伊德的兔子与乌龟
  8. vue echarts饼状统计
  9. 全球及中国电力行业建设策略与十四五供需战略规划报告2021-2027年
  10. 概率论 —— 泊松分布和指数分布