Im vorherigen Artikel haben wir über die XML-Implementierung von Spring gesprochen. Hier sprechen wir darüber, wie man AOP mithilfe von Annotationen implementiert. Ich habe bereits zuvor über das einfache Verständnis von AOP gesprochen, daher werde ich hier nicht auf Details eingehen.
Die Annotationsmethode zur Implementierung von AOP ist hauptsächlich in die folgenden Schritte unterteilt (von mir selbst organisiert. Wenn es eine bessere Methode gibt, können Sie gerne mit codecjh@163.com kommunizieren):
1. In der Aspect-Klasse (die Klasse, die Pointcuts bereitstellt) wird sie mit der Annotation @Aspect versehen und als Aspect-Klasse deklariert.
2. Verwenden Sie die Annotation @Pointcut, um einen Pointcut zu deklarieren, um dem Aspekt mitzuteilen, wer sein Serviceobjekt ist. (Der Methodenkörper der durch diese Annotation geänderten Methode ist leer und es besteht keine Notwendigkeit, Funktionen wie public void say(){}; zu schreiben. Der Methodenname kann von der spezifischen Dienstfunktion beim Aufruf referenziert werden, und das ist auch möglich (als Pointcut-Objektmethode zu verstehen)
3. Ändern Sie es mit der entsprechenden Benachrichtigungstypanmerkung vor der entsprechenden Methode, deklarieren Sie die entsprechende Methode als Aspektfunktion und dienen Sie dem Pointcutting
4. Aktivieren Sie den automatischen Proxy für AOP-Anmerkungen in der Spring-Konfigurationsdatei. Zum Beispiel:
Es kann immer noch sehr abstrakt sein, also sprechen wir ohne weiteres über den Code. Der Code lautet wie folgt:
Knight Klasse: (siehe Wer den vorherigen Artikel gelesen hat, wird wissen, was ein Ritter ist, 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 }
Aspekttyp: (Hinweise werden hauptsächlich hier wiedergegeben)
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 }
Feder-Konfigurationsdatei:
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>
Testcode:
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 }
Laufergebnis:
Anmerkungstyp um die Benachrichtigung herum..vor dem Umschließen
Anmerkungstyp vor der Benachrichtigung
Ich bin ein Ritter..(Pointcut-Methode)
Anmerkungstyp um die Benachrichtigung herum..Nach dem Umschließen
Anmerkungstyp folgender Hinweis
======================= Trennlinie================ == ================
Aufgrund der Verwendung von Anmerkungen hat die Konfigurationsdatei viel weniger Inhalt. Sie benötigt nur einen Satz: <context :component-scan base-package="com.cjh.aop2"/>Deklarieren Das zu scannende Paket und das Framework scannen automatisch Anmerkungen und generieren Bean-Objekte. Es gibt eine Anmerkung @Component("knight"), die während der Konfiguration dieselbe Bedeutung hat wie
Wenn der Fehler Spring aop: error at ::0 can't find referenced pointcut sleepPonit während des Betriebs auftritt, handelt es sich wahrscheinlich um das Problem der Spring-Paketversion ,
Ich verwende die Spring4-Version und muss dann die beiden Pakete Aspectjrt-1.7.4.jar und Aspectjweaver-1.7.4.jar hinzufügen, Cloud-Disk-Adresse: Link: Passwort: nc4i
Das Projektverzeichnis lautet wie folgt: (Sie müssen sich keine Sorgen um die Codierungsklasse machen, nur um alle nicht in die Irre zu führen, also habe ich es durchgestrichen)
Die Benachrichtigungsanmerkungstypen sind wie folgt:
Das obige ist der detaillierte Inhalt vonEine Beispielerklärung zur Implementierung der AOP-Annotation im Frühjahr. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!