web-dev-qa-db-fra.com

@AspectJ pointcut pour toutes les méthodes à l'intérieur du package

J'ai ce code de travail pour un package spécifique, mais je veux le configurer pour tous contrôleurs, service et dao packages Eg

  • com.abc.xyz.content.controller
  • com.abc.xyz.content.service
  • com.abc.xyz.content.dao
  • com.abc.xyz.category.controller
  • com.abc.xyz.category.service
  • com.abc.xyz.category.dao

etc. . . c'est le package de base de mon projet, quelqu'un peut-il s'il vous plaît aider comment je peux le faire pour qu'il fonctionne pour toutes les classes de mon projet web, y compris les contrôleurs, merci d'avance. . .

package com.abc.xyz.utilities;

import Java.util.Arrays;

import org.Apache.commons.logging.Log;
import org.Apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect
{
    private Log log = LogFactory.getLog(this.getClass());

    @Pointcut("execution(* com.abc.xyz.content.service..*(..))")
    protected void loggingOperation()
    {
    }

    @Before("loggingOperation()")
    @Order(1)
    public void logJoinPoint(JoinPoint joinPoint)
    {
    log.info("Signature declaring type : " + joinPoint.getSignature().getDeclaringTypeName());
    log.info("Signature name : " + joinPoint.getSignature().getName());
    log.info("Arguments : " + Arrays.toString(joinPoint.getArgs()));
    log.info("Target class : " + joinPoint.getTarget().getClass().getName());
    }

    @AfterReturning(pointcut = "loggingOperation()", returning = "result")
    @Order(2)
    public void logAfter(JoinPoint joinPoint, Object result)
    {
    log.info("Exiting from Method :" + joinPoint.getSignature().getName());
    log.info("Return value :" + result);
    }

    @AfterThrowing(pointcut = "execution(* com.abc.xyz.content.service..*(..))", throwing = "e")
    @Order(3)
    public void logAfterThrowing(JoinPoint joinPoint, Throwable e)
    {
    log.error("An exception has been thrown in " + joinPoint.getSignature().getName() + "()");
    log.error("Cause :" + e.getCause());
    }

    @Around("execution(* com.abc.xyz.content.service..*(..))")
    @Order(4)
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable
    {
    log.info("The method " + joinPoint.getSignature().getName() + "() begins with " + Arrays.toString(joinPoint.getArgs()));
    try
    {
        Object result = joinPoint.proceed();
        log.info("The method " + joinPoint.getSignature().getName() + "() ends with " + result);
        return result;
    }
    catch (IllegalArgumentException e)
    {
        log.error("Illegal argument " + Arrays.toString(joinPoint.getArgs()) + " in " + joinPoint.getSignature().getName() + "()");
        throw e;
    }
    }

}
20
Mohan Seth

Que diriez-vous d'une de ces alternatives?

A) Pointcut d'exécution générale avec restrictions de package:

execution(* *(..)) &&
(
    within(com.abc.xyz..controller..*) ||
    within(com.abc.xyz..service..*) ||
    within(com.abc.xyz..dao..*)
)

B) Coupes d'exécution limitées au package:

execution(* com.abc.xyz..controller..*(..)) ||
execution(* com.abc.xyz..service..*(..)) ||
execution(* com.abc.xyz..dao..*(..))

Je préfère le B, soit dit en passant, juste parce qu'il est un peu plus court et plus facile à lire. Comme vous l'avez probablement deviné, le .. la notation signifie "tout paquet ou sous-paquet", tandis que * à la fin de l'expression après .. signifie "n'importe quelle méthode dans n'importe quelle classe".

50
kriegaex

Vous avez juste besoin de changer votre coupe de point en quelque chose comme ceci:

@Pointcut("within(com.abc.*)")

Lectures complémentaires - https://docs.spring.io/spring/docs/2.0.x/reference/aop.html

7
Vimal Bera

Une autre alternative consiste à utiliser

@Pointcut("bean(*Controller)")

Mais le nom de vos beans doit correspondre

1
ryzhman