WedX - журнал о программировании и компьютерных науках

@ConditionalOnBean не работает с зарегистрированным вручную bean-компонентом

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

@Configuration
class Dbconfig {
  @Autowired DbRepo dbRepo;
  @Autowired GenericApplicationContext applicationContext;
  @PostConstruct
  public void init(){
    Config config = dbRepo.findConfiguration();
    if(config.value.equals("test")){
      applicationContext.registerBean("testBean", TestBean.class, TestBean::new);
    }else{ //other steps
  }
}

Затем на основе этого маркерного бина я создам соответствующие, например:

@Configuration
@ConditionalOnBean(name = "testBean")
@AutoConfigureAfter(value = Dbconfig.class)
public class ObjConfig{
//creating proper @Beans
  }

Но, к сожалению, это не работает. Не знаю, почему spring не видит этот «testBean». Тем не менее, я отладил его и вижу, что этот bean-компонент существует в BeanFactory контекста приложения. Он также гладко работает с аннотацией @DependsOn, тогда Spring может видеть этот компонент. Я буду признателен за любую помощь или предложения, как решить проблему другим способом.

02.01.2020

  • stackoverflow.com/questions/31799855/ 02.01.2020
  • Как вы проверили, что был вызван registerBean(...)? 02.01.2020
  • @HarshMishra stackoverflow.com/questions/31799855/… это другая ситуация, поскольку bean-компоненты там не регистрируются вручную. Более того, я использовал @AutoConfigureAfter/Before - это ничего не меняет. 02.01.2020
  • Я думаю, что проблема может быть в регистрации testBean в @PostConstruct. Взгляните на ответ на этот другой вопрос если bean-компонент javamailsender существует"> stackoverflow.com/questions/57501215/ 02.01.2020
  • @mentallurg Да, я это сделал, и это называлось. Я отладил его, и его можно найти с помощью applicationContext.getBeanDefinition(testBean) или applicationContext.getBeanFactory().getBeanDefinition(testBean) 02.01.2020
  • @ederribeiro Спасибо, похоже, этого нельзя достичь таким образом. 02.01.2020

Ответы:


1

@AutoConfigureAfter будет работать только с классом автоматической настройки, а не с настроенными вручную bean-компонентами. Если вы подключили testBean как Autowired bean-компонент, ваш код будет работать. Вы можете попробовать @ConditionalOnExpression внедрить bean-компонент на основе выражения SpEL.

03.01.2020
  • Спасибо за совет. Обходной путь с @ConditionalOnExpression отлично работает с инъекцией bean-компонента, но, поскольку у меня много bean-компонентов, я попытался исправить это с помощью: @Configuration @ConditionalOnExpression ("#{testBean.active == true}") public class ObjConfig{ //config @Beans }, а затем я получаю: SpelEvaluationException: EL1008E: Property or field 'testBean' cannot be found .. Любая подсказка, почему? 03.01.2020
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]