какая структура кода лучше всего подходит для внедрения зависимостей в моей ситуации?

#java #spring #dependency-injection

#java #spring #внедрение зависимостей

Вопрос:

Эти коды являются частью mq consumer для получения сообщения о задаче отправки почты, поэтому карта полезной нагрузки записи содержит информацию об электронном письме, такую как адрес прибытия, данные пользователя. это формат json, подобный:

 {
    "to": "aaa@bbb.com",
    "userId": "12",
    ...
}
  

У меня есть слушатель для прослушивания mq, например:

 @Component
public class RecDownloadListener {

    private final JavaMailSender javaMailSender;

    @Autowired
    RecDownloadListener(JavaMailSender javaMailSender){
        this.javaMailSender = javaMailSender;
    }

    @Autowired
    @RabbitListener(queues = TASK)
    private void listener(RecDownloadContentBuilder builder,
                          Channel channel,
                          @Payload Map<String, String> searchParams,
                          @Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag) {

        //I want the builder could be auto injected like @Payload or @Hearder
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        String content = builder.getContent();
        String title = builder.getEmailTitle();
        String address = builder.getArriveAddress();

        //use above info to update mimeMessage and send it.
        javaMailSender.send(mimeMessage);
    }
}
  

последние три аргумента будут заполнены автоматически, все они получены из rabbitmq, я хочу автоматически подключить первый, builder как я написал, и builder подобные:

 @Component
@Scope(SCOPE_PROTOTYPE)
class TaskContentBuilder {

    private final Map<String, String> searchParams;
    private final UserDao userDao;
    private TemplateEngine templateEngine; //thymeleaf

    @Autowired
    RecDownloadContentBuilder(Map<String, String> searchParams, CpAccountDao cpAccountDao, TemplateEngine templateEngine) {
        this.searchParams = searchParams;
        this.cpAccountDao = cpAccountDao;
        this.templateEngine = templateEngine;
    }

    public String getEmailContent(){
        User user = userDao.findById(searchParams.get("userId"));
        Context context = new Context;
        // context.update(user.someInfomation())
        return templateEngine.process(template, context);
    }

    public String getEmailTitle(){...}
    public String getArriveAddress(){...}

}
  

одно из builder полей dao легко внедрить, слушатель будет получать сообщения одно за другим очень быстрее, конструктор предназначен только для одной записи сообщения. должен ли я делать (Map)searchParams возврат в виде функции bean? Или нормально просто вводить только dao при создании экземпляра builder и установке в searchParams ?

Комментарии:

1. Вашему вопросу не хватает контента, а также предоставленного кода. Пожалуйста, дополните, предоставив еще немного кода, который будет использоваться, чтобы помочь вам.

2. @Aris_Kortex здравствуйте, спасибо за вашу помощь, я просто дополнил некоторые детали, не могли бы вы взглянуть еще раз?