gpt4 book ai didi

java - 我是否应该在 Spring 中手动重置 Autowired Bean 的状态数据(因为它是单例)?

转载 作者:行者123 更新时间:2023-12-01 07:43:22 26 4
gpt4 key购买 nike

我在项目中使用 org.springframework.jms.core.JmsTemplate; 将消息发送到 SQS 队列。

我在 @Service 中 Autowiring 了 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默认是单例的。如果我使用了 jmsTemplate bean 的 setter,我应该重置它吗?在我的示例中,我应该在方法 sendMessageToFifo 的末尾添加以下内容吗:

jmsTemplate.setDeliveryDelay(0);

如果我不添加这个,当我调用 sendMessage 而不是 sendMessageToFifo 时,传递延迟不会为零,对吗?

另外,我想问一下 Autowiring bean的调用 setter 是否有最佳实践?

最佳答案

默认情况下,所有 bean 都是单例,所以一种方法是重置它。

但恕我直言,这是一个丑陋的解决方案。

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

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

关于java - 我是否应该在 Spring 中手动重置 Autowired Bean 的状态数据(因为它是单例)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60697448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com