Chcę monitorować wszystkie metody publiczne wszystkich klas z określoną adnotacją (powiedzmy @Monitor) (uwaga: adnotacja jest na poziomie klasy). Co mogłoby być w tym przypadku możliwe? Uwaga: używam Spring AOP w stylu @AspectJ.
java
aop
aspectj
spring-aop
Rejeev Divakaran
źródło
źródło
Odpowiedzi:
Należy połączyć punkt przekroju typu z punktem przekroju metody.
Poniższe wskazówki wykonają pracę, aby znaleźć wszystkie metody publiczne wewnątrz klasy oznaczonej adnotacją @Monitor:
Poradź ostatni punkt cięcia, który łączy dwa pierwsze i gotowe!
Jeśli jesteś zainteresowany, napisałem tutaj ściągawkę w stylu @AspectJ z odpowiednim przykładowym dokumentem tutaj.
źródło
Korzystanie z adnotacji zgodnie z opisem w pytaniu.
Adnotacja:
@Monitor
Adnotacja na temat zajęć
app/PagesController.java
:Adnotacja o metodzie
app/PagesController.java
:Niestandardowe adnotacji
app/Monitor.java
:Aspekt do adnotacji
app/MonitorAspect.java
:Włącz AspectJ,
servlet-context.xml
:Obejmują bibliotek AspectJ,
pom.xml
:źródło
Monitor
musi być wiosnąComponent
?Component
Adnotacji służy powiedzieć pojemnik Wiosna zastosowania obejmują klasę w AspectJ tkacz rzeczy. Domyślnie Wiosna tylko patrzyController
,Service
i inne adnotacje konkretne, ale nieAspect
.@Component
adnotacji na@interface
nieAspect
. Dlaczego jest to potrzebne?@Component
Adnotacja czyni go tak Wiosna będzie skompilować go z systemem aspekt zorientowane AspectJ IoC / DI. Nie wiem, jak inaczej to powiedzieć. docs.spring.io/spring/docs/3.2.x/spring-framework-reference/…Coś w tym stylu:
Pamiętaj, że nie możesz mieć żadnych innych porad dotyczących tej samej klasy przed tą, ponieważ adnotacje zostaną utracone po przesłaniu proxy.
źródło
Posługiwać się
źródło
powinno wystarczyć oznaczenie metody aspektu w ten sposób:
spójrz na to, aby zapoznać się z przewodnikiem krok po kroku.
źródło
Można również zdefiniować punkt przekroju jako
źródło
execution(public * @Monitor *.*(..))
działa.Najprostszym sposobem wydaje się być:
Przechwytuje wykonanie wszystkich metod z adnotacją „@MyHandling” w klasie „YourService”. Aby przechwycić wszystkie metody bez wyjątku, wystarczy umieścić adnotację bezpośrednio w klasie.
Bez względu na zakres prywatny / publiczny tutaj, ale pamiętaj, że spring-aop nie może używać aspektu dla wywołań metod w tej samej instancji (zwykle prywatnych), ponieważ w tym przypadku nie używa klasy proxy.
Używamy tutaj porady @Around, ale w zasadzie jest to ta sama składnia z @Before, @After lub jakąkolwiek radą.
Nawiasem mówiąc, adnotacja @MyHandling musi być skonfigurowana w następujący sposób:
źródło
// perform actions after
Nigdy nie będzie sprawdzony ponieważ mamy do zwrotu wartości w wierszu poprzednim.Możesz użyć Springa PerformanceMonitoringInterceptor i programowo zarejestrować poradę za pomocą beanpostprocessor.
źródło
Od wiosny
AnnotationTransactionAspect
:źródło