Конфигурируемая отложенная загрузка файлов Spring beans @Lazy (TRUE / FALSE - это происходит из файла свойств / System Props) - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть более 50 нечетных классов, помеченных @Service @Lazy. С этой конфигурацией я не могу загружать эти bean с нетерпением, если мне нужно для любого из моих требований.Есть ли какое-либо решение, такое как @Lazy(${user.property.bena.loading.type)}, чтобы я мог изменить стиль загрузки bean-компонентов по своему желанию с помощью булевого переключателя.

В противном случае я нахожу два решения:

1 - Заменить все @lazy на @Lazy(false) - Это рискованно и не подходит для 50 нечетных файлов

2 -Создайте дублирующиеся классы, один с @Lazy(true), другой с @Lazy(false), используя различные пружинные профили - это будет двойственность кода

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Для динамической отложенной инициализации вы можете создать BeanFactoryPostProcessor, который проверяет, должен ли конкретный компонент быть отложенным init или нет.Ниже реализации должно быть достаточно.

Создание аннотации маркера, например LazyMarker

@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface LazyMarker {
}

Создание BeanFactoryPostProcessor, в котором установлен ленивый флаг.

@Component
public class SamplePostProcessor implements BeanFactoryPostProcessor, EnvironmentAware {
  private Environment environment;

  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
      throws BeansException {
    if (Boolean.valueOf(environment.getProperty("lazy"))) {
      for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
        Class<?> beanType = beanFactory.getType(beanDefinitionName);
        LazyMarker lazyValue = AnnotationUtils.findAnnotation(beanType, LazyMarker.class);
        if (lazyValue != null) {
          beanFactory.getBeanDefinition(beanDefinitionName).setLazyInit(true);
        }
      }
    }
  }

  @Override
  public void setEnvironment(Environment environment) {
    this.environment = environment;
  }

}
0 голосов
/ 25 сентября 2019

Из официальных Spring Docs :

Если присутствует и установлен в true, @Bean или @Component не будут инициализированы до тех пор, пока не будут ссылаться на другой компонент или явно извлечены извмещающий BeanFactory.

Можете ли вы уточнить ваш комментарий:

Я не могу загружать эти бобы охотно, если мне нужно любое из моих требований

Потому чтоесли вам нужны эти бины, и они добавляются в ваши необходимые классы, они будут доступны в момент первого обращения к ним.Это цель, которой служит @Lazy.

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