@ AL13N: Kendi yanıtınız doğrudur, ancak ek açıklamaları bir parametreye bağlarsanız yansıma kullanmanız gerekmez. İşte POJO + AspectJ'de bir örnek. Spring AOP olarak bu da, aynı olmalıdır: Ana yöntemle
Örnek kontrol:
package de.scrum_master.app;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MyController {
@RequestMapping(value="/some/path", method=RequestMethod.POST)
public void foo() {
System.out.println("foo");
}
public void bar() {
System.out.println("bar");
}
public static void main(String[] args) {
MyController controller = new MyController();
controller.foo();
controller.bar();
}
}
Unsur:
btw
package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.web.bind.annotation.RequestMapping;
public aspect RequestMappingInterceptor {
@Pointcut(
"within(@org.springframework.stereotype.Controller *) && " +
"@annotation(requestMapping) && " +
"execution(* *(..))"
)
public void controller(RequestMapping requestMapping) {}
@Before("controller(requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping requestMapping) {
System.out.println(thisJoinPoint);
System.out.println(" " + requestMapping);
System.out.println(" " + requestMapping.method()[0]);
}
}
, pointcut arasında && execution(* *(..))
parçasıdır Muhtemelen Spring AOP'da gerekli değildir, çünkü zaten yürütme noktalarını bilmektedir. AspectJ'de, AspectJ daha güçlü olduğu için call()
ve diğer türdeki pointcut'ları hariç tutmanız gerekir. Yine de incitmez ve daha güvenli ve daha açıktır.
Konsol çıkışı:
execution(void de.scrum_master.app.MyController.foo())
@org.springframework.web.bind.annotation.RequestMapping(headers=[], name=, value=[/some/path], produces=[], method=[POST], params=[], consumes=[])
POST
foo
bar
Düzenleme: Bahar AOP AspectJ'yi değil iken bu düzenin ısrar görünüyor çünkü Değiştirmeli parametreleri, joinpoint ilk danışma yöntemi parametre kılacak şekilde.
'@ Controller' bean'ını alın, çağrılan yöntemi alın, notu alın,' method' özniteliğini alın. –