使用不同类装入器的多个Spring应用程序上下文?
人们通常希望多个web应用程序共享对单个应用程序上下文的访问。说明了如何执行此操作,例如 这个问题正好相反:在一个web应用程序中有多个应用程序上下文。通常这很简单,您只需创建并使用它们 但是,在Spring方面存在一些由静态变量引起的情况,这是不可能的,例如:使用不同类装入器的多个Spring应用程序上下文?,spring,aspectj,Spring,Aspectj,人们通常希望多个web应用程序共享对单个应用程序上下文的访问。说明了如何执行此操作,例如 这个问题正好相反:在一个web应用程序中有多个应用程序上下文。通常这很简单,您只需创建并使用它们 但是,在Spring方面存在一些由静态变量引起的情况,这是不可能的,例如: 您有两个应用程序上下文X和Y,它们都创建了一个具有@Transactional注释的MyBean X和Y都包含自己的事务管理器 X和Y都有声明 您正在进行构建时AspectJ编织 在这种情况下,问题在于实际上被转换成如下bean:
- 您有两个应用程序上下文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
避免它
我可以想出三种解决办法:
@Configurable
选项2看起来并不有趣
选项3看起来是一条简单的出路
那么选项3是如何工作的呢?这就是我变得模糊的地方。我需要将Spring类加载到X和Y中的不同类加载器中。这意味着上下文类加载器不能正常地委托给它的父类(web应用程序类加载器),等等。您如何设置
谢谢。< /P>我喜欢<代码> @可配置。但是也许你应该考虑不要在Web应用程序上共享应用程序上下文,而是在你的Web应用程序中使用REST或RPC(参见FimaGLE)来进行IPC。尽管我仍然对选项3感兴趣,但我决定选择选项2。请参阅中的
@ThreadConfigurable
和@ThreadTransactional
,我可能也会这样做。。。甚至可以为@thread*
上使用的类加载器(或线程本地策略)添加参数。你能发布你的解决方案吗(回答你自己的问题没问题)。解决方案很抱歉,链接就在你的名字旁边,我有点错过了