收集Spring MVC流程中的所有方法名称

时间:2017-03-03 02:13:38

标签: java spring spring-mvc spring-security

我是Spring MVC的新手。我正在开发一个应用程序,在进入登录控制器之前,它在安全控制器中执行一些过程。我不知道在登录时访问我的代码中的所有方法。

所以我想知道在登录时是否有办法记录应用程序流中的所有方法?

请帮帮我。

感谢。

2 个答案:

答案 0 :(得分:0)

最干净,最恰当的方法是在应用程序中实现正确的日志记录。那样,你现在就完全是方法的流程了。

否则,您始终可以使用Thread.currentThread().getStackTrace()来确定访问了哪些方法。

答案 1 :(得分:0)

您可以使用面向方面编程。 Spring使用代理提供了自己的AOP实现(但是有一些限制 - 例如,你不能建议私有方法)。作为替代方案,您也可以使用AspectJ。无论如何,这是使用Spring AOP建议应用程序的任何公共方法的示例代码:

@Around(value = "publicMethod()")
public Object logMethod(ProceedingJoinPoint joinPoint) {
    // TODO: access method details using joinPoint
    // e.g. access the public method name
   MethodSignature methodSignature = (MethodSignature) joinPoint
                    .getSignature();
   // do anything you want with the method's name, for instance log it
   LOGGER.debug("Public method invoked: {}", methodSignature.getMethod().getName());

   return joinPoint.proceed();
}

@Around(value= "publicMethod()")注释使用自定义切入点,定义为使用@Pointcut注释的方法:

@Pointcut("execution(public * your.app.package.*.*(..)) ")
private void publicMethod() {
    // this is just a declaration required by AOP framework - we don't need to insert any code here
}

要使一切正常,您需要在配置类中添加@EnableAspectJAutoProxy注释:

@ComponentScan(value = "your.app.package")
@Configuration
@EnableAspectJAutoProxy
public class TestConfig
{
}

注意:注意不要建议你的AOP课程 - 这会弄乱一些事情。您可以将AOP类放在单独的包中(例如your.app.aop)或在potcut定义中使用排除(!within(your.app.aop..*))。

请阅读一些关于AOP的文章,以便更好地理解这个想法。官方Spring文档应该没问题 - https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html