Normalement, Java ne peut pas hériter ou synthétiser les annotations, mais les annotations Spring sont possibles. Aucune préparation compliquée n'est requise, il suffit d'écrire une annotation.
Définissez une annotation et ajoutez l'annotation que vous souhaitez synthétiser à ce type. En ce qui concerne les paramètres de l'annotation d'origine, s'il s'agit d'une constante, vous pouvez la spécifier comme d'habitude, ou vous pouvez utiliser @ AliasFor
pour transmettre les paramètres de la nouvelle annotation à l'annotation synthétisée.
@Retention(RetentionPolicy.RUNTIME) //Rendre les annotations visibles au moment de l'exécution
@Validated
@ModelAttribute(binding = true)
public @interface ValidModel {
@AliasFor(annotation = ModelAttribute.class, attribute = "name")
String value() default "";
}
Les annotations synthétiques sont utilisées partout, telles que @ SpringBootApplication
et @ GetMapping
, donc si vous suivez la source, vous pouvez comprendre comment l'utiliser.
Par défaut, «@ Transactional» a le comportement horrible d'être validé même si une exception vérifiée est levée, mais en définissant votre propre annotation, vous n'avez pas à ajouter «rollbackFor» à chaque fois.
@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor = Exception.class)
public @interface OurTransactional {
@AliasFor(annotation = Transactional.class, attribute = "readOnly")
boolean readOnly() default false;
}
Je ne pense pas que DAO sera une limite de transaction, mais vous pouvez également vérifier si elle se trouve dans une transaction avec une annotation comme indiqué ci-dessous.
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Component
@Transactional(propagation = Propagation.MANDATORY)
public @interface OurDao {
@AliasFor(annotation = Transactional.class, attribute = "readOnly")
boolean readOnly() default false;
}
Une annotation qui coupe une transaction avec un contrôleur comme la série Play 1 est comme ça.
@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