spring aop 注释

下一篇文章将演示如何使用Spring AOP和注释编写简单的审计。 审核机制将是干净,高效且易于维护的(和Kewwl!)。

我将在用户管理系统上演示我的示例(假设您具有反射和AOP的一般知识)。

我们从简单的数据库表开始,以保​​存我们的审计数据:

`id`,`username``user_type``action``target_user``date``user_ip`

我们需要填充4个主要字段(用户名,用户类型,操作,目标用户)

*用户名–执行操作的用户

* TargetUser –执行操作的目标用户。

现在,让我们创建新的注释来标记我们的“想被审计”方法。 我们将非常“有创意”并使用:@AuditAble

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Auditable {
AuditingActionType actionType();
}

带注释的@AuditAble方法示例:

@Override@Transactional@Auditable(actionType = AuditingActionType.INTERNAL_USER_REGISTRATION)public void createInternalUser(UserDTO userDTO) {userCreationService.createInternalUserOnDB(userDTO);}

我们未来的Aspect(aop)将使用DTO从方法参数中收集一些审核数据。 在我们的情况下,将收集目标用户名和actionType作为我们的审核信息。

为此,我创建了另一个注释AuditingTargetUsername

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface AuditingTargetUsername {
String value() default "";
}

因此,在UserDTO内部,我们得到了:

public abstract class UserDTO implements Serializable {@NotNull@AuditingTargetUsernameprivate String userName;...}

我们用@AuditingTargetUsername注释了userName。 该信息将在以后收集。

现在,让我们创建AOP的方面。 此处收集并执行所有审核逻辑(拦截@Auditable方法,从批注中提取信息,使用存储库保存最终审核记录):

@Aspect
public class AuditingAspect {....@After("@annotation(auditable)")@Transactionalpublic void logAuditActivity(JoinPoint jp, Auditable auditable) {String targetAuditingUser;String actionType = auditable.actionType().getDescription();String auditingUsername = Authentication auth = SecurityContextHolder.getContext().getAuthentication().getName()role = userService.getCurrentUser(false).getPermissionsList().toString();auditingUsernameIp = request.getRemoteAddr();}logger.info("Auditing information. auditingUsername=" + auditingUsername + ", actionType=" + actionType + ", role=" + role + ", targetAuditingUser="+ targetAuditingUser + " auditingUsernameIp=" + auditingUsernameIp);auditingRepository.save(new AuditingEntity(auditingUsername, role, actionType, targetAuditingUser, auditingUsernameIp,new Timestamp(new java.util.Date().getTime())));}

ill解释了主要的代码区域:

切入点–所有@ Auditable.annotations
建议–键入@After(在方法调用后我们要审核)

通过带注释的方法的声明检索ActionType值:

@Auditable( actionType = AuditingActionType.INTERNAL_USER_REGISTRATION

auditingUsername是执行操作的当前用户(在本例中为登录用户)。 我通过SecurityContext(Spring Security)检索到了它。

现在,我们将通过运行时的反射来提取@targetAuditingUser字段:

targetAuditingUser = extractTargetAuditingUser(jp.getArgs());
...public String extractTargetAuditingUserFromAnnotation(Object obj) {
...result = getTargetAuditingUserViaAnnotation(obj);...}

这就是通过反射提取带注释的字段的逻辑:

private String getTargetAuditingUserViaAnnotation(Object obj) {
class cl=obj.getClass()String result = null;try {for (Field f : cl.getDeclaredFields())for (Annotation a : f.getAnnotations()) {if (a.annotationType() == AuditingTargetUsername.class) {f.setAccessible(true);Field annotatedFieldName = cl.getDeclaredField(f.getName());annotatedFieldName.setAccessible(true);String annotatedFieldVal = (String) annotatedFieldName.get(obj);logger.debug("Found auditing annotation. type=" + a.annotationType() + " value=" + annotatedFieldVal.toString());result = annotatedFieldVal;}}} catch (Exception e) {logger.error("Error extracting auditing annotations from obj" + obj.getClass());}return result;}

DB上的结果:

而已。 我们拥有干净的审核基础结构,您所需要做的就是用@Auditable注释您的方法,并在DTO /实体内部注释所需的待审核信息。

伊丹

翻译自: https://www.javacodegeeks.com/2014/07/auditing-infrastructure-for-your-app-using-spring-aop-custom-annotations-and-reflection.html

spring aop 注释

spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构相关推荐

  1. python aop编程_学习笔记: AOP面向切面编程和C#多种实现

    AOP:面向切面编程   编程思想 OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统 类--砖头     系统--房子 类--细胞     系统--人 面向对象是非常适合做大型 ...

  2. spring mysql 注解_【Spring】SpringMVC之基于注解的实现SpringMVC+MySQL

    目录结构: contents structure [-] SpringMVC是什么 MVC的全称是Model View Controller,通过实现MVC框架可以很好的数据.视图.业务逻辑进行分离. ...

  3. spring生命周期_理解Spring应用上下文生命周期

    Spring应用上下文启动准备阶段 `BeanFactory`创建阶段 `BeanFactory`准备阶段 `BeanFactory`后置处理阶段 `AnnotationConfigServletWe ...

  4. spring boot测试_测试Spring Boot有条件的合理方式

    spring boot测试 如果您或多或少有经验的Spring Boot用户,那么很幸运,在某些时候您可能需要遇到必须有条件地注入特定bean或配置的情况 . 它的机制是很好理解的 ,但有时这样的测试 ...

  5. spring 事务 会话_测试Spring的“会话”范围

    spring 事务 会话 在基于Spring的Web应用程序中,bean的作用域可以是用户"会话". 从本质上讲,这意味着对会话范围Bean的状态更改仅在用户会话范围内可见. 本条 ...

  6. java spring 条件注解_【Spring】Spring高级话题-条件注解-@Condition

    进行本示例的演示,需要先配置好Maven和Spring哦. 见: [Spring]基于IntelliJ IDEA搭建Maven 分析 通过profile,我们可以获得不同的profile,我们可以获得 ...

  7. java如何快速取消注释_关于Java:Eclipse注释/取消注释快捷方式?

    我认为这很容易实现,但是到目前为止,我还没有在Java class editor和jsf faceted webapp XHTML file editor上找到注释/取消注释快捷方式的解决方案: 快速 ...

  8. spring aop实践_使用Spring AOP实现活动记录模式

    spring aop实践 在课堂设计过程中,我们应就每个班级的职责分配做出决定. 如果我们选择的不错,系统将更易于理解,维护和扩展. 我们几乎所有的项目都有一个持久层,即关系数据库,文档存储或仅XML ...

  9. spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序

    spring boot注释 1.简介 在以前的文章中,我们学习了如何使用Spring JMS配置项目. 如果查看有关使用Spring JMS进行消息传递的文章介绍 ,您会注意到它是使用XML配置的. ...

最新文章

  1. ubuntu 为用户添加组
  2. 中科微研携手-农业大健康·李喜贵:从玉农业谋定功能性农业
  3. qhfl-5 redis 简单操作
  4. 刷新存储器的容量单位是什么_GD25Q80CSIG|相变存储器是什么,具备什么特点?
  5. linux防火墙常用缩写,Linux iptables常用防火墙规则
  6. java io类库,Java利用io类库对各种文件的操作详解
  7. centos写mysql光标移到上一行_mysql:一条SQL更新语句(update)是如何执行的
  8. linux下搜狗安装目录,Linux安装搜狗输入法
  9. php中的class的用法,PHP get_class_vars() 函数用法及示例
  10. HTTP协议探究(一):缓存
  11. 计算机监控网络运维合同书,网络服务托管运维合同范本
  12. 接口测试之Postman使用全图文指南(原来使用Postman测试API接口如此简单)
  13. SpringCloud服务器服务注册在Euraka上,访问IP地址问题
  14. 深入理解Linux内核通知链(Notifier)
  15. 聚类分析在用户行为中的实例_聚类分析的简单案例
  16. python常用的量化金融库
  17. 谷歌SEO排名受哪些因素的影响?(二)
  18. 大数据课程综合实验案例:网站用户行为分析
  19. zip格式文件伪加密
  20. 数据透视表与mysql_通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)...

热门文章

  1. ssl初一组周六模拟赛【2018.5.12】(期中)
  2. 【2018.3.17】模拟赛之三-ssl1863jzoj1367 俄罗斯方块【模拟】
  3. 【2018.3.17】模拟赛之二-ssl1862jzoj1366 删数【区间dp】
  4. SpringBoot使用日志
  5. Java中的事务——全局事务与本地事务
  6. JavaFX UI控件教程(二十)之HTML Editor
  7. 使用JDBCTemplate实现与Spring结合,方法公用 ——Spring配置(applicationContext.xml)
  8. Android音频处理 PCM格式
  9. Google浏览器截长图 不需要借助任何插件!!!
  10. php 正则获取html标签,php正则取嵌套html标签