如何排除 bean 或包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并创建适当的托管MBean。用于将创建的MBean分配给所需的服务器MBeanServer,必须在ApplicationContext中定义,通常使用标准MBeanServerFactoryBean完成,它返回平台相关MBeanServer。
问题出现了,因为我们使用Spring AOP进行一些增强操作,而AOP 后处理机制试图像普通bean一样处理平台mbeanServer,验证初始平台 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。