如何在 Spring webflow 中建议 flowscope bean

How to advice flowscope bean in Spring webflow

我的项目正在使用 Spring web flow 2.4,我需要使用 Spring AOP 来建议 flow scope bean 来处理日志记录等方面的需求。 这是方面 class:

@Aspect
@Component
public class LogFlowEventExecutor {
    @Pointcut("execution(public * com.xyz.app.flow.*FlowBean.*(..))")
    private void flowFunction() {}

    @Before("flowOperation()")
    public void logFlowEvent(JoinPoint jp) throws Throwable {
        //logic ignored
        ...
    }
}

并在根 WebApplicationContext 中定义自动代理:

<aop:aspectj-autoproxy />

和每个人-flow.xml 文件

<flow xmlns="http://www.springframework.org/schema/webflow"...>
    <var name="abcFlowBean" class="com.xyz.app.flow.AbcFlowBean" />
    ...
</flow>

我使用相同的模式轻松地为服务 bean 和控制器提供建议,但它不适用于流作用域的 bean,切面永远不会执行。 我认为它可能与 JDK 动态接口代理有关,但它也与 CGLIB 一起失败(设置了 proxy-target-class="true" 属性)。切入点从未被拦截。所以我怀疑流作用域 bean 在实例化时从未被正确代理。

我尝试切换到 LTW,但它抛出了一个 NoSuchMethodError(该 bean 是从 weaveinfo 日志中编织的)。也许单独开一个线程会更好。

我的问题是是否可以使用 Spring AOP 来建议流作用域 bean 以及如何去做?

我通过编写一个 Flow ExecutionListener 解决了这个问题,基本上 FlowExecutionListener 定义了很多回调方法,当在流程执行生命周期过程中发生某些事情时将调用这些回调方法。所以我创建了一个自定义侦听器 class 从 FlowExecutionListenerAdapter 扩展,它通过使用空方法体实现所有方法并覆盖我感兴趣的内容,如果你想对所有流程进行全局回调,这几乎具有与 AOP 相同的效果范围豆。但如果你只需要拦截其中的几个,那就另当别论了。

public class MyFlowExecutionListener extends FlowExecutionListenerAdapter{
    @Override
    public void eventSignaled(RequestContext context, Event event) {...}
    @Override
    public void transitionExecuting(RequestContext context, TransitionDefinition transition) {...}
    @Override
    public void viewRendered(RequestContext context, View view, StateDefinition viewState) {...}
    @Override
    public void exceptionThrown(RequestContext context, FlowExecutionException exception) {...}
    ...
}