Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不同类装入器的多个Spring应用程序上下文?_Spring_Aspectj - Fatal编程技术网

使用不同类装入器的多个Spring应用程序上下文?

使用不同类装入器的多个Spring应用程序上下文?,spring,aspectj,Spring,Aspectj,人们通常希望多个web应用程序共享对单个应用程序上下文的访问。说明了如何执行此操作,例如 这个问题正好相反:在一个web应用程序中有多个应用程序上下文。通常这很简单,您只需创建并使用它们 但是,在Spring方面存在一些由静态变量引起的情况,这是不可能的,例如: 您有两个应用程序上下文X和Y,它们都创建了一个具有@Transactional注释的MyBean X和Y都包含自己的事务管理器 X和Y都有声明 您正在进行构建时AspectJ编织 在这种情况下,问题在于实际上被转换成如下bean:

人们通常希望多个web应用程序共享对单个应用程序上下文的访问。说明了如何执行此操作,例如

这个问题正好相反:在一个web应用程序中有多个应用程序上下文。通常这很简单,您只需创建并使用它们

但是,在Spring方面存在一些由静态变量引起的情况,这是不可能的,例如:

  • 您有两个应用程序上下文X和Y,它们都创建了一个具有
    @Transactional
    注释的
    MyBean
  • X和Y都包含自己的事务管理器
  • X和Y都有
    声明
  • 您正在进行构建时AspectJ编织
在这种情况下,问题在于
实际上被转换成如下bean:

<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect"
  factory-method="aspectOf"/>

请注意,这将返回
AnnotationTransactionSpect
的aspect对象,该对象是存储在静态变量中的单例
AnnotationTransactionSpect
扩展了
TransactionSpectSupport
,其中包含缓存事务管理器等实例字段

其效果是,即使X和Y中的bean完全分离,它们仍将在
annotationtransactionspect
方面单例中争夺相同的实例字段。这会导致例如“无事务正在进行”异常,因为有人使用了错误的事务管理器

@Configurable
也会发生同样的情况:用于配置bean的bean工厂存储在一个静态变量中(请参见
注释BeanConfigureSpect.BeanConfigureSupport
)。这是一个更大的问题,因为您可以通过
@Transactional
避免AspectJ,但不能通过
@Configurable
避免它

我可以想出三种解决办法:

  • 停止使用方面
  • 写我自己的方面
  • 在创建X和Y的线程中创建/设置新的上下文类加载器
  • 选项#1不好,因为我非常喜欢
    @Configurable

    选项2看起来并不有趣

    选项3看起来是一条简单的出路

    那么选项3是如何工作的呢?这就是我变得模糊的地方。我需要将Spring类加载到X和Y中的不同类加载器中。这意味着上下文类加载器不能正常地委托给它的父类(web应用程序类加载器),等等。您如何设置


    谢谢。< /P>我喜欢<代码> @可配置。但是也许你应该考虑不要在Web应用程序上共享应用程序上下文,而是在你的Web应用程序中使用REST或RPC(参见FimaGLE)来进行IPC。尽管我仍然对选项3感兴趣,但我决定选择选项2。请参阅中的

    @ThreadConfigurable
    @ThreadTransactional
    ,我可能也会这样做。。。甚至可以为
    @thread*
    上使用的类加载器(或线程本地策略)添加参数。你能发布你的解决方案吗(回答你自己的问题没问题)。解决方案很抱歉,链接就在你的名字旁边,我有点错过了