Сделать Bean зависимым от списка бобов в Springboot - PullRequest
0 голосов
/ 16 ноября 2018

У меня следующий класс @Configuration, в котором я объявляю @Bean, который зависит от списка @Autowired бинов. Однако этот список неполон, когда я к нему обращаюсь. Все @Bean определения были выполнены, кроме одного, определенного в том же классе.

@Configuration
public class MyConfig {

  @Autowired
  List<RequiredBean> requiredBeans;

  @Bean(name="ProblemHere")
  public CustomObject customObject() {
    log.info(requiredBeans.size()); // 1 (debugging, I can see is the one defined in "AnotherConfigClass")
  }

  @Bean(name="reqBeanInsideClass")
  public RequiredBean reqBean() {
    // this method does not get executed
    return new RequiredBean();
  }

}

Наличие других классов, таких как;

@Configuration
public class AnotherConfigClass {

  @Bean(name="ThisOneGetsExecuted")
  public RequiredBean reqBean() {
    // this gets executed, and therefore, added to the list
    return new RequiredBean();
  }

}

Возможно, самым простым решением было бы добавить @DependsOn ("reqBeanInsideClass").

Однако:

  1. Интересно, почему это работает для всех @Bean, определенных в разных классах, но не в этом.
  2. Я не совсем уверен, что это именно так, и, боюсь, позже, другой @Bean не будет выполнен
  3. Полагаю, правильный подход должен выглядеть примерно так:

    @DependsOn(List<RequiredBean>) // Obviously this does not work
    

Как мне решить эту проблему?

Обновление

Я дважды скопировал один и тот же класс, чтобы увидеть, что произойдет, поэтому теперь у меня также есть:

@Configuration
public class MyConfig2 {

  @Autowired
  List<RequiredBean> requiredBeans;

  @Bean(name="ProblemHere2")
  public CustomObject customObject() {
    log.info(requiredBeans.size());
  }

  @Bean(name="reqBeanInsideClass2")
  public RequiredBean reqBean() {
    // this method does not get executed
    return new RequiredBean();
  }

}

Удивительно, но при этом оба метода @Beans (ProblemHere & ProblemHere2) вызываются до обоих методов reqBeanInsideClass и reqBeanInsideClass2.

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

  1. Звучит ли это кому-нибудь логично?

1 Ответ

0 голосов
/ 16 ноября 2018

Разве вы не можете использовать вход массива для @DependsOn вместо передачи единственного значения, поскольку он принимает String[]?Это ожидало бы всех бинов, которые явно объявлены в массиве, перед инициализацией, хотя должно быть определено вручную.

@Configuration
public class MyConfig {

  @Autowired
  List<RequiredBean> requiredBeans;

  @Bean(name="customObject")
  @DependsOn({"reqBeanInsideClass", "thisOneGetsExecuted"})
  public CustomObject customObject() {
    log.info(requiredBeans.size());
  }

  @Bean(name="reqBeanInsideClass")
  public RequiredBean reqBean() {
    return new RequiredBean();
  }
}

@Autowired список бинов будет таким же, какодин бин того же типа, он будет содержать все бины с этим типом или с этим суперклассом посредством внедрения пружин, проблема в том, что порядок инициализации бина не контролируется должным образом, @DependsOn с входом бина массива должен разрешить это!

Или

Вы можете сделать CustomObject боб @Lazy, поэтому он будет инициализирован только при использовании в пределахкод после инициализации.Я думаю, что боб нельзя использовать в другом ленивом бобе.Просто вызовите некоторую логику, где используется @Autowired CustomObject, он должен создать экземпляр компонента в тот момент, когда список будет содержать все возможные RequiredBean s

@Lazy
@Bean(name="customObject")
public CustomObject customObject() {
  log.info(requiredBeans.size());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...