某项目在使用JBPM实现节点监听时,发现监听类使用的全局变量始终无法得到在流程图上定义的值。经过几番试验终于发现在原来
是Spring 在进行反射时候CgLib策略。关于Spring的Cglib代理http://blog.csdn.net/mini_snow/archive/2009/08/03/4404558.aspx这里有比
较初步的介绍。某项目的Spring配置文件applicationContext.xml中AOP配置如下:
这里我们可以看到现在的AOP配置是把切面切在了Manager层的类,所以在这一层Spring会启用Cglib策略,所有调用到
Manager层的类都是被Cglib所代理的类。
但是,在原来的配置文件中
这两段配置时有效的,而我们Service层的类基本都继承了HibernateEntityDao,所以在原来系统调用过程中Service层的类
也是被被Cglib所代理的类。
我们在使用JBPM节点监听中,JBPM所使用的是JDK的反射来赋给全局变量的值,这样如果把切面同时切早Dao的类时,
相当于JBPM先用JDK的反射来赋给全局变量的值,然后Cglib把代理出来的类又覆盖了原来的类,导致了JBPM监听赋值
的失败。