Путаница наследования бобов весны - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть класс Spring Component следующим образом:

@Component
public class A{
   @Value("${some.value}")
   private String s;

   @PostConstruct
   public void setup(){// initialization of private instance variables}

   public void execute(){ //code that makes use of the initialized instance variables }
}

У меня есть другой класс, расширяющий A:

@Component
public class B extends A{
   @PostConstruct
   public void setup{
      super.execute();
   }
}

Так что теперь я сталкиваюсь с проблемой, когда яЗапустите мое загрузочное приложение Spring, класс B создается перед классом A. В результате A.setup () не создается, что вызывает выброс NPE при вызове super.execute () в B.setup (), так каквсе переменные экземпляра инициализируются в A.setup ().

Чтобы избежать этого, я придумал следующий хак:

@Component
public class B extends A{
    @PostConstruct
       public void setup{
           super.setup();
           super.execute();
       }
}

Мне было интересно, есть ли способ получитькласс A создан сначала перед классом B, так что я могу избавиться от приведенного выше кода

1 Ответ

0 голосов
/ 17 декабря 2018

Использование @DependsOn({"A"}) аннотации над классом B, @DependsOn annotation for managing initialization order.

@Component
@DependsOn({"A"})
public class B extends A{
@PostConstruct
   public void setup{
       super.setup();
   }

}

В случае отсутствия зависимости Spring создает исключение BeanCreationException сбазовое исключение NoSuchBeanDefinitionException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...