如何从 Spring AOP 处理范围中排除bean或包?
我在 JBoss 上修复 Spring Integration JMX 支持问题时遇到了这个问题。
作为开发环境,我们使用 Spring 3.2.0.RELEASE , Spring Integration 2.2.0.RELEASE 和 Jboss AS 7.1.1
启用 Spring Integration JMX 时,实际上是在创建 IntegrationMBeanExporter ,它从底层 ApplicationContext中提取所有 Spring Integration 相关bean 并创建适当的托管 MBeans 。用于将创建的 MBean 分配给所需的服务器 MBeanServer ,必须在 ApplicationContext 中定义,这通常使用标准 MBeanServerFactoryBean ,返回与平台相关的 MBeanServer 。
问题出现了,因为我们使用 Spring AOP 进行了一些增强操作,而 AOP后期处理机制正在尝试处理平台 mbeanServer 像常规 bean 一样,针对内部切入点验证初始平台ClassLoader ,最终无法做到。
这似乎与https://jira.springsource.org/browse/SPR-9335类似,但具有通用细节。
作为解决方案,我阻止 spring 处理 mbeanServer 作为ApplicationContext的一部分:
<bean id="jmxIntegration" scope="singleton" class="org.springframework.integration.monitor.IntegrationMBeanExporter">
<property name="server" value="#{ T(org.springframework.jmx.support.JmxUtils).locateMBeanServer() }"/>
</bean>
这很有效,但这似乎是一个更通用的问题, AOP 。
另外有趣的是,春天的 MBeanExporter 也指 JmxUtils 而不是上下文的 MBeanServer 。