【问题标题】:Decorate spring boot repository装饰 Spring Boot 存储库
【发布时间】:2017-08-15 09:54:50
【问题描述】:

我正在开发一个应该在本月晚些时候部署的 Spring Boot API。我们为存储库创建了自己的接口,并扩展了 CrudRepository。 Spring Boot 自动装配所有内容。

我想做的是添加更多的日志记录功能,例如LOGGER.info("searched for solution ID")

目前我们的代码如下所示:

@Repository
public interface ProductSolutionRepository extends CrudRepository<ProductSolution, String> {

    public List<ProductSolution> findBySolutionId(@Param("solutionId") int solutionId);

由于 Spring 配置了所有内容,因此并没有真正看到装饰这些函数以添加日志记录功能的方法。有人可以通过向我指出文档、展示一个很好的示例或解释日志装饰器背后的概念来帮助我吗?

【问题讨论】:

标签: spring logging spring-boot


【解决方案1】:

首先,我想为您指出一些多余的代码。

  • 你不需要用@Repository注释存储库,spring boot 可以自动自动装配它。
  • @Param是用@Query写sql的时候用的,这里只需要声明参数即可。

存储库是dao 层。通常,您应该为每个存储库创建一个service 并将存储库自动连接到服务中。然后你可以在那里实现事务或写日志。

【讨论】:

    【解决方案2】:

    您可以使用单个文件AOP Logging Aspect 使用AspectJ 跨越存储库接口层和记录方法名称、输入参数和输出。

    为此假设一个 RepositoryLoggingAspect 类,你必须先用 @Aspect 注释它:

    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class RepositoryLoggingAspect {
    //..
    }
    

    然后针对你想要跨越的仓库包创建一个Pointcut:

    @Pointcut("within(package.of.my.repositories..*)")
    public void repositoriesPackagePointcut() {}
    

    最后在 @Around 注释方法中定义日志记录逻辑:

    @Around("repositoriesPackagePointcut()")
    public Object logMyRepos(ProceedingJoinPoint joinPoint) throws Throwable {
      //log method name using: joinPoint.getSignature().getName()
      //log method arguments using: Arrays.toString(joinPoint.getArgs())
      //store and log method output using: Object myResult = joinPoint.proceed();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2021-11-07
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2021-04-16
      • 2016-12-13
      相关资源
      最近更新 更多