我应该在Spring手动重置Autowired Bean的状态数据吗(因为它是Singleton)



我使用的是org.springframework.jms.core.JmsTemplate在我的项目中向SQS队列发送消息。

我在@Service 中自动连接JmsTemplate

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
@Service
public class AmazonSQSPublisherImpl implements AmazonSQSPublisher {
@Autowired
private JmsTemplate jmsTemplate;
@Override
public boolean sendMessageToFifo(String queueName, String message,
String messageGroupId, String messageDedupeId, long delayTime) throws EventBrokerException {
jmsTemplate.setDeliveryDelay(delayTime);
jmsTemplate.send(queueName, session -> {/* somemessage here*/});
}
@Override
public boolean sendMessage(String queueName, String message) throws EventBrokerException {
jmsTemplate.convertAndSend(queueName, message);
}
}

在这里,我在jmsTemplate中使用setDeliveryDelay。所以我的问题是:正如我所知,bean在默认情况下是单例的。如果我使用了jmsTemplatebean的setter,我应该重置它吗?在我的例子中,我应该在方法sendMessageToFifo:的末尾添加这个吗

jmsTemplate.setDeliveryDelay(0);

如果我不添加此项,当我调用sendMessage而不是sendMessageToFifo时,传递延迟将不会为零,对吧?

此外,我想问一下,对于自动连线bean的调用设置器,是否有任何最佳实践??

默认情况下,所有bean都是singleton的,所以有一种方法是重置它

但这是一个丑陋的解决方案。

您应该定义一个自定义配置的专用JmsTemplate@Bean,然后在需要的地方定义autowire

如果任何其他地方都需要另一个JmsTemplate,则可以定义第二个@Bean,并使用@Qualifiers将这两个位置分隔开。

默认情况下,所有bean都是singleton,所以我认为您应该按照建议重置它。

如Spring的文档所述:

singleton作用域是Spring中的默认作用域。(…(当一个bean是singleton时,只有一个bean的共享实例被管理,以及对具有与之匹配的一个或多个id的bean的所有请求bean定义将导致一个特定的bean实例Spring容器返回。

这意味着下次调用jmsTemplate时,它将具有以前添加的状态数据。

还有其他bean作用域,您可以在上面的源代码中查看。

就通过@AutoWired注释使用字段注入而言,由于此处列出的各种问题,通常不认为这是一种好的做法(更喜欢构造函数或setter注入(。

相关内容

  • 没有找到相关文章

最新更新