#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 здравствуйте, спасибо за вашу помощь, я просто дополнил некоторые детали, не могли бы вы взглянуть еще раз?