Свойства класса Guice всегда нулевые; Фабрика никогда не называется / используется


Попытка внедрить объекты в классы, но не может заставить мою фабрику вызываться, не говоря уже об объекте в классе, в котором я хочу его видеть.

Фабричный класс должен возвращать экземпляр AmazonSQS.

public class AmazonFactory implements Provider<AmazonSQS> {

    @Override
    public AmazonSQS get() {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials("KEY", "SECRET");

        return AmazonSQSClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCreds))
            .withRegion(Regions.US_EAST_2)
            .build();
    }
}

Насколько я понимаю, параметр, который принимает провайдер, должен возвращаться в get() метод. Я думаю, что я сделал это правильно до сих пор.

Тогда у меня есть модуль

public class AmazonModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(AmazonSQS.class).toProvider(AmazonFactory.class);
    }
}

Моя мысль здесь заключается в том, что всякий раз, когда я запрашиваю AmazonSQS, я на самом деле получаю результат фабрики (результат get() метод?)

А потом я просто добавляю модуль в свое приложение в функции init (приложение Dropwizard использует guicy, поэтому немного по-другому, но это не должно иметь значения)

@Override
public void initialize(Bootstrap<SwordfishConfiguration> bootstrap) {
    bootstrap.addBundle(GuiceBundle.builder()
        .enableAutoConfig(getClass().getPackage().getName())
        .useWebInstallers()
        .modules(new BaseModule())
        .build());

}

Специфика Dropwizard, работает так же, если я просто добавляю AmazonModule в метод init

public class BaseModule extends DropwizardAwareModule<Configuration> {

    @Override
    protected void configure() {
        install(new AmazonModule());

        configuration();
        environment();
        bootstrap();
    }
}

я могу подтвердить AmazonModule вызывается во время запуска приложения, поэтому часть инициализации пока права.

Однако, если я попытаюсь использовать AmazonSQS объект это всегда ноль.

Пример:

public class QueueUtils {

    @Inject
    private AmazonSQS amazonSQS;

    public QueueUtils() {

    }

    public void sendMessage(String queueUrl, String payload) {
        amazonSQS.sendMessage(payload);
    }

}

amazonSQS.sendMessage(payload); потерпит неудачу как amazonSQS нулевой.

Я только начал пытаться понять Guice, поэтому, если я пропустил какую-то основную концепцию или мое мышление совершенно неверно, мне бы хотелось, чтобы некоторые указатели указывали мне правильное направление.

Документация немного перегружена или очень сложна для переноса примеров в мое приложение.

ура

0 ответов

Другие вопросы по тегам