expackJ点cut表达式不适用于一种方法,而是为单一类中的另一种方法工作



我已在控制器中写下以下代码。

对于此 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在这里不起作用的原因。

现在关于自我注射的东西:

当您进入原始控制器的方法中,并且您只是尝试调用另一种方法(即使公开(,您不再使用代理人,您就会落后于代理和工作与原始课程。因此,这意味着您将无法利用"增强"的优势。方法。

这就是为什么有自我注射的原因 - 您可以看到(例如使用调试器(,自注射的依赖性实际上是所有代理的依赖性,这就是为什么它开始起作用的原因。

另一个解决方法是将方法重构为另一个弹簧豆,将此豆注入您的控制器,并为该豆提供一个定义。

最新更新