我已经创建了这个类,问题是我想创建一个只需要 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);
您可能会发现类似于工厂模式的东西比使用构造函数更有用。
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)
的调用。