我已在控制器中写下以下代码。
对于此 contrancterMethod 方法appectj pointcut表达式工作正常,但对于 executeService 方法方面不起作用。
@RequestMapping(value = "URL", method = RequestMethod.POST)
public ModelAndView controllerMethod(@ModelAttribute ModelAttribute reqModel, HttpServletRequest req, HttpServletResponse res) {
try {
response = executeService(param1, param2);
} catch (Exception e) {
}
}
private ResponseObject executeService(String param1, String param2){
//Code....
}
我写了下面的方面。
@Before("execution(* com.*.*.Controller.executeService(..))")
public void logBefore(JoinPoint joinPoint) {
logger.info("Before aspect: " + joinPoint.getSignature().getName());
}
您可以让我知道问题在哪里。在调用 executeService 方法之前,我需要执行方面。
因为AOP
不截止内部呼叫,因此您可以添加一个自我控制器字段,并通过self.method(...)
调用内部方法。以下代码:
@Controller
public class ExampleController{
@Autowired
private ExampleController self;
@RequestMapping(value = "URL", method = RequestMethod.POST)
public ModelAndView controllerMethod(@ModelAttribute ModelAttribute reqModel, HttpServletRequest req, HttpServletResponse res) {
try {
response = self.executeService(param1, param2);
} catch (Exception e) {
}
}
public ResponseObject executeService(String param1, String param2){
//Code....
}
}
您需要@requestmapping(value =" url",method = requestMethod.post(直接到执行服务然后其工作。
尽管我们的同事提供了正确的答案,但我会总结。
在实现方面时,Spring会生成一个包裹控制器的代理。代理的实现方式是,它具有特殊的钩子来调用班级之前和之后(或周围,完全更改流程(。
春季使用两种不同的策略来代理:
- java.lang.proxy
- 基于cglib
第一个通常更好,更快,但仅与接口一起使用。生成的代理是"某物"这实现了接口的所有方法。实现方法包含我之前讨论过的那些钩子,但是由于这些方法只是接口中的方法,因此它们必须是public
cglib-较慢,但也可以与类一起使用(虽然有一些限制(。它的工作方式是将父级和超级类提供的方法覆盖。这种新方法(让我们称其为 foo (将调用所有挂钩,如果需要的话,请致电super.foo()
。
现在,显然,这实际上无法使用私人方法,因为它不可能覆盖私人方法。这就是为什么我的同事指出private
在这里不起作用的原因。
现在关于自我注射的东西:
当您进入原始控制器的方法中,并且您只是尝试调用另一种方法(即使公开(,您不再使用代理人,您就会落后于代理和工作与原始课程。因此,这意味着您将无法利用"增强"的优势。方法。
这就是为什么有自我注射的原因 - 您可以看到(例如使用调试器(,自注射的依赖性实际上是所有代理的依赖性,这就是为什么它开始起作用的原因。
另一个解决方法是将方法重构为另一个弹簧豆,将此豆注入您的控制器,并为该豆提供一个定义。