如何将Spring XML Bean定义迁移至@Configuration类(含JMS配置)
Spring XML转@Configuration:JmsTemplate与JMS监听器配置迁移
一、迁移JmsTemplate Bean
XML中定义的jmsProducerTemplate可直接转为@Bean方法,通过参数注入对应连接工厂即可:
@Bean("jmsProducerTemplate") public JmsTemplate jmsProducerTemplate(ConnectionFactory connectionFactory) { JmsTemplate template = new JmsTemplate(); template.setConnectionFactory(connectionFactory); return template; }
注:此写法等价于XML中的
p:connectionFactory-ref="connectionFactory",Spring会自动注入匹配的connectionFactoryBean。
二、完善JmsListenerContainerFactory并配置监听器
你已编写的容器工厂需补充XML中acknowledge="auto"的配置,同时XML中的<jms:listener>并非在配置类中定义,而是通过@JmsListener注解标注在实际的监听类方法上:
1. 完善容器工厂
@Bean("myContainerFactory") public JmsListenerContainerFactory<?> myContainerFactory(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(false); // 对应队列模式,XML默认即为队列 factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); // 匹配XML的acknowledge="auto" return factory; }
2. 配置监听类(对应XML中的theListenerClassYouAreUsing)
创建监听类并标注@Component,在消息处理方法上用@JmsListener指定目标队列:
@Component public class TheListenerClassYouAreUsing { @JmsListener(destination = "YOURQUEUENAME", containerFactory = "myContainerFactory") public void handleMessage(Message message) { // 此处编写消息处理逻辑 } }
注:
@JmsListener的destination参数对应XML中<jms:listener>的destination属性,containerFactory指定我们配置的工厂Bean。
完整@Configuration类示例
@Configuration public class JmsConfig { // 假设你已实现连接工厂的Bean定义 @Bean public ConnectionFactory pooledConnectionFactory() { // 替换为你的实际连接工厂实现,比如ActiveMQConnectionFactory return new ActiveMQConnectionFactory("tcp://localhost:61616"); } @Bean("jmsProducerTemplate") public JmsTemplate jmsProducerTemplate(ConnectionFactory connectionFactory) { JmsTemplate template = new JmsTemplate(); template.setConnectionFactory(connectionFactory); return template; } @Bean("myContainerFactory") public JmsListenerContainerFactory<?> myContainerFactory(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(false); factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); return factory; } }
内容的提问来源于stack exchange,提问作者Jhoan Peguero
相关产品推荐
相关产品推荐

