Для динамической отложенной инициализации вы можете создать 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;
}
}