我试图使用注释@myfinder
和返回值result
拦截方法test()
。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Myfinder {}
@Aspect
@Component
public class MyAspect {
@AfterReturning(value="@annotation(com.<MypackageHide>.MyFinder)",returning="result")
public void after(JoinPoint joinPoint, Result result) {
//something
}
但是只有当我通过rest api/test
调用它时才会截获它。即使从repaise()
方法调用此方法,我也希望拦截。
@RequestMapping(path = "/repair")
@RestController
@Configurable
public class MyController {
@PostMapping("")
public ResponseEntity<String> repair() {
//some code
test(); // <=============== not intercepted if i call /repair
return ResponseEntity.ok("dummy");
}
@MyFinder
@PostMapping("/test") // <===== intercepted if i call this independently
public Result test() {
System.out.println("^^^^^^^");
return (Result) null;
}
}
我希望即使调用/repaine
也能调用此函数
我对AOP相当陌生
Spring AOP在代理上工作。从repair()调用test()称为自调用。Spring AOP将不能通知从repair()调用test()的方法,因为它不会通过代理。
Spring参考文档:了解AOP代理。通读这一节,首先要理解的关键是main(..)中的客户端代码
如果您仍然想要拦截和通知这样的方法调用,您可以将控制器实例autowire到同一个类,如下所示。我建议您重构代码,但为了演示这种可能性,下面的代码将会起作用。
@RequestMapping(path = "/repair")
@RestController
@Configurable
public class MyController {
@Autowired
MyController self;
@PostMapping("")
public ResponseEntity<String> repair() {
//some code
self.test(); // <=============== self reference
return ResponseEntity.ok("dummy");
}
@MyFinder
@PostMapping("/test") // <===== intercepted if i call this independently
public Result test() {
System.out.println("^^^^^^^");
return (Result) null;
}
}
有多篇关于如何在Spring AOP中拦截内部方法调用的帖子。但是找不到任何与使用AspectJ排除内部方法相关的帖子。我们希望使用AspectJ编译时编织来实现它promise的运行时性能改进。 如果另一个类的方法调用了下面类TestService中的任何公共方法,则应该拦截该调用。但是,不应该截取从method1()到method2()的内部调用。我们只希望拦截器对每个对象只拦截一次。 一个示
问题内容: 除了LD_PRELOAD技巧和用您提供的系统内核替换某个系统调用的Linux内核模块外,是否有可能拦截一个系统调用(例如打开),以便它在实际打开之前先经过您的函数? 问题答案: 如果您确实需要解决方案,那么您可能会对可以完成此操作的DR rootkit感兴趣,请访问http://www.immunityinc.com/downloads/linux_rootkit_source.tbz
我试图截取带注释方法的执行,以记录执行时间;因此,我创建了一个新注释: 我将注释应用于我想要跟踪的方法(该方法的类没有注释,如@Service或@Component;这是一个问题吗?) 然后我创建类和@周围方法: 我在pom中添加了spring boot starter aop依赖项,并在主类中添加了@EnableSpectProxy(带@SpringBootApplication注释的类)。我希
我正在尝试使用来做同样的事情,现在我使用哪个注释来捕获相关的对象,切入点表达式应该是什么?我尝试了,但这是一个void方法,如何捕获该方法的参数?我是AOP的初学者,所以如果这个问题太琐碎,请原谅。 解决方案:使用spring AOP获取方法参数?
问题内容: 我想拦截对某个类MyClass的所有方法调用,以便能够对某些setter调用做出反应。 我尝试使用动态代理,但据我所知,这仅适用于实现某些接口的类。但是MyClass没有这样的接口。 除了实现包装器类之外,还有其他方法可以将所有调用委派给成员(成员是MyClass的实例或使用AOP进行支持)吗? 问题答案: 如您所述,您不能使用JDK动态代理(无接口),但是使用Spring和CGLIB