Пружинная неразрешимая циклическая ссылка, если класс конфигурации перешел в зависимость

#spring-boot #configuration #autowired #quartz

Вопрос:

В Spring-boot-starter-quartz разработчике нужно создать компонент типа SchedulerFactoryBean , и этот компонент создает компонент типа Scheduler и добавляет его в контекст spring.

Вот мой класс конфигурации для этой реализации

 @Configuration
public class MyQuartzConfiguration {

    QuartzProperties quartzProperties;
    DataSource dataSource;
    ApplicationContext applicationContext;

    @Autowired
    Scheduler scheduler;

    public MyQuartzConfiguration (QuartzProperties quartzProperties,
                                  DataSource dataSource,
                                  ApplicationContext applicationContext) {
        this.quartzProperties = quartzProperties;
        this.dataSource = dataSource;
        this.applicationContext = applicationContext;
    }


    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        Properties properties = new Properties();
        properties.putAll(quartzProperties.getProperties());

        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);
        factory.setJobFactory(new MyAutowirableJobFactory(applicationContext)); 
        factory.setQuartzProperties(properties);
        return factory;
    }


    @PostConstruct
    public void scheduleJobs() throws SchedulerException {
     
            JobDetail  jobDetail =  JobBuilder.newJob()
                         .ofType("a.b.mclass")
                         .withIdentity(JobKey.jobKey("someKey))
                         .build();

                scheduler.scheduleJob(jobDetail , 
                     TriggerBuilder.newTrigger()
                             .forJob(jobDetail)
                             .withSchedule(CronScheduleBuilder.cronSchedule("myCronExpression"))
                             .build());
        
    }
 

У меня есть еще один компонент в контексте, где я Scheduler программно запускаю один раз для нескольких разных заданий на основе запроса пользователя.

 @Component
public class MyService {

    private final Scheduler scheduler;

    public MyService (Scheduler scheduler) {
        this.scheduler = scheduler;
    }
    ......
    ......
    ......
}
 

Весь этот код, упомянутый выше, работает нормально.

Теперь для многократного использования я извлек MyQuartzConfiguration общий бизнес-код, связанный с планированием, и еще несколько связанных с ним, в его собственную банку и добавил как зависимость Maven в различных службах.

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

 Error creating bean with name 'MyQuartzConfiguration'
Unsatisfied dependency expressed through field 'scheduler'; 
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: 
Error creating bean with name 'schedulerFactoryBean': 
Requested bean is currently in creation: Is there an unresolvable circular reference?
 

Я могу решить проблему, просто пометив это как @Lazy в MyService конструкторе, и к тому времени, когда планировщик потребуется в службе после запуска, компонент уже был бы инициализирован. таким образом, вышеуказанная проблема может быть решена

Но Мои Вопросы таковы

  1. В чем причина такого поведения при преобразовании в зависимость.
  2. Есть ли лучший способ справиться с этим, чем просто отмечать его ленивым в службах?