javax.inject.Provider vs String - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь получить набор ключей JNDI в веб-приложении во время выполнения. Код выглядит так:

class Test{
    private final String someUrl;

    public Test(@Named("URL") String someUrl){
    // do something
    }

     public void dotEST( string someUrl){
      String x = someUrl;
      //some other logic
     }

}

Я хочу понять разницу между использованием приведенного выше кода и этим:

class Test{
    private final Provider<String> someUrl;

    public Test(@Named("URL") Provider<String> someUrl){
    // do something
    }

     public void dotEST( Provider<String> someUrl){
      String x = someUrl.get();
      //some other logic
     }    
}

Когда и почему я должен использовать провайдера?

Ответы [ 2 ]

1 голос
/ 28 мая 2019
 public Test(@Named("URL") String someUrl){

Чтобы вызвать этот метод, someUrl уже должен быть разрешен и доступен (например, для контейнера)

public Test(@Named("URL") Provider<String> someUrl){

здесь, поиск может быть отложен (или даже не выполнен) - это похоже на ленивую инициализацию. Это зависит от реализации интерфейса Provider.

0 голосов
/ 28 мая 2019

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

KISS - Сохраняйте это простым, глупым, является ключевым при работе с инжекционными средами. Чем больше вы можете положиться на простые вещи (например, типы), тем лучше. Это может быстро перерасти в беспорядок, из которого трудно выйти.

Даже @Named (...) является сложным, поэтому я бы избегал этого, если это возможно. Вероятно, в долгосрочной перспективе будет проще (не проще?) Иметь класс-заполнитель для этого строкового значения.

class UrlToTheServer {
    private final String url;
}

...

class Test{
    private final String someUrl;

    @Inject
    public Test(UrlToTheServer urlToTheServer){
        someUrl = urlToTheServer.url;
    }

    public void foo() {
       // access someUrl here.
    }
 }

}

...