web-dev-qa-db-fra.com

Comment créer une annotation personnalisée dans Spring Boot?

je travaille sur un projet de printemps et je veux faire des annotations.

J'ai besoin de quelque chose comme la description ci-dessous:

@CustomAnnotation("b")
public int a(int value) {
  return value;
}

public int b(int value) {
  return value + 1 ;
}

--------------------------

Execute :

a(1) // should return '2'  
3
Djamel Kr

Vous pouvez utiliser Aspect. Par exemple, vous avez l'annotation suivante

@Target(METHOD)
@Retention(RUNTIME)
public @interface Delegate {
  String value(); // this is the target method name
}

Ajoutez ensuite le composant aspect dans votre contexte printanier

@Aspect // indicate the component is used for aspect
@Component
public class DelegateAspect {
  @Around(value = "@annotation(anno)", argNames = "jp, anno") // aspect method who have the annotation @Delegate
  public Object handle(ProceedingJoinPoint joinPoint, Delegate delegate) throws Exception {
    Object obj = joinPoint.getThis(); // get the object
    Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); // get the Origin method
    Method target = obj.getClass().getMethod(delegate.value(), method.getParameterTypes()); // get the delegate method
    return target.invoke(obj, joinPoint.getArgs()); // invoke the delegate method
  }
}

Vous pouvez maintenant utiliser @Delegate pour déléguer des méthodes

@Component
public class DelegateBean {

  @Delegate("b")
  public void a(int i) {
    System.out.println("a: " + i);
  }

  public void b(int i) {
    System.out.println("b: " + i);
  }
}

Testons

@Inject
public void init(DelegateBean a) {
  a.a(1);
  a.b(1);
}

La sortie est

b: 1
b: 1
12
Dean Xu