[JAVA] Synthetisieren Sie Spring-Annotationen, um projektspezifische Stereotypen zu erstellen

Normalerweise kann Java keine Annotationen erben oder synthetisieren, aber Spring-Annotationen sind möglich. Es ist keine komplizierte Vorbereitung erforderlich. Schreiben Sie einfach eine Anmerkung.

Basic

Definieren Sie eine Annotation und fügen Sie diesem Typ die Annotation hinzu, die Sie synthetisieren möchten. Wenn es sich bei den Parametern der ursprünglichen Annotation um eine Konstante handelt, können Sie diese wie gewohnt angeben oder mit "@ AliasFor" die Parameter der neuen Annotation an die synthetisierte Annotation übergeben.

@Retention(RetentionPolicy.RUNTIME) //Machen Sie Anmerkungen zur Laufzeit sichtbar
@Validated
@ModelAttribute(binding = true)
public @interface ValidModel {
  @AliasFor(annotation = ModelAttribute.class, 	attribute = "name")
  String value() default "";
}

Synthetische Annotationen werden überall verwendet, z. B. "@ SpringBootApplication" und "@ GetMapping". Wenn Sie also der Quelle folgen, können Sie herausfinden, wie sie verwendet werden.

Setzen Sie die Transaktion zurück, wenn eine aktivierte Ausnahme auftritt

Standardmäßig hat "@ Transactional" ein erschreckendes Verhalten beim Festschreiben, selbst wenn eine aktivierte Ausnahme ausgelöst wird. Wenn Sie jedoch Ihre eigene Anmerkung definieren, müssen Sie nicht jedes Mal "rollbackFor" hinzufügen.

@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor = Exception.class)
public @interface OurTransactional {
  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}

Lösen Sie eine Ausnahme aus, wenn DAO oder Repository außerhalb der Transaktion aufgerufen wird

Ich denke nicht, dass DAO eine Transaktionsgrenze sein wird, aber Sie können auch überprüfen, ob es sich innerhalb einer Transaktion mit einer Anmerkung befindet, wie unten gezeigt.

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Component
@Transactional(propagation = Propagation.MANDATORY)
public @interface OurDao {
  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}

Machen Sie Controller zu einer Transaktionsgrenze

Eine Annotation, die eine Transaktion mit einem Controller wie der Play 1-Serie schneidet, ist wie folgt.

@Retention(RetentionPolicy.RUNTIME)
@Controller
@RequestMapping
@Transactional
public @interface OurController {
  @AliasFor(annotation = RequestMapping.class, attribute = "path")
  String value() default "";

  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}

Recommended Posts

Synthetisieren Sie Spring-Annotationen, um projektspezifische Stereotypen zu erstellen
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
So erstellen Sie Docker-Compose
Erstellen Sie eine API zum Senden und Empfangen von Json-Daten mit Spring