code: protected void findBadlyScopedComponents() {
          synchronized (HAS_CHECKED_BEAN_DEFINITIONS) {
              if (HAS_CHECKED_BEAN_DEFINITIONS.get()) {
                  return;
              }
  
              final ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory();
              Stream.of(ComponentCellFxmlController.class, ComponentListCell.class)
                    .map(beanFactory::getBeanNamesForType)
                    .flatMap(Arrays::stream)
                    .filter(beanName -> {
                        final String effectiveScope = beanFactory.getBeanDefinition(beanName).getScope();
                        return !ConfigurableBeanFactory.SCOPE_PROTOTYPE.equals(effectiveScope);
                    }).forEach(BADLY_SCOPED_BEANS::add);
  
              HAS_CHECKED_BEAN_DEFINITIONS.set(true);
              if (BADLY_SCOPED_BEANS.isEmpty()) {
                  return;
              }
  
              final String faulties = String.join(",", BADLY_SCOPED_BEANS);
              LOG.warn(
                  "Custom ListView cells wrappers and controllers " +
                  "should be prototype-scoped bean. " +
                  "See @Scope annotation.\n" +
                  "Faulty beans were : [{}]",
                  faulties
              );
          }
      }
docs: You should not need to care about this method. In the unlikely case where you actually want all the cells of your
  ListView to actually be the same one, it is left protected and not private so you can override it and avoid the
  warnings being spouted at you.
  <p>
  Else, the idea is that a set of cells is created and they share the elements one after another during scrolling
  and JavaFX might generate more of them later so we should just not make any assumption and expect all of them to
  be different and not singletons.