gpt4 book ai didi

java - 如何使用 spring AOP 而不是代理来记录实际的存储库类名?

转载 作者:搜寻专家 更新时间:2023-10-30 23:01:58 24 4
gpt4 key购买 nike

我正在尝试使用 AOP 记录存储库类名。但是在运行时,我在日志中获取代理类名,因为我在我的项目中使用了 spring 数据,所以有一个用于存储库的接口(interface),它由 spring 动态实现。请提出一个答案,因为我花了很多时间寻找相同的答案。

以下为执行后产生的日志

    className - No of records returned : 38
2017-02-03 19:54:43,360 [INFO] className - Exiting method: getAlertPatterns]
2017-02-03 19:54:43,360 [INFO] className - No of records returned : 38
2017-02-03 19:54:43,360 [INFO] className - Exiting method: getAlertPatterns]
2017-02-03 19:54:43,363 [INFO] controllerClassName - Exiting method: getAlertPatterns]
2017-02-03 19:54:46,457 [INFO] controllerClassName - ActionTakenController***Entering method: getAlertActions]
2017-02-03 19:54:46,458 [INFO] className - ActionTakenServiceImpl****Entering method: getAlertActions]
2017-02-03 19:54:46,458 [INFO] className - $Proxy158****Entering method: getAlertActions]
2017-02-03 19:54:46,510 [INFO] repositoryClassName - java.util.ArrayList***
2017-02-03 19:54:46,511 [INFO] repositoryClassName - No of records returned : 2
2017-02-03 19:54:46,511 [INFO] repositoryClassName - Exiting method: getAlertActions]
2017-02-03 19:54:46,511 [INFO] className - No of records returned : 2
2017-02-03 19:54:46,511 [INFO] className - Exiting method: getAlertActions]
2017-02-03 19:54:46,511 [INFO] className - No of records returned : 2
2017-02-03 19:54:46,512 [INFO] className - Exiting method: getAlertActions]
2017-02-03 19:54:46,512 [INFO] controllerClassName - Exiting method: getAlertActions]
2017-02-03 19:54:50,488 [INFO] controllerClassName - InitialAnalysisController***Entering method: getAlertInitialAnalysis]
2017-02-03 19:54:50,495 [INFO] className - InitialAnalysisServiceImpl****Entering method: getAlertInitialAnalysis]
2017-02-03 19:54:50,505 [INFO] className - $Proxy144****Entering method: getAlertInitialAnalysis]

配置aop类的代码如下

    private Logger logger = LogManager.getLogger("");

/** Pointcut for execution of methods on {@link Service} annotation */
@Pointcut("execution(public * (@org.springframework.web.bind.annotation.RestController com.nscorp.apps.wds.controller..*).*(..))")
public void controllerCalls() {
/** Pointcut for execution of methods on {@link Service} annotation */
}

/** Pointcut for execution of methods on {@link Service} annotation */
@Pointcut("execution(public * (@org.springframework.stereotype.Service com.nscorp.apps.wds.services..*).*(..))")
public void serviceAnnotation() {
/** Pointcut for execution of methods on {@link Service} annotation */
}

/** Pointcut for execution of methods on {@link Repository} annotation */
@Pointcut("execution(public * (@org.springframework.stereotype.Repository com.nscorp.apps.wds.dao..*).*(..))")
public void repositoryAnnotation() {
/** Pointcut for execution of methods on {@link Repository} annotation */
}

/** Pointcut for execution of methods on {@link JpaRepository} interfaces */
@Pointcut("this (org.springframework.data.repository.Repository)")
public void jpaRepository() {
/** Pointcut for execution of methods on {@link JpaRepository} interfaces */
}
/** Pointcut for execution of combined methods serviceAnnotation() and controllerCalls() */
@Pointcut("serviceAnnotation() || jpaRepository() ")
public void performanceMonitor() {
/** Pointcut for execution of combined methods serviceAnnotation() and controllerCalls() */
}

/** Pointcut for execution of combined methods repositoryAnnotation() and jpaRepository()*/
@Pointcut(" jpaRepository() ")
public void jpaTransactionlogs() {
/** Pointcut for execution of combined methods repositoryAnnotation() and jpaRepository()*/
}

@Pointcut(" controllerCalls() ")
public void controllerParamCalls() {
//buisenessCalls
}


@Around("controllerParamCalls()")
public Object controllerClassName(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info(joinPoint.getTarget().getClass().getSimpleName()+"***" +"Entering method: " + joinPoint.getSignature().getName() + "]");

Object[] signatureArgs = joinPoint.getArgs();
for (Object signatureArg: signatureArgs) {
logger.info( "The arguments are ----" + signatureArg);
}


Object obj = joinPoint.proceed();
if (obj instanceof Collection) {
logger.info("No of records returned : " + ((Collection<?>) obj).size());

}
logger.info("Exiting method: " + joinPoint.getSignature().getName() + "]");
return obj;
}

@Around("performanceMonitor()")
public Object className(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info(joinPoint.getTarget().getClass().getSimpleName() +"****" +"Entering method: " + joinPoint.getSignature().getName() + "]");
Object obj = joinPoint.proceed();
if (obj instanceof Collection) {
logger.info("No of records returned : " + ((Collection) obj).size());

}
logger.info("Exiting method: " + joinPoint.getSignature().getName() + "]");
return obj;
}

示例存储库类是

    @Repository
public interface ActionTakenRepository extends CrudRepository<ActionTaken, BigInteger> {

@Query("Select actionTaken from ActionTaken actionTaken where actionTaken.status NOT IN (Select codeId from Codes where codeType='"+CommonConstants.INACTIVE+"') order by auditCreatedAt desc")
List<ActionTaken> getAlertActions();
}

最佳答案

如果我对问题的理解正确,你想拉出这个数组中的接口(interface)

joinPoint.getThis().getClass().getGenericInterfaces();

您可以梳理一下接口(interface)的名称。

关于java - 如何使用 spring AOP 而不是代理来记录实际的存储库类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42026871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com