Dans l'article précédent, nous avons parlé de l'implémentation XML de Spring. Nous expliquons ici comment implémenter aop à l'aide d'annotations. J'ai déjà parlé de la simple compréhension d'aop, je n'entrerai donc pas dans les détails ici.
La méthode d'annotation pour implémenter aop est principalement divisée en les étapes suivantes (organisées par moi-même, s'il existe une meilleure méthode, bienvenue pour communiquer avec codecjh@163.com) :
1. Dans la classe d'aspect (la classe qui sert les points de coupe) est décorée de l'annotation @Aspect et déclarée comme classe d'aspect.
2. Utilisez l'annotation @Pointcut pour déclarer un pointcut afin d'indiquer à l'aspect qui est son objet de service. (Le corps de la méthode modifiée par cette annotation est vide et il n'est pas nécessaire d'écrire des fonctions telles que public void say(){};. Le nom de la méthode peut être référencé par la fonction de service spécifique lors de l'appel, et il peut être compris comme un objet pointcut. Une méthode d'objet proxy)
3. Modifiez-le avec l'annotation de type de notification correspondante avant la méthode correspondante, déclarez la méthode correspondante comme fonction d'aspect et servez-la à des fins de pointcutting
4. Activez le proxy automatique d'annotation aop dans le fichier de configuration Spring. Par exemple :
Cela peut encore être très abstrait, alors sans plus attendre, parlons du code. Le code est le suivant :
Knight. classe : (voir Ceux qui ont lu l'article précédent sauront ce qu'est un chevalier, hehehe)
1 package com.cjh.aop2; 2 3 import org.springframework.stereotype.Component; 4 5 /** 6 * @author Caijh 7 * 8 * 2017年7月11日 下午3:53:19 9 */10 @Component("knight")11 public class BraveKnight {12 public void saying(){13 System.out.println("我是骑士..(切点方法)");14 }15 }
Type d'aspect : (les notes sont principalement reflétées ici)
1 package com.cjh.aop2; 2 3 import org.aspectj.lang.ProceedingJoinPoint; 4 import org.aspectj.lang.annotation.After; 5 import org.aspectj.lang.annotation.Around; 6 import org.aspectj.lang.annotation.Aspect; 7 import org.aspectj.lang.annotation.Before; 8 import org.aspectj.lang.annotation.Pointcut; 9 import org.springframework.stereotype.Component;10 11 /**12 * @author Caijh13 * email:codecjh@163.com14 * 2017年7月12日 上午9:31:4315 */16 /**17 * 注解方式声明aop18 * 1.用@Aspect注解将类声明为切面(如果用@Component("")注解注释为一个bean对象,那么就要在spring配置文件中开启注解扫描,<context:component-scan base-package="com.cjh.aop2"/>19 * 否则要在spring配置文件中声明一个bean对象)20 * 2.在切面需要实现相应方法的前面加上相应的注释,也就是通知类型。21 * 3.此处有环绕通知,环绕通知方法一定要有ProceedingJoinPoint类型的参数传入,然后执行对应的proceed()方法,环绕才能实现。22 */23 @Component("annotationTest")24 @Aspect25 public class AnnotationTest {26 //定义切点27 @Pointcut("execution(* *.saying(..))")28 public void sayings(){}29 /**30 * 前置通知(注解中的sayings()方法,其实就是上面定义pointcut切点注解所修饰的方法名,那只是个代理对象,不需要写具体方法,31 * 相当于xml声明切面的id名,如下,相当于id="embark",用于供其他通知类型引用)32 * <aop:config>33 <aop:aspect ref="mistrel">34 <!-- 定义切点 -->35 <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>36 <!-- 声明前置通知 (在切点方法被执行前调用) -->37 <aop:before method="beforSay" pointcut-ref="embark"/>38 <!-- 声明后置通知 (在切点方法被执行后调用) -->39 <aop:after method="afterSay" pointcut-ref="embark"/>40 </aop:aspect>41 </aop:config>42 */43 @Before("sayings()")44 public void sayHello(){45 System.out.println("注解类型前置通知");46 }47 //后置通知48 @After("sayings()")49 public void sayGoodbey(){50 System.out.println("注解类型后置通知");51 }52 //环绕通知。注意要有ProceedingJoinPoint参数传入。53 @Around("sayings()")54 public void sayAround(ProceedingJoinPoint pjp) throws Throwable{55 System.out.println("注解类型环绕通知..环绕前");56 pjp.proceed();//执行方法57 System.out.println("注解类型环绕通知..环绕后");58 }59 }
Fichier de configuration Spring :
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 8 http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 9 <!-- 开启注解扫描 -->10 <context:component-scan base-package="com.cjh.aop2"/>11 <!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->12 <aop:aspectj-autoproxy/>13 </beans>
Code de test :
1 package com.cjh.aop2; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 /** 7 * 8 * @author Caijh 9 * email:codecjh@163.com10 * 2017年7月11日 下午6:27:0611 */12 public class Test {13 public static void main(String[] args) {14 ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml");15 BraveKnight br = (BraveKnight) ac.getBean("knight");16 br.saying();17 }18 }
Résultat de l'exécution :
Type d'annotation entourant la notification..avant l'emballage
Type d'annotation précédant la notification
Je suis un chevalier..(méthode pointcut)
Notification d'emballage de type d'annotation..Après l'emballage
Type d'annotation Avis suivant
========================Ligne de séparation================ == ==================
En raison de l'utilisation d'annotations, le fichier de configuration a beaucoup moins de contenu. Il n'a besoin que d'une seule phrase : <context :component-scan base-package="com.cjh.aop2"/>Déclare le package à analyser et le framework analysera automatiquement les annotations et générera des objets bean. Il existe une annotation @Component("knight"), qui a la même signification que
Si l'erreur Spring aop: error at ::0 can't find referenced pointcut sleepPonit se produit pendant le fonctionnement, il s'agit probablement de la version du package Spring. Problème ,
J'utilise la version spring4, puis je dois ajouter aspectjrt-1.7.4.jar et aspectjweaver-1.7.4.jar deux packages, adresse du disque cloud : lien : Mot de passe : nc4i
Le répertoire du projet est le suivant : (Ne vous inquiétez pas pour le cours de codage, histoire de ne pas induire tout le monde en erreur, je l'ai donc barré)
Les types d'annotations de notification sont les suivants :
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!