Как внедрить управляемый бин (нестатический) в статический метод? - PullRequest
0 голосов
/ 31 октября 2018

Я использую Java CDI для жизненного цикла бина.

@Named
public class ManagedBeanClass{
    ...
    public ManagedProfile getManagedProfile(){
       return new ManagedProfile();//logic will goes here
    }
}

Например

public class sample1{
      @Inject private ManagedBeanClass managedBeanClass;
      ...
      public static boolean methodExample() throws Exception{
           ManagedProfile managedProfile = managedBeanClass.getManagedProfile();
           ....
      }

}

Попробуйте вставить (@Inject) управляемый компонент в метод Static, он показывает ошибку компиляции

Невозможно сделать статическую ссылку на нестатическое поле managedBeanClass

Застревание в контексте DI и жизненного цикла статических объектов. Помогите мне решить эту проблему заранее.

1 Ответ

0 голосов
/ 31 октября 2018

Проблема в вашем примере кода не имеет ничего общего с CDI; Вы пытаетесь получить доступ к нестатическому полю (managedBeanClass) из статического метода. Это невозможно в Java (ни с CDI, ни без него).

Кроме того, статические методы почти всегда указывают на проблему проектирования (*). Подобные статические методы делают вашу программу труднее тестировать и труднее изменять / поддерживать. Попробуйте придумать дизайн, который вообще не нуждается в статических методах ...

Итак, короткий ответ: не надо.

Но если ваш действительно должен иметь статический метод, вы можете использовать инжекцию конструктора и установить поле static из конструктора. Но будьте осторожны : это потенциально опасно, потому что каждый новый экземпляр будет снова устанавливать поле (что может вызвать условия гонки и непредвиденное поведение).

(см. Также: https://stackoverflow.com/a/22068572/10363398)

(*) За некоторыми исключениями, такими как методы в классе Math. Но это очень маленькие, чистые функции, которые не имеют побочных эффектов.

...