Od razu stworzyłem sobie working set dla projektów aspektowych:
Dobra czas teraz wrócić do programowania aspektowego, przypuśćmy, że nasza klasa Graphic będzie tworzona przez jakąś fabrykę (która będzie pobierać dane z jakiegoś CMS). Każdy obiekt Graphic będzie zawierał informacje, czy można nim poruszać czy nie. Nasze zdanie polega na tym, żeby tak zdefiniować aspekt, że jeżeli obiekt będzie miał możliwość poruszania się to należy wykonać ciało metody move() w innym wypadku je pominąć. Rady przed (before) i po (after) metodzie były zawsze wykorzystywane przed i po wywołaniu metody, którą przecinały. Szybkie spojrzenie do dokumentacji i kogoś nam jeszcze brakuje :) rady dookoła (around), która umożliwia sprawdzenie czegoś przed wykonaniem i po, ale ma ten plus, że można w niej zdefiniować czy punkt przecięcia ma pozwolić na wykonanie ciała metody, którą przecina. Dobra zobaczmy jak to teraz wygląda w kodzie, najpierw klasa Graphic.java
public class Graphic{
private boolean isMovable = false;
public void move(){
System.out.println("Moving");
}
public static void main(String[] args) {
Graphic graphic = new Graphic();
System.out.println("Before moving");
graphic.move();
System.out.println("Change graphic to movable true");
graphic.setMovable(true);
graphic.move();
System.out.println("End");
}
void setMovable(boolean isMovable) {
this.isMovable = isMovable;
}
public boolean isMovable() {
return isMovable;
}
}
Teraz definiujemy nasz aspekt Secure.aj:
package com.itsilesia.aspects;
public aspect Secure {
pointcut checkSecure(com.itsilesia.Graphic graphic):target(graphic) && execution(* com.itsilesia.Graphic.mo*(..));
void around(com.itsilesia.Graphic graphic) : checkSecure(graphic) {
if(graphic.isMovable()){
proceed(graphic);
}else{
System.out.println("Can't move graphic");
}
}
}
Co tutaj mamy, najpierw definiujemy punkt przecięcia, który będzie uwzględniał wszystkie metody klasy Graphic które są (* com.itsilesia.Graphic.mo*(..))
- * oznacza zasięg, w naszym przypadku możemy mieć (public, private, protected i paczkowy)
- com.itsilesia.Graphic.mo*(..) punkt przecięcia nastąpi podczas uruchamiania obiektów klasy Graphic których metody zaczynają się od mo, i mogą ale nie muszą pobierać parametry
- target(graphic) definiuje, że nasz obiekt docelowy ma być typu Graphic.
Później jest nasza rada (advice) dookoła (around) która sprawdza czy dany obiekt graficzny może być poruszony. Jeśli tak to wtedy pozwala na wykonanie ciała metody którą przecina, za pomocą proceed(obiekt), w przeciwnym wypadku wypisuje komunikat o nie możliwości poruszanie obiektu. W Eclipse 3.4M uruchamiamy naszą aplikacje za pomocą Run us->Java Application rezultat poniżej:
Before moving
Can't move graphic
Change graphic to movable true
Moving
End
Teraz można sobie jeszcze wyświetlić Visualiser - AspectJ Provider Window->Open Perspective->Other...->Aspect Visualization.
Na koniec skoro jak już używa Eclipse 3.4M to dorzucam moją ulubioną wtyczkę Mylyn (download.eclipse.org/tools/mylyn/update/e3.4 )(na pewno poświecę jej jeden wpis:) )
Plan przygotowany:)
public class Graphic{
private boolean isMovable = false;
public void move(){
System.out.println("Moving");
}
public static void main(String[] args) {
Graphic graphic = new Graphic();
System.out.println("Before moving");
graphic.move();
System.out.println("Change graphic to movable true");
graphic.setMovable(true);
graphic.move();
System.out.println("End");
}
void setMovable(boolean isMovable) {
this.isMovable = isMovable;
}
public boolean isMovable() {
return isMovable;
}
}
Teraz definiujemy nasz aspekt Secure.aj:
package com.itsilesia.aspects;
public aspect Secure {
pointcut checkSecure(com.itsilesia.Graphic graphic):target(graphic) && execution(* com.itsilesia.Graphic.mo*(..));
void around(com.itsilesia.Graphic graphic) : checkSecure(graphic) {
if(graphic.isMovable()){
proceed(graphic);
}else{
System.out.println("Can't move graphic");
}
}
}
Co tutaj mamy, najpierw definiujemy punkt przecięcia, który będzie uwzględniał wszystkie metody klasy Graphic które są (* com.itsilesia.Graphic.mo*(..))
- * oznacza zasięg, w naszym przypadku możemy mieć (public, private, protected i paczkowy)
- com.itsilesia.Graphic.mo*(..) punkt przecięcia nastąpi podczas uruchamiania obiektów klasy Graphic których metody zaczynają się od mo, i mogą ale nie muszą pobierać parametry
- target(graphic) definiuje, że nasz obiekt docelowy ma być typu Graphic.
Później jest nasza rada (advice) dookoła (around) która sprawdza czy dany obiekt graficzny może być poruszony. Jeśli tak to wtedy pozwala na wykonanie ciała metody którą przecina, za pomocą proceed(obiekt), w przeciwnym wypadku wypisuje komunikat o nie możliwości poruszanie obiektu. W Eclipse 3.4M uruchamiamy naszą aplikacje za pomocą Run us->Java Application rezultat poniżej:
Before moving
Can't move graphic
Change graphic to movable true
Moving
End
Teraz można sobie jeszcze wyświetlić Visualiser - AspectJ Provider Window->Open Perspective->Other...->Aspect Visualization.
Na koniec skoro jak już używa Eclipse 3.4M to dorzucam moją ulubioną wtyczkę Mylyn (download.eclipse.org/tools/mylyn/update/e3.4 )(na pewno poświecę jej jeden wpis:) )
Plan przygotowany:)
2 komentarze:
I love your pictures, good blog!
Dzięki za tego tutoriala, powiedział mi o AOP więcej niż Wikipedia i pierdyliarad PDF-ów z których próbowałem się dowiedzieć o co chodzi.
Prześlij komentarz