В настоящее время у меня есть этот класс:
@Component
public class AuditFactory {
private Supplier<String> auditIdSupplier;
public AuditFactory(Supplier<String> auditIdSupplier) {
this.auditIdSupplier = auditIdSupplier;
}
}
Я написал два проекта, использующих этот AuditFactory.
В настоящее время я предоставляю их с помощью этого @Bean:
В проекте front-office:
@Bean
public Supplier<String> auditIdSupplier(FrontOfficeProperties frontOfficeProperties) {
return () -> String.join(
"-",
frontOfficeProperties.getCpdId(),
UUID.randomUUID().toString()
);
}
В проекте back-office:
@Bean
public Supplier<String> auditIdSupplier(BackOfficeProperties backOfficeProperties) {
return () -> String.join(
"-",
backOfficeProperties.getCpdId(),
UUID.randomUUID().toString()
);
}
Итак, я бы не хотел создавать столько реализаций Supplier<String>, сколько проектов, которые мне нужны, чтобы предоставить тот же способ создания общего способа предоставления id.
Меняется только один параметр (cpdid).
Итак, я думаю, я мог бы создать класс, унаследованный от Supplier<String>, но я не совсем понимаю, как его получить.
Взгляните на @ConfigurationProperties, вы можете загрузить свой идентификатор в bean-компонент и автоматически подключить его к своей AuditFactory.




Предполагая, что AuditFactory хранится в отдельном модуле, вы можете просто переместить Supplier<String> auditIdSupplier() в этот модуль и заставить FrontOfficeProperties и BackOfficeProperties реализовать один и тот же интерфейс c.
Затем, когда вы будете собирать front-office или back-office, будет вставлен правильный OfficeProperties.
AuditFactoryидет из отдельного модуля?