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.
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.
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;
}
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;
}
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