Spring AOP - Krótki przewodnik
Jednym z kluczowych składników Spring Framework jest Aspect Oriented Programming (AOP)struktura. Programowanie zorientowane na aspekt polega na rozbiciu logiki programu na odrębne części zwaneso-called concerns. Funkcje obejmujące wiele punktów aplikacji nazywane są zagadnieniami przekrojowymi. Tecross-cutting concernssą koncepcyjnie oddzielone od logiki biznesowej aplikacji. Istnieje wiele typowych dobrych przykładów aspektów, takich jak logowanie, audyt, transakcje deklaratywne, bezpieczeństwo, buforowanie itp.
Kluczową jednostką modułowości w OOP jest klasa, podczas gdy w AOP jednostką modułowości jest aspekt. Dependency Injection pomaga oddzielić obiekty aplikacji od siebie, a AOP pomaga oddzielić problemy związane z cięciem krzyżowym od obiektów, na które mają one wpływ. AOP jest jak wyzwalacze w językach programowania, takich jak Perl, .NET, Java i inne.
Moduł Spring AOP pozwala przechwytywaczom przechwycić aplikację. Na przykład, gdy metoda jest wykonywana, możesz dodać dodatkowe funkcje przed lub po wykonaniu metody.
Ten rozdział przedstawia proces konfigurowania Spring AOP w systemach opartych na Windows i Linux. Spring AOP można łatwo zainstalować i zintegrować z aktualnym środowiskiem Java i MAVEN, wykonując kilka prostych kroków bez skomplikowanych procedur konfiguracyjnych. Administracja użytkownikami jest wymagana podczas instalacji.
wymagania systemowe
JDK | Java SE 2 JDK 1.5 lub nowsza |
Pamięć | 1 GB RAM (zalecane) |
Miejsca na dysku | Brak minimalnych wymagań |
Wersja systemu operacyjnego | Windows XP lub nowszy, Linux |
Przyjrzyjmy się teraz krokom instalacji Spring AOP.
Krok 1: Zweryfikuj instalację Java
Przede wszystkim musisz mieć zainstalowany zestaw Java Software Development Kit (SDK) w swoim systemie. Aby to sprawdzić, wykonaj dowolne z następujących dwóch poleceń w zależności od platformy, na której pracujesz.
Jeśli instalacja Java została wykonana poprawnie, wyświetli się aktualna wersja i specyfikacja instalacji Java. Przykładowe dane wyjściowe podano w poniższej tabeli.
Platforma | Komenda | Przykładowe wyjście |
---|---|---|
Windows | Otwórz konsolę poleceń i wpisz - \>java -version |
Wersja Java „1.7.0_60” Środowisko wykonawcze Java (TM) SE (kompilacja 1.7.0_60-b19) Java Hotspot (TM) 64-bitowa maszyna wirtualna serwera (kompilacja 24.60-b09, tryb mieszany) |
Linux | Otwórz terminal poleceń i wpisz - $java -version |
wersja java „1.7.0_25” Otwórz środowisko wykonawcze JDK (rhel-2.3.10.4.el6_4-x86_64) Otwórz 64-bitową maszynę wirtualną serwera JDK (kompilacja 23.7-b01, tryb mieszany) |
Zakładamy, że czytelnicy tego samouczka mają zainstalowany pakiet Java SDK w wersji 1.7.0_60 w swoim systemie.
Jeśli nie masz Java SDK, pobierz jego aktualną wersję z https://www.oracle.com/technetwork/java/javase/downloads/index.html i zainstaluj.
Krok 2: Skonfiguruj środowisko Java
Ustaw zmienną środowiskową JAVA_HOME, aby wskazywała lokalizację katalogu podstawowego, w którym na komputerze jest zainstalowana Java. Na przykład,
Sr.No. | Platforma i opis |
---|---|
1 | Windows Ustaw JAVA_HOME na C: \ ProgramFiles \ java \ jdk1.7.0_60 |
2 | Linux Eksportuj JAVA_HOME = / usr / local / java-current |
Dołącz pełną ścieżkę lokalizacji kompilatora Java do ścieżki systemowej.
Sr.No. | Platforma i opis |
---|---|
1 | Windows Dołącz ciąg „C: \ Program Files \ Java \ jdk1.7.0_60 \ bin” na końcu zmiennej systemowej Path. |
2 | Linux Export PATH = $ PATH: $ JAVA_HOME / bin / |
Wykonaj polecenie java -version z wiersza polecenia, jak wyjaśniono powyżej.
Krok 3: Pobierz archiwum Maven
Pobierz Maven 3.3.3 z https://maven.apache.org/download.cgi
OS | Nazwa archiwum |
---|---|
Windows | apache-maven-3.3.3-bin.zip |
Linux | apache-maven-3.3.3-bin.tar.gz |
Prochowiec | apache-maven-3.3.3-bin.tar.gz |
Krok 4: Rozpakuj archiwum Mavena
Wypakuj archiwum do katalogu, w którym chcesz zainstalować Maven 3.3.3. Z archiwum zostanie utworzony podkatalog apache-maven-3.3.3.
OS | Lokalizacja (może się różnić w zależności od instalacji) |
---|---|
Windows | C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 |
Linux | / usr / local / apache-maven |
Prochowiec | / usr / local / apache-maven |
Krok 5: Ustaw zmienne środowiskowe Mavena
Dodaj M2_HOME, M2, MAVEN_OPTS do zmiennych środowiskowych.
OS | Wynik |
---|---|
Windows | Ustaw zmienne środowiskowe za pomocą właściwości systemowych. M2_HOME = C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 M2 =% M2_HOME% \ bin MAVEN_OPTS = -Xms256m -Xmx512m |
Linux | Otwórz terminal poleceń i ustaw zmienne środowiskowe. eksport M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3 eksport M2 = $ M2_HOME / bin eksport MAVEN_OPTS = -Xms256m -Xmx512m |
Prochowiec | Otwórz terminal poleceń i ustaw zmienne środowiskowe. eksport M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3 eksport M2 = $ M2_HOME / bin eksport MAVEN_OPTS = -Xms256m -Xmx512m |
Krok 6: Dodaj lokalizację katalogu Maven Bin do ścieżki systemowej
Teraz dołącz zmienną M2 do ścieżki systemowej.
OS | Wynik |
---|---|
Windows | Dołącz ciąg;% M2% na końcu zmiennej systemowej, Path. |
Linux | export PATH = $ M2: $ PATH |
Prochowiec | export PATH = $ M2: $ PATH |
Krok 7: Sprawdź instalację Mavena
Teraz otwórz konsolę i wykonaj następujące czynności mvn Komenda.
OS | Zadanie | Komenda |
---|---|---|
Windows | Otwórz konsolę poleceń | c: \> mvn --version |
Linux | Otwórz terminal poleceń | $ mvn --version |
Prochowiec | Otwórz terminal | maszyna: <joseph $ mvn --version |
Na koniec sprawdź wyjście powyższych poleceń, które powinno wyglądać następująco -
OS | Wynik |
---|---|
Windows | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Strona główna Mavena: C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 Wersja Java: 1.7.0_75, producent: Oracle Corporation Strona główna Java: C: \ Program Files \ Java \ jdk1.7.0_75 \ jre Domyślne ustawienia regionalne: en_US, kodowanie platformy: Cp1252 |
Linux | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Strona główna Mavena: /usr/local/apache-maven/apache-maven-3.3.3 Wersja Java: 1.7.0_75, producent: Oracle Corporation Strona główna Java: /usr/local/java-current/jdk1.7.0_75/jre |
Prochowiec | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Strona główna Mavena: /usr/local/apache-maven/apache-maven-3.3.3 Wersja Java: 1.7.0_75, producent: Oracle Corporation Strona główna Java: /Library/Java/Home/jdk1.7.0_75/jre |
Krok 8 - Skonfiguruj Eclipse IDE
Wszystkie przykłady w tym samouczku zostały napisane przy użyciu Eclipse IDE. Sugerowałbym więc, abyś miał zainstalowaną najnowszą wersję Eclipse na swoim komputerze.
Aby zainstalować Eclipse IDE, pobierz najnowsze pliki binarne Eclipse z https://www.eclipse.org/downloads/. Po pobraniu instalacji rozpakuj dystrybucję binarną w dogodnej lokalizacji. Na przykład w C: \ eclipse w systemie Windows lub / usr / local / eclipse w systemie Linux / Unix i na koniec ustaw odpowiednio zmienną PATH.
Eclipse można uruchomić, wykonując następujące polecenia na komputerze z systemem Windows lub klikając dwukrotnie plik eclipse.exe
%C:\eclipse\eclipse.exe
Eclipse można uruchomić, wykonując następujące polecenia na komputerze z systemem Unix (Solaris, Linux itp.) -
$/usr/local/eclipse/eclipse
Po udanym uruchomieniu, jeśli wszystko jest w porządku, powinien wyświetlić następujący wynik -
Kiedy skończysz z ostatnim krokiem, możesz przejść do pierwszego przykładu AOP, który zobaczysz w następnym rozdziale.
Zanim zaczniemy pracę z AOP, zapoznajmy się z pojęciami i terminologią AOP. Te terminy nie są specyficzne dla Springa, są raczej związane z AOP.
Sr.No. | Warunki i opis |
---|---|
1 | Aspect Moduł zawierający zestaw interfejsów API zapewniających wymagania przekrojowe. Na przykład moduł rejestrowania będzie nazywał się aspektem AOP do rejestrowania. Aplikacja może mieć wiele aspektów w zależności od wymagań. |
2 | Join point Stanowi to punkt w aplikacji, w którym można podłączyć aspekt AOP. Można też powiedzieć, że jest to rzeczywiste miejsce w aplikacji, w którym zostanie wykonana akcja z wykorzystaniem frameworka Spring AOP. |
3 | Advice Jest to rzeczywista akcja, która ma zostać podjęta przed lub po wykonaniu metody. To jest rzeczywisty fragment kodu, który jest wywoływany podczas wykonywania programu przez framework Spring AOP. |
4 | PointCut Jest to zestaw jednego lub więcej punktów złączenia, w których należy wykonać poradę. Możesz określić PointCuts za pomocą wyrażeń lub wzorców, jak zobaczymy w naszych przykładach AOP. |
5 | Introduction Wprowadzenie pozwala na dodanie nowych metod lub atrybutów do istniejących klas. |
6 | Target object Obiekt, na który zwraca uwagę jeden lub więcej aspektów. Ten obiekt zawsze będzie obiektem proxy. Nazywany również polecanym obiektem. |
7 | Weaving Tkanie to proces łączenia aspektów z innymi typami aplikacji lub obiektami w celu stworzenia zalecanego obiektu. Można to zrobić w czasie kompilacji, wczytywania lub w czasie wykonywania. |
Aspekty wiosenne mogą działać z pięcioma rodzajami porad wymienionych w poniższej tabeli.
Sr.No. | Porady i opis |
---|---|
1 | before Uruchom poradę przed wykonaniem metody. |
2 | after Uruchom poradę po wykonaniu metody, niezależnie od jej wyniku. |
3 | after-returning Uruchom poradę po wykonaniu metody, tylko jeśli metoda zakończy się pomyślnie. |
4 | after-throwing Uruchom poradę po wykonaniu metody, tylko jeśli metoda kończy działanie przez zgłoszenie wyjątku. |
5 | around Uruchom poradę przed i po wywołaniu zalecanej metody. |
Wiosna wspiera @AspectJ annotation style podejście i schema-based podejście do wdrażania niestandardowych aspektów.
Oparte na schemacie XML
Aspekty są implementowane przy użyciu zwykłych klas wraz z konfiguracją opartą na XML.
Aby użyć znaczników przestrzeni nazw AOP opisanych w tej sekcji, musisz zaimportować schemat sprężynowego AOP, opisany w następujący sposób -
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<!-- bean definition & AOP specific configuration -->
</beans>
Deklarowanie aspektu
Na aspect jest deklarowana przy użyciu <aop:aspect> element, a do fasoli zapasowej odwołuje się przy użyciu ref atrybut w następujący sposób.
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Tutaj "aBean" zostanie skonfigurowany i wstawiony zależność, tak jak każdy inny komponent Spring Bean, jak widzieliśmy w poprzednich rozdziałach.
Deklarowanie PointCut
ZA PointCutpomaga w określaniu punktów złączenia (tj. metod), które mają być wykonane, z różnymi radami. Podczas pracy z konfiguracją opartą na schemacie XML PointCut zostanie zdefiniowany w następujący sposób -
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
<aop:PointCut id = "businessService"
expression = "execution(* com.xyz.myapp.service.*.*(..))"/>
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Poniższy przykład definiuje PointCut o nazwie „businessService”, który będzie pasował do metody getName () dostępnej w klasie Student w pakiecie com.tutorialspoint.
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
<aop:PointCut id = "businessService"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Deklarowanie porad
Możesz zadeklarować dowolną z pięciu porad wewnątrz <aop: aspekt> za pomocą elementu <aop: {NAZWA PORADY}> w następujący sposób.
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
<aop:PointCut id = "businessService"
expression = "execution(* com.xyz.myapp.service.*.*(..))"/>
<!-- a before advice definition -->
<aop:before PointCut-ref = "businessService"
method = "doRequiredTask"/>
<!-- an after advice definition -->
<aop:after PointCut-ref = "businessService"
method = "doRequiredTask"/>
<!-- an after-returning advice definition -->
<!--The doRequiredTask method must have parameter named retVal -->
<aop:after-returning PointCut-ref = "businessService"
returning = "retVal"
method = "doRequiredTask"/>
<!-- an after-throwing advice definition -->
<!--The doRequiredTask method must have parameter named ex -->
<aop:after-throwing PointCut-ref = "businessService"
throwing = "ex"
method = "doRequiredTask"/>
<!-- an around advice definition -->
<aop:around PointCut-ref = "businessService"
method = "doRequiredTask"/>
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Możesz użyć tego samego doRequiredTasklub różne metody dla różnych porad. Metody te zostaną zdefiniowane jako część modułu aspektów.
Oparty na @AspectJ
@AspectJ odnosi się do stylu deklarowania aspektów jako zwykłych klas Java z adnotacjami Java 5. Obsługa @AspectJ jest włączana przez włączenie następującego elementu do pliku konfiguracyjnego opartego na schemacie XML.
<aop:aspectj-autoproxy/>
Deklarowanie aspektu
Klasy aspektów są podobne do innych normalnych beanów i mogą mieć metody i pola tak jak każda inna klasa, z tym wyjątkiem, że zostaną opatrzone adnotacją @Aspect w następujący sposób.
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AspectModule {
}
Zostaną skonfigurowane w XML, jak każdy inny bean w następujący sposób.
<bean id = "myAspect" class = "org.xyz.AspectModule">
<!-- configure properties of aspect here as normal -->
</bean>
Deklarowanie PointCut
ZA PointCutpomaga w określaniu punktów złączenia (tj. metod), które mają być wykonane, z różnymi radami. Podczas pracy z konfiguracją opartą na @AspectJ, deklaracja PointCut składa się z dwóch części -
Wyrażenie PointCut, które dokładnie określa, które wykonania metod nas interesują.
Podpis PointCut zawierający nazwę i dowolną liczbę parametrów. Rzeczywista treść metody jest nieistotna i w rzeczywistości powinna być pusta.
Poniższy przykład definiuje PointCut o nazwie „businessService”, który będzie pasował do wykonania każdej metody dostępnej w klasach w pakiecie com.xyz.myapp.service.
import org.aspectj.lang.annotation.PointCut;
@PointCut("execution(* com.xyz.myapp.service.*.*(..))") // expression
private void businessService() {} // signature
Poniższy przykład definiuje PointCut o nazwie „getname”, który będzie pasował do metody getName () dostępnej w klasie Student w pakiecie com.tutorialspoint.
import org.aspectj.lang.annotation.PointCut;
@PointCut("execution(* com.tutorialspoint.Student.getName(..))")
private void getname() {}
Deklarowanie porad
Możesz zadeklarować dowolną z pięciu porad za pomocą adnotacji @ {ADVICE-NAME}, jak podano poniżej. Zakłada się, że zdefiniowano już metodę podpisu BusinessService () PointCut.
@Before("businessService()")
public void doBeforeTask(){
...
}
@After("businessService()")
public void doAfterTask(){
...
}
@AfterReturning(PointCut = "businessService()", returning = "retVal")
public void doAfterReturnningTask(Object retVal){
// you can intercept retVal here.
...
}
@AfterThrowing(PointCut = "businessService()", throwing = "ex")
public void doAfterThrowingTask(Exception ex){
// you can intercept thrown exception here.
...
}
@Around("businessService()")
public void doAroundTask(){
...
}
Możesz zdefiniować PointCut w tekście dla dowolnej porady. Poniżej znajduje się przykład definiowania inline PointCut przed poradą.
@Before("execution(* com.xyz.myapp.service.*.*(..))")
public doBeforeTask(){
...
}
W tym rozdziale będziemy pisać rzeczywiste aplikacje AOP przy użyciu Spring AOP Framework. Zanim zaczniesz pisać swój pierwszy przykład przy użyciu frameworka Spring-WS, musisz upewnić się, że środowisko Spring AOP zostało poprawnie skonfigurowane, jak wyjaśniono w rozdziale Spring Web Services - Konfiguracja środowiska .
Teraz przystąp do pisania prostej konsoli Spring AOP Application, która zademonstruje koncepcje AOP.
Utwórz projekt
Step 1 - Otwórz konsolę poleceń, przejdź do katalogu C: \ MVN i wykonaj następujące czynności mvn Komenda.
C:\MVN>mvn archetype:generate -DgroupId = com.tutorialspoint -DartifactId = Student
-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Maven rozpocznie przetwarzanie i utworzy pełną strukturę projektu aplikacji Java.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources
@ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources
@ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom --
-
[INFO] Generating project in Batch mode
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar (5 KB at 1.1 KB/s
ec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom (703 B at 1.2 KB/
sec)
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Old (1.x) Archetype:
maven-archetype-quickstart:1.0
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.tutorialspoint
[INFO] Parameter: packageName, Value: com.tutorialspoint
[INFO] Parameter: package, Value: com.tutorialspoint
[INFO] Parameter: artifactId, Value: Student
[INFO] Parameter: basedir, Value: C:\MVN
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\MVN\Student
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:17 min
[INFO] Finished at: 2017-02-19T21:11:14+05:30
[INFO] Final Memory: 15M/114M
[INFO] ------------------------------------------------------------------------
Step 2- Przejdź do katalogu C: / MVN. Zobaczysz utworzony projekt aplikacji Java o nazwie student (zgodnie z artifactId). Zaktualizuj plik POM.xml, aby uwzględnić zależności Spring-AOP. Dodaj pliki MainApp.java, Student.java i Logging.java.
POM.xml
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>Student</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Student</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
</dependencies>
</project>
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
public void beforeAdvice() {
System.out.println("Going to setup student profile.");
}
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
public void afterAdvice() {
System.out.println("Student profile has been setup.");
}
/**
* This is the method which I would like to execute
* when any method returns.
*/
public void afterReturningAdvice(Object retVal){
System.out.println("Returning:" + retVal.toString() );
}
/**
* This is the method which I would like to execute
* if there is an exception raised.
*/
public void AfterThrowingAdvice(IllegalArgumentException ex) {
System.out.println("There has been an exception: " + ex.toString());
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
student.printThrowException();
}
}
Step 3 - Dodaj plik konfiguracyjny Beans.xml pod src > main > resources teczka.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
<aop:after PointCut-ref = "selectAll" method = "afterAdvice"/>
<aop:after-returning PointCut-ref = "selectAll"
returning = "retVal"
method = "afterReturningAdvice"/>
<aop:after-throwing PointCut-ref = "selectAll"
throwing = "ex"
method = "AfterThrowingAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Step 4 - Otwórz konsolę poleceń, przejdź do katalogu C: \ MVN i wykonaj następujące czynności mvn Komenda.
C:\MVN>Student> mvn package
Maven rozpocznie przetwarzanie i pobieranie wymaganych bibliotek.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Student 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven
-jar-plugin/2.4/maven-jar-plugin-2.4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-
jar-plugin/2.4/maven-jar-plugin-2.4.pom (6 KB at 2.2 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven
-jar-plugin/2.4/maven-jar-plugin-2.4.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-
jar-plugin/2.4/maven-jar-plugin-2.4.jar (34 KB at 31.6 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop
/4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/
4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom (3 KB at 3.7 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea
ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean
s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom (3 KB at 4.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor
e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core
/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom (3 KB at 4.0 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop
/4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor
e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea
ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/
4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar (351 KB at 43.9 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean
s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar (685 KB at 37.5 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core
/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar (982 KB at 47.1 KB/sec)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Student --
-
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\Student\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Student ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 1 source file to C:\MVN\Student\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ St
udent ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\Student\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ Student
---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 1 source file to C:\MVN\Student\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Student ---
[INFO] Surefire report directory: C:\MVN\Student\target\surefire-reports
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure
fire-junit3/2.12.4/surefire-junit3-2.12.4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref
ire-junit3/2.12.4/surefire-junit3-2.12.4.pom (2 KB at 1.3 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure
fire-junit3/2.12.4/surefire-junit3-2.12.4.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref
ire-junit3/2.12.4/surefire-junit3-2.12.4.jar (26 KB at 27.7 KB/sec)
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.tutorialspoint.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ Student ---
Downloading: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-al
pha-2/classworlds-1.1-alpha-2.jar
Downloaded: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alp
ha-2/classworlds-1.1-alpha-2.jar (37 KB at 35.8 KB/sec)
[INFO] Building jar: C:\MVN\Student\target\Student-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.441 s
[INFO] Finished at: 2017-02-19T21:18:59+05:30
[INFO] Final Memory: 18M/109M
[INFO] ------------------------------------------------------------------------
Importuj projekt w Eclipse
Step 1 - Otwórz Eclipse.
Step 2 - Wybierz File → Import → opcja.
Step 3- Wybierz opcję Maven Projekty. Kliknij przycisk Dalej.
Step 4 - Wybierz lokalizację projektu, w której projekt Studenta został utworzony za pomocą Mavena.
Step 5 - Kliknij przycisk Zakończ.
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Student profile has been setup.
Returning:Zara
Going to setup student profile.
Age : 11
Student profile has been setup.
Returning:11
Going to setup student profile.
Exception raised
Student profile has been setup.
There has been an exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
at com.tutorialspoint.Student.printThrowException(Student.java:25)
at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:43) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$56a970f2.printThrowException(<generated>)
at com.tutorialspoint.MainApp.main(MainApp.java:16)
Dołącz do punktu
JoinPoint reprezentuje punkt w aplikacji, w którym można podłączyć aspekt AOP. Można też powiedzieć, że jest to rzeczywiste miejsce w aplikacji, w którym zostanie wykonana akcja z wykorzystaniem frameworka Spring AOP. Rozważ następujące przykłady -
Wszystkie klasy metod zawarte w pakiecie (pakietach).
Konkretne metody klasy.
PointCut
PointCut to zestaw jednego lub więcej punktów JoinPoint, w których należy wykonać poradę. Możesz określić PointCuts za pomocą wyrażeń lub wzorców, jak zobaczymy w naszych przykładach AOP. Wiosną PointCut pomaga wykorzystać konkretne JoinPoints do zastosowania się do porady. Rozważ następujące przykłady -
wyrażenie = "wykonanie (* com.tutorialspoint. *. * (..))"
wyrażenie = "wykonanie (* com.tutorialspoint.Student.getName (..))"
Składnia
<aop:config>
<aop:aspect id = "log" ref = "adviceClass">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
</aop:aspect>
</aop:config>
Gdzie,
adviceClass - ref klasy zawierającej metody doradcze
PointCut-id - identyfikator PointCut
execution( expression ) - Wyrażenie obejmujące metody, w odniesieniu do których mają być stosowane porady.
Aby zrozumieć powyższe koncepcje związane z JoinPoint i PointCut, napiszmy przykład, który zaimplementuje kilka PointCuts. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Po utworzeniu plików źródłowych i konfiguracyjnych komponentów bean uruchom aplikację. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11
Zdefiniowane powyżej <aop: pointcut> wybiera wszystkie metody zdefiniowane w pakiecie com.tutorialspoint. Załóżmy, że chcesz wykonać swoją radę przed lub po określonej metodzie, możesz zdefiniować PointCut, aby zawęzić wykonanie, zastępując gwiazdki (*) w definicji PointCut rzeczywistymi nazwami klas i metod. Poniżej znajduje się zmodyfikowany plik konfiguracyjny XML, aby pokazać koncepcję.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Age : 11
Beforejest typem porady, który zapewnia, że porada zostanie uruchomiona przed wykonaniem metody. Poniżej przedstawiono składnię funkcji przed poradą.
Składnia
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:before PointCut-ref = "PointCut-id" method = "methodName"/>
</aop:aspect>
</aop:config>
Gdzie,
PointCut-id - identyfikator PointCut.
methodName - nazwa metody funkcji, która ma zostać wywołana przed wywołaną funkcją.
Aby zrozumieć powyższe koncepcje związane z Before Advice, napiszmy przykład, który zaimplementuje Before Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Age : 11
Afterjest typem porady, który zapewnia, że porada zostanie uruchomiona po wykonaniu metody. Poniżej znajduje się składnia porady po.
Składnia
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:after PointCut-ref = "PointCut-id" method = "methodName"/>
</aop:aspect>
</aop:config>
Gdzie,
PointCut-id - identyfikator PointCut.
methodName - nazwa metody funkcji, która ma zostać wywołana po wywołanej funkcji.
Aby zrozumieć powyższe koncepcje związane z After Advice, napiszmy przykład, który zaimplementuje After Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
public void afterAdvice(){
System.out.println("Student profile setup complete.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.Student.getAge(..))"/>
<aop:after PointCut-ref = "selectAll" method = "afterAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, spowoduje to wydrukowanie następującego komunikatu.
Name : Zara
Age : 11
Student profile setup complete.
Afterjest typem porady, który zapewnia, że porada zostanie uruchomiona po wykonaniu metody tylko wtedy, gdy metoda zakończy się pomyślnie. Poniżej znajduje się składnia porady po.
Składnia
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:after-returning PointCut-ref = "PointCut-id"
returning = "retVal" method = "methodName"/>
</aop:aspect>
</aop:config>
Gdzie,
PointCut-id - identyfikator PointCut.
methodName - Nazwa metody funkcji, która ma zostać wywołana po pomyślnym zakończeniu wywoływanej funkcji.
Aby zrozumieć powyższe pojęcia związane z poradą po zwrocie, napiszmy przykład, który będzie realizował poradę po zwrocie. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring -
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* when any method returns.
*/
public void afterReturningAdvice(Object retVal){
System.out.println("Returning:" + retVal.toString() );
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
System.out.println("Exception raised");
throw new IllegalArgumentException();
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:after-returning PointCut-ref = "selectAll"
method = "afterReturningAdvice" returning = "retVal"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Name : Zara
Returning : Name
Age : 11
Exception raised
After-throwingjest typem porady, który zapewnia, że porada zostanie uruchomiona po wykonaniu metody, tylko wtedy, gdy metoda zakończy działanie przez zgłoszenie wyjątku. Poniżej znajduje się składnia porad po rzuceniu.
Składnia
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:after-throwing PointCut-ref = "PointCut-id" throwing = "ex"
method = "methodName"/>
</aop:aspect>
</aop:config>
Gdzie,
PointCut-id - identyfikator PointCut.
ex - Wyjątek do wyrzucenia.
methodName - Nazwa metody funkcji, która ma zostać wywołana, gdy wywoływana funkcja zgłasza wyjątek i kończy działanie.
Aby zrozumieć wspomniane wyżej pojęcia związane z poradą po rzucie, napiszmy przykład, który będzie implementował porady po rzucie. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring -
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* if there is an exception raised.
*/
public void afterThrowingAdvice(IllegalArgumentException ex) {
System.out.println("There has been an exception: " + ex.toString());
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.printThrowException();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:after-throwing PointCut-ref = "selectAll"
throwing = "ex" method = "afterThrowingAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Exception raised
There has been an exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
at com.tutorialspoint.Student.printThrowException(Student.java:25)
at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$8514cd8.printThrowException(<generated>)
at com.tutorialspoint.MainApp.main(MainApp.java:15)
Aroundjest typem porady, który zapewnia, że porada jest uruchamiana przed i po wykonaniu metody. Poniżej znajduje się składnia rady.
Składnia
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:around PointCut-ref = "PointCut-id" method = "methodName"/>
</aop:aspect>
</aop:config>
Gdzie,
PointCut-id - identyfikator PointCut.
methodName - nazwa metody funkcji, która ma zostać wywołana przed wywołaną funkcją.
Aby zrozumieć powyższe koncepcje związane z Dookoła Doradztwa, napiszmy przykład, który zaimplementuje Dookoła Doradztwo. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring -
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class Logging {
/**
* This is the method which I would like to execute
* around a selected method execution.
*/
public String aroundAdvice(ProceedingJoinPoint jp) throws Throwable{
System.out.println("Around advice");
Object[] args = jp.getArgs();
if(args.length>0){
System.out.print("Arguments passed: " );
for (int i = 0; i < args.length; i++) {
System.out.print("arg "+(i+1)+": "+args[i]);
}
}
Object result = jp.proceed(args);
System.out.println("Returning " + result);
return result.toString();
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectName"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
<aop:around PointCut-ref = "selectName" method = "aroundAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Around advice
Name : Zara
Returning Zara
Napiszmy przykład, który zaimplementuje porady przy użyciu konfiguracji opartej na adnotacjach. W tym celu przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.PointCut;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.*.*(..))")
private void selectAll(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectAll()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11
JoinPoint
JoinPoint reprezentuje punkt w aplikacji, w którym można podłączyć aspekt AOP. Można też powiedzieć, że jest to rzeczywiste miejsce w aplikacji, w którym zostanie wykonana akcja z wykorzystaniem frameworka Spring AOP. Rozważ następujące przykłady -
Wszystkie klasy metod zawarte w pakiecie (pakietach).
Konkretne metody klasy.
PointCut
PointCut to zestaw jednego lub więcej JoinPoint, w którym należy wykonać poradę. Możesz określić PointCuts za pomocą wyrażeń lub wzorców, jak zobaczymy w naszych przykładach AOP. Wiosną PointCut pomaga wykorzystać konkretne JoinPoints do zastosowania się do porady. Rozważ następujące przykłady -
@PointCut ("wykonanie (* com.tutorialspoint. *. * (..))")
@PointCut ("wykonanie (* com.tutorialspoint.Student.getName (..))")
Składnia
@Aspect
public class Logging {
@PointCut("execution(* com.tutorialspoint.*.*(..))")
private void selectAll(){}
}
Gdzie,
@Aspect - Oznacz klasę jako klasę zawierającą metody doradcze.
@PointCut - Oznacz funkcję jako PointCut
execution( expression ) - Wyrażenie obejmujące metody, w odniesieniu do których mają być stosowane porady.
Aby zrozumieć powyższe koncepcje związane z JoinPoint i PointCut, napiszmy przykład, który zaimplementuje kilka PointCuts. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring -
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.*.*(..))")
private void selectAll(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectAll()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11
Zdefiniowane powyżej @Pointcut używa wyrażenia, aby wybrać wszystkie metody zdefiniowane w pakiecie com.tutorialspoint. @Before advice używa zdefiniowanego powyżej PointCut jako parametru. Efektywnie metoda beforeAdvice () zostanie wywołana przed każdą metodą objętą powyższym PointCut.
@Beforejest typem porady, który zapewnia, że porada zostanie uruchomiona przed wykonaniem metody. Poniżej znajduje się składnia @Before advice.
Składnia
@PointCut("execution(* com.tutorialspoint.Student.getName(..))")
private void selectGetName(){}
@Before("selectGetName()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
Gdzie,
@PointCut - Oznacz funkcję jako PointCut
execution( expression ) - Wyrażenie obejmujące metody, w odniesieniu do których mają być stosowane porady.
@Before - Oznacz funkcję jako poradę do wykonania przed metodami objętymi PointCut.
Aby zrozumieć wspomniane wyżej pojęcia związane z @Before Advice, napiszmy przykład, który zaimplementuje @Before Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring -
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getName(..))")
private void selectGetName(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectGetName()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Age : 11
Zdefiniowane powyżej @Pointcut używa wyrażenia do wyboru metody getAge () zdefiniowanej w klasach w pakiecie com.tutorialspoint. Porada @After używa zdefiniowanego powyżej PointCut jako parametru. Skutecznie metoda afterAdvice () zostanie wywołana przed każdą metodą objętą powyższym PointCut.
@Afterjest typem porady, który zapewnia, że porada zostanie uruchomiona po wykonaniu metody. Poniżej znajduje się składnia porady @After.
Składnia
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetName(){}
@After("selectGetAge()")
public void afterAdvice(){
System.out.println("Student profile setup completed.");
}
Gdzie,
@PointCut - Oznacz funkcję jako PointCut
execution( expression ) - Wyrażenie obejmujące metody, w odniesieniu do których mają być stosowane porady.
@After - Oznacz funkcję jako poradę do wykonania przed metodami objętymi PointCut.
Aby zrozumieć wspomniane wyżej pojęcia związane z @After Advice, napiszmy przykład, który zaimplementuje @After Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.After;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetAge(){}
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
@After("selectGetAge()")
public void afterAdvice(){
System.out.println("Student profile setup completed.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Name : Zara
Age : 11
Student profile setup completed.
Zdefiniowane powyżej @Pointcut używa wyrażenia do wyboru metody getAge () zdefiniowanej w klasach w pakiecie com.tutorialspoint. Porada @After używa zdefiniowanego powyżej PointCut jako parametru. Skutecznie metoda afterAdvice () zostanie wywołana przed każdą metodą objętą powyższym PointCut.
@AfterReturningjest typem porady, który gwarantuje, że porada zostanie uruchomiona po pomyślnym wykonaniu metody. Poniżej znajduje się składnia porady @AfterReturning.
Składnia
@AfterReturning(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
returning = "retVal")
public void afterReturningAdvice(JoinPoint jp, Object retVal){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Returning:" + retVal.toString() );
}
Gdzie,
@AfterReturning - Oznacz funkcję jako poradę do wykonania przed metodami objętymi przez PointCut, jeśli metoda zakończy się pomyślnie.
PointCut - Zawiera wyrażenie umożliwiające wybranie funkcji
execution( expression ) - Wyrażenie obejmujące metody, w odniesieniu do których mają być stosowane porady.
returning - nazwa zmiennej, która ma zostać zwrócona.
Aby zrozumieć powyższe pojęcia związane z @AfterReturning Advice, napiszmy przykład, który zaimplementuje @AfterReturning Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
@Aspect
public class Logging {
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
@AfterReturning(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
returning = "retVal")
public void afterReturningAdvice(JoinPoint jp, Object retVal){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Returning:" + retVal.toString() );
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Age : 11
Method Signature: Integer com.tutorialspoint.Student.getAge()
Returning 11
@AfterThrowingjest typem porady, który zapewnia, że porada zostanie uruchomiona, jeśli metoda zgłosi wyjątek. Poniżej znajduje się składnia porady @AfterThrowing.
Składnia
@AfterThrowing(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
throwing = "error")
public void afterThrowingAdvice(JoinPoint jp, Throwable error){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Exception: "+error);
}
Gdzie,
@AfterThrowing - Oznacz funkcję jako poradę do wykonania przed metodami objętymi przez PointCut, jeśli metoda zgłosi wyjątek.
PointCut - Zawiera wyrażenie umożliwiające wybranie funkcji.
execution( expression ) - Wyrażenie obejmujące metody, w odniesieniu do których mają być stosowane porady.
throwing - nazwa wyjątku do zwrócenia.
Aby zrozumieć wspomniane wyżej pojęcia związane z @AfterThrowing Advice, napiszmy przykład, który zaimplementuje @AfterThrowing Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
@Aspect
public class Logging {
/**
* This is the method which I would like to execute
* after a selected method execution throws exception.
*/
@AfterThrowing(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
throwing = "error")
public void afterThrowingAdvice(JoinPoint jp, Throwable error){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Exception: "+error);
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.printThrowException();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Exception raised
Method Signature: void com.tutorialspoint.Student.printThrowException()
Exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
at com.tutorialspoint.Student.printThrowException(Student.java:25)
at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$99b0a988.printThrowException(<generated>)
at com.tutorialspoint.MainApp.main(MainApp.java:13)
@Aroundjest typem porady, który zapewnia, że porada może zostać uruchomiona przed i po wykonaniu metody. Poniżej znajduje się składnia porady @Around.
Składnia
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetName(){}
@Around("selectGetAge()")
public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("Around advice");
Object[] args = jp.getArgs();
if(args.length>0){
System.out.print("Arguments passed: " );
for (int i = 0; i < args.length; i++) {
System.out.print("arg "+(i+1)+": "+args[i]);
}
}
Object result = jp.proceed(args);
System.out.println("Returning " + result);
return result.toString();
}
Gdzie,
@PointCut - Oznacz funkcję jako PointCut
execution( expression ) - Wyrażenie obejmujące metody, w odniesieniu do których mają być stosowane porady.
@Around - Oznacz funkcję jako poradę do wykonania przed metodami objętymi PointCut.
Aby zrozumieć wspomniane wyżej pojęcia związane z @Around Advice, napiszmy przykład, który zaimplementuje @Around Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring -
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetAge(){}
/**
* This is the method which I would like to execute
* around a selected method execution.
*/
@Around("selectGetAge()")
public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("Around advice");
Object[] args = proceedingJoinPoint.getArgs();
if(args.length>0){
System.out.print("Arguments passed: " );
for (int i = 0; i < args.length; i++) {
System.out.print("arg "+(i+1)+": "+args[i]);
}
}
Object result = proceedingJoinPoint.proceed(args);
System.out.println("Returning " + result);
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Around advice
Age : 11
Returning 11
Do tej pory deklarowaliśmy aspekty przy użyciu <aop:config> lub < aop:aspectj-autoproxy>. Możemy stworzyć proxy programowo, jak również wywołać aspekty programowo przy użyciu obiektu proxy.
Składnia
//Create object to be proxied
Student student = new Student();
//Create the Proxy Factory
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);
//Add Aspect class to the factory
proxyFactory.addAspect(Logging.class);
//Get the proxy object
Student proxyStudent = proxyFactory.getProxy();
//Invoke the proxied method.
proxyStudent.getAge();
Gdzie,
AspectJProxyFactory - Klasa fabryczna do tworzenia obiektu proxy.
Logging.class - Klasa aspektu zawierająca porady.
Student - Klasa biznes, którą należy doradzić.
Aby zrozumieć powyższe pojęcia związane z proxy, napiszmy przykład, który zaimplementuje proxy. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring -
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetAge(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectGetAge()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
//Create the Proxy Factory
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);
//Add Aspect class to the factory
proxyFactory.addAspect(Logging.class);
//Get the proxy object
Student proxyStudent = proxyFactory.getProxy();
//Invoke the proxied method.
proxyStudent.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Age : 11
Zgodnie z wyrażeniami PointCut, może się zdarzyć, że zostaną zastosowane do innych fasoli, dla których porady nie są przeznaczone. Weźmy na przykład pod uwagę następujące wyrażenie.
execution(* com.tutorialspoint.*.getAge(..))
Za pomocą metody getAge () dodaje się nową fasolkę jarą i zacznie się do niej stosować porady, chociaż może to nie być zamierzone. Aby to osiągnąć, możemy utworzyć niestandardową adnotację i opisać metody, do których mają być stosowane porady.
@Before("@annotation(com.tutorialspoint.Loggable)")
Aby zrozumieć wspomniane wyżej pojęcia związane z @Before Advice, napiszmy przykład, który zaimplementuje @Before Advice. Aby napisać nasz przykład z kilkoma radami, przygotujmy działające środowisko Eclipse IDE i wykonaj następujące kroki, aby utworzyć aplikację Spring.
Krok | Opis |
---|---|
1 | Zaktualizuj projekt Studenta utworzony w rozdziale Wiosna AOP - Aplikacja . |
2 | Zaktualizuj konfigurację fasoli i uruchom aplikację, jak wyjaśniono poniżej. |
Poniżej znajduje się treść Logging.javaplik. W rzeczywistości jest to przykład modułu aspektu, który definiuje metody, które mają być wywoływane w różnych punktach.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("@annotation(com.tutorialspoint.Loggable)")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Poniżej znajduje się zawartość Loggable.java plik -
package com.tutorialspoint;
public @interface Loggable {
}
Poniżej znajduje się zawartość Student.java plik.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
@Loggable
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Poniżej znajduje się zawartość MainApp.java plik.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Poniżej znajduje się plik konfiguracyjny Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Uruchom projekt
Po utworzeniu plików źródłowych i konfiguracyjnych uruchom aplikację. Kliknij prawym przyciskiem myszy MainApp.java w swojej aplikacji i użyjrun as Java ApplicationKomenda. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat.
Going to setup student profile.
Name : Zara
Age : 11