通过合并构造函数所需的参数来完善 Spring 字段注入

问题描述 投票:0回答:1

我已经创建了这个类,问题是我想创建一个只需要 JDA 和 ScheduledExecutorService 的构造函数。我希望 Spring 自动注入其余的依赖项。

最初,我有一个包含所有依赖项和@Autowired 的构造函数。问题是,作为一个 Runnable,当我调用它时,我需要将所有依赖项作为构造函数参数传递。这变得很麻烦,因为它意味着调用类必须了解并提供这些依赖项。

也可以将 @AutoWired 放在我的字段上,但这已被弃用,特别是 nullPointerException 的原因

我怀疑我的处理方法不正确,但我希望得到帮助,让我的代码更干净并实现正确的依赖注入。

public class YoutubeAlertTask implements Runnable{

    private final ScheduledExecutorService scheduledExecutorService;
    private final JDA jda;

    private YoutubeChannelRepository youtubeChannelRepository;
    private MessageManager messageManager;
    private YoutubeAPIService youtubeAPIService;
    private final Logger LOGGER = LoggerFactory.getLogger(YoutubeAlertTask.class);

    public YoutubeAlertTask(ScheduledExecutorService scheduledExecutorService, JDA jda){
        this.scheduledExecutorService = scheduledExecutorService;
        this.jda = jda;
    }
}

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
executorService.scheduleAtFixedRate(new YoutubeAlertTask(executorService, event.getJDA(), youtubeChannelRepository, messageManager), 0, 1, java.util.concurrent.TimeUnit.MINUTES);
java spring dependency-injection
1个回答
0
投票

您可能会发现类似于工厂模式的东西比使用构造函数更有用。

public class YoutubeAlertTaskFactory {
    private YoutubeChannelRepository youtubeChannelRepository;
    private MessageManager messageManager;
    private YoutubeAPIService youtubeAPIService;

    @Autowired
    public YoutubeAlertTaskFactory(YoutubeChannelRepository youtubeChannelRepository,
        MessageManager messageManager, YoutubeAPIService youtubeAPIService) {
        this.youtubeChannelRepository = youtubeChannelRepository;
        this.messageManager messageManager = messageManager;
        this.youtubeAPIService = youtubeAPIService;
    }

    public YoutubeAlertTask create(ScheduledExecutorService scheduledExecutorService, JDA jda) {
        return new YoutubeAlertTask(scheduledExecutorService,
            jda,
            youtubeChannelRepository,
            messageManager,
            youtubeAPIService)
    }
}

然后您可以注入

YoutubeAlertTaskFactory
类以及您希望 Spring 使用 DI 解析的所有依赖项,并且您的用法将变成对
YoutubeAlertTaskFactory::create(ScheduledExecutorService, JDA)
的调用。

© www.soinside.com 2019 - 2024. All rights reserved.