Heim > Java > javaLernprogramm > Eine Beispielerklärung zur Implementierung der AOP-Annotation im Frühjahr

Eine Beispielerklärung zur Implementierung der AOP-Annotation im Frühjahr

巴扎黑
Freigeben: 2017-07-21 17:05:11
Original
2238 Leute haben es durchsucht

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 }
Nach dem Login kopieren

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 }
Nach dem Login kopieren

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>
Nach dem Login kopieren

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 }
Nach dem Login kopieren

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 Erkennen und erstellen Sie ein BraveKnight-Objekt namens Knight. Bei Annotationen müssen Sie also nur die Annotations-Scan-Konfiguration aktivieren und müssen nicht die gleiche Bean-Konfiguration durchführen.

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage