1. Personnaliser une annotation
@Target(value = { ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface CacheNullify { boolean value = true; }
2. Implémenter une logique améliorée
@Slf4j @Aspect @Component public class CacheNullifyHandler { @AfterReturning("@annotation(com.xxx.CacheNullify)") public void afterReturning() { log.info("走你"); CacheServiceUtil.delUserInfoCache(); } }
@annotation
: Ce qui suit, c'est vous Pour améliorer le annotation (méthode annotée), vous pouvez écrire directement le nom de l'annotation, mais afin d'éviter les noms en double, écrivez autant que possible le chemin complet@annotation
: 后面跟的是你要增强的注解(所注释的方法), 可以直接写注解名, 但是为了防止重名尽可能写全路径吧
@AfterReturning
: 方法执行完并成功返回则触发
@After
: 方法完毕后触发(包括执行完毕, 或者抛出异常)
3. 使用
在需要增强的方法上加上@CacheNullify注解
先了解切面和自定义注解的基本概念和使用
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
Aspect(切面)
Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point(连接点)
指那些被拦截的点,在spring中这些点指的是方法。
Pointcut(切入点)
表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice(增强/通知)
Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
Introduction(引介)
一种特殊的通知,可以在不修改源码的情况下动态添加一些方法。
Target(目标对象)
织入 Advice 的目标对象.。
Weaving(织入)
将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。
注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MyAnnotation { String value() default""; }
分析上面的注解组成
public:修饰符
访问修饰符必须为public,不写默认为pubic;
@interface:关键字
关键字为@interface;
MyAnnotaion:注解名称
注解名称为自定义注解的名称,例如上面的MyAnnotaion就是注解名称
value:注解类型元素
注解类型元素是注解中内容,根据需要标志参数,例如上面的注解的value;
但仔细分析还包含@开头的四个注解@Target、@Retention、@Inherited、@Documented)这是四个是底层的元注解,注解其他注解的注解
@Target:用于描述注解的使用范围,该注解可以使用在什么地方
Target类型 描述
ElementType.TYPE
应用于类、接口(包括注解类型)、枚举
ElementType.FIELD
应用于属性(包括枚举中的常量)
ElementType.METHOD
应用于方法
ElementType.PARAMETER
应用于方法的形参
ElementType.CONSTRUCTOR
应用于构造函数
ElementType.LOCAL_VARIABLE
应用于局部变量
ElementType.ANNOTATION_TYPE
应用于注解类型
ElementType.PACKAGE
@AfterReturning
: La méthode est exécuté et réussi Déclenché lors du retour
@After
: Déclenché une fois la méthode terminée (y compris l'achèvement de l'exécution ou l'exception levée)Utiliser 3. si nécessaire, ajoutez l'annotation @CacheNullify à la méthode amélioréeUtilisation des aspects et des annotations personnaliséesComprenez d'abord les concepts de base et l'utilisation des aspects et des annotations personnalisées
ElementType.TYPE
S'applique aux classes, interfaces (y compris types d'annotations), énumérationsElementType.FIELD
S'applique aux propriétés (y compris les constantes dans les énumérations)ElementType.METHOD
S'applique à méthodesElementType.PARAMETER
Appliqué aux paramètres de méthodeElementType.CONSTRUCTOR
Appliqué au constructeur ElementType.LOCAL_VARIABLE S'applique aux variables localesElementType.ANNOTATION_TYPE
S'applique aux types d'annotationsElementType.PACKAGE
S'applique aux forfaitsNote : Par exemple, @Target(ElementType.METHOD), l'annotation du flag est utilisée sur la méthode, mais si on met le flag d'annotation sur la classe, une erreur sera être signalé
# #@Rétention : Indique le cycle de vie de l'annotation
Type de cycle de vie Description # #RetentionPolicy.SOURCE
est supprimé lors de la compilation et n'est pas inclus dans le fichier de classe
RetentionPolicy.SOURCE
编译时被丢弃,不包含在类文件中
RetentionPolicy.CLASS
JVM加载时被丢弃,包含在类文件中,默认值
RetentionPolicy.RUNTIME
RetentionPolicy.CLASS
est supprimé lors du chargement de la JVM. Contenue dans le fichier de classe, la valeur par défautRetentionPolicy.RUNTIME
est chargée par la JVM , inclus dans le fichier de classe, et peut être obtenu au moment de l'exécution. To
####@Inherited : Il s'agit d'une annotation de marque @Inherited indique qu'un certain type annoté est hérité. Si un type d'annotation modifié avec @Inherited est utilisé pour une classe, cette annotation sera utilisée pour les sous-classes de la classe. #### @Documenté : Indique que l'élément marqué par cette annotation peut être documenté par Javadoc ou des outils similaires##
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!