2012-06-10 15 views
6

Chciałem to wyjaśnić.Jaka jest wielka idea implementacji AOP?

Przeczytałem o koncepcji AOP i zrozumiałem, że to świetny sposób na dzielenie się usługami przekrojowymi. (rejestrowanie, bezpieczeństwo, transakcja ...)

Ale chciałbym powiedzieć/zapytać o coś takiego i jego wdrożenie.

Przeczytałem, że istnieją pewne sposoby, takie jak AspectJ, JBOSS AOP w celu asymilacji AOP do mojej logiki biznesowej.

ale nie było to już dawno temu?

powiedzmy na przykład chcę podzielić implementacja rejestrowania lub bezpieczeństwa amongs moje składniki (fasola Java, EJB, cokolwiek ..)

Dlaczego nie mogę dokonać fasola Singleton upewniając się, że tak jest tylko jeden instancja i jak tylko każdy komponent będzie potrzebował jego usługi logowania/bezpieczeństwa, wyszuka i użyje swojej usługi.

Dlaczego muszę rozumieć i mieć wszystkie te "duże" implementacje, takie jak aspektj lub jboss AOP? Czego tu brakuje?

Odpowiedz

9

Ideą AOP jest utrzymanie wspólnej logiki w jednym miejscu (co rozwiązuje również rozwiązanie singleton). i "niewidzialny" (przezroczysty). Dzięki AOP twój kod logowania nie jest nawet częścią logiki biznesowej, jest "wtłaczany" za kulisami.

Jest także bardziej dynamiczny - nie trzeba wywoływać usługi singleton za każdym razem, gdy trzeba się zalogować. Wystarczy raz skonfigurować punktak (na przykład: "wszystkie setery w tym pakiecie"), a rejestracja zostanie zastosowana do wszystkich istniejących i nowych kodów.

Co więcej, AOP jest znacznie bardziej elastyczny i potężniejszy. Możesz zapytać o implementację AOP: "proszę uruchomić transakcję za każdym razem, gdy wywołasz metodę zaczynającą się od" save* "i biorąc jeden argument" lub "jeśli metoda zwracająca Customer rzuca podklasę wyjątku z IllegalAgumentException, wywołaj tę metodę ponownie".

AOP to coś więcej niż tylko grupowanie wspólnej logiki.

+0

Co się stanie, jeśli stworzę klasę nadrzędną i rozszerzę, jeśli moje klasy się przed nią rozciągną. Mogę umieścić całą moją logikę "permentu" w tej klasie rodziców. kiedy klasa go rozszerzy, będzie mogła cieszyć się wszystkimi loggig/secutiry ... metodami, które wcześniej zadeklarowałem. Mogę również tworzyć dodatkowe metody "twórz"/"niszcz" dla loggigowania i takie .. – rayman

+0

@rayman: ale musisz jeszcze ** wywołać ** te metody jawnie (patrz świetny przykład kodu * JB Nizet *). AOP zrobi to za Ciebie, gdy zostaniesz poinstruowany, także za kod, którego jeszcze nie napisałeś! Oznacza to również, że nowi programiści będą korzystać z funkcji logowania/bezpieczeństwa, nawet o tym nie wiedząc.Nie wspominając już o tym, że nie zaśmiecasz swojego kodu klasami podstawowymi/metodami pomocniczymi. –

+0

Mybe możesz sprawdzić mój ostatni komentarz do JB. – rayman

6

Nie zrozumiałeś, o co chodzi w AOP. Pomysł AOP jest, aby móc napisać

public void foo() { 
    // some business code 
} 

zamiast pisać

public void foo() { 
    LogManager.getInstance().log("entering foo..."); 
    SecurityManager.getInstance().checkUserInRole("fooer"); 
    TransactionManager.getInstance().startTransaction(); 
    try { 
     // some business code 
     TransactionManager.getInstance().commit(); 
    } 
    catch(RuntimeException e) { 
     TransactionManager.getInstance().rollback(); 
     throw e; 
    } 
    LogManager.getInstance().log("leaving foo..."); 
} 

wszystkich problemów przekrojowych (logowanie, bezpieczeństwa, zarządzania transakcjami) są poza kodem biznesu, zamiast zmieszane z kodem biznesowym i powtarzające się reklamy.

+0

Ale nadal musisz powiedzieć logice AOP, kiedy/gdzie chcesz korzystać z tych usług .. skąd będzie wiedział, że chcę zalogować wejście/wyjście z metody? lub jeśli chcę tylko zalogować.debug coś w środku mojej metody .. some1 trzeba powiedzieć, aby to zrobić. nie mogę czytać w moich myślach. – rayman

+0

Zwykle robi się to deklaratywnie, w pliku konfiguracyjnym lub przy użyciu adnotacji Java. Na przykład Spring umożliwia oznaczenie metody za pomocą '@ Transactional'. Umożliwia także konfigurowanie przechwytywacza AOP w celu utworzenia wszystkich metod dla wszystkich ziaren, których nazwa klasy kończy się na transakcję 'ServiceImpl' (jest to tylko przykład). Jeśli chcesz zalogować coś w środku metody, AOP nie pomoże. –

+0

Więc użyję go do logowania/bezpieczeństwa tylko ... czy nie jest to zbyt przesadzone? czy jest więcej rozwiązań, z których mógłbym skorzystać AOP poza trzema, o których wspomniałeś wcześniej? – rayman

Powiązane problemy