javascript
spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构
spring aop 注釋
下一篇文章將演示如何使用Spring AOP和注釋編寫簡(jiǎn)單的審計(jì)。 審核機(jī)制將是干凈,高效且易于維護(hù)的(和Kewwl!)。
我將在用戶管理系統(tǒng)上演示我的示例(假設(shè)您具有反射和AOP的一般知識(shí))。
我們從簡(jiǎn)單的數(shù)據(jù)庫表開始,以保??存我們的審計(jì)數(shù)據(jù):
我們需要填充4個(gè)主要字段(用戶名,用戶類型,操作,目標(biāo)用戶)
*用戶名–執(zhí)行操作的用戶
* TargetUser –執(zhí)行操作的目標(biāo)用戶。
現(xiàn)在,讓我們創(chuàng)建新的注釋來標(biāo)記我們的“想被審計(jì)”方法。 我們將非常“有創(chuàng)意”并使用:@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從方法參數(shù)中收集一些審核數(shù)據(jù)。 在我們的情況下,將收集目標(biāo)用戶名和actionType作為我們的審核信息。
為此,我創(chuàng)建了另一個(gè)注釋AuditingTargetUsername :
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface AuditingTargetUsername { String value() default ""; }因此,在UserDTO內(nèi)部,我們得到了:
public abstract class UserDTO implements Serializable {@NotNull@AuditingTargetUsernameprivate String userName;...}我們用@AuditingTargetUsername注釋了userName。 該信息將在以后收集。
現(xiàn)在,讓我們創(chuàng)建AOP的方面。 此處收集并執(zhí)行所有審核邏輯(攔截@Auditable方法,從批注中提取信息,使用存儲(chǔ)庫保存最終審核記錄):
@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解釋了主要的代碼區(qū)域:
切入點(diǎn)–所有@ Auditable.annotations
建議–鍵入@After(在方法調(diào)用后我們要審核)
通過帶注釋的方法的聲明檢索ActionType值:
@Auditable( actionType = AuditingActionType.INTERNAL_USER_REGISTRATION )
auditingUsername是執(zhí)行操作的當(dāng)前用戶(在本例中為登錄用戶)。 我通過SecurityContext(Spring Security)檢索到了它。
現(xiàn)在,我們將通過運(yùn)行時(shí)的反射來提取@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上的結(jié)果:
而已。 我們擁有干凈的審核基礎(chǔ)結(jié)構(gòu),您所需要做的就是用@Auditable注釋您的方法,并在DTO /實(shí)體內(nèi)部注釋所需的待審核信息。
伊丹
翻譯自: https://www.javacodegeeks.com/2014/07/auditing-infrastructure-for-your-app-using-spring-aop-custom-annotations-and-reflection.html
spring aop 注釋
總結(jié)
以上是生活随笔為你收集整理的spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑到手之后如何检查电脑拿到手如何
- 下一篇: Spring Boot微服务,Docke