Ленивая загрузка аннотаций Spring

В настоящее время работает над весной 3.2.3. Мы разработали одно API-приложение с этим уже 2 года. Это работало хорошо. Но по мере увеличения классов bean-компонентов возникло исключение в отношении круговой зависимости. Итак, мы решили эту проблему, изменив default-lazy-init="true" в application-context.xml. Но это привело к еще одной проблеме, связанной с тем, что @Scheduled вообще не работает.

Примечание. Наше приложение использует аннотацию Spring, поэтому bean-компоненты не объявляются в XML-файле. Ниже приведен мой код для справки:

applicationContext.xml

<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans">

Класс обслуживания

@Service("notificationService")
public class NotificationService{

    @Scheduled(cron = "0 09 11 * * *")
    @Async
    public void sampleNotificaton(){

    }
}

Попробуйте добавить @Lazy(false) на уровне службы, но исключение циклической зависимости все еще возникает.

Ценю ваше предложение. Спасибо.


person user3406754    schedule 12.11.2016    source источник
comment
У меня такая же проблема, но я не нашел решения??   -  person Nilesh    schedule 12.11.2016
comment
Я бы попытался разрешить круговую зависимость в первую очередь. Это большой запах дизайна, а некоторые контейнеры DI вообще не допускают этого.   -  person luboskrnac    schedule 12.11.2016
comment
Вы пробовали @EnableScheduling аннотацию?   -  person luboskrnac    schedule 12.11.2016
comment
Спасибо за ваш ответ @luboskrnac. Да, я пробовал EnableScheduling, но проблема осталась. Да, я согласен, что мы должны разрешить круговую зависимость, но на данном этапе это занимает больше времени, поэтому мы этого избегаем.   -  person user3406754    schedule 12.11.2016


Ответы (1)


Поскольку у нас есть ограничения, чтобы не нарушать циклическую зависимость (что в большинстве случаев очень легко решить, кстати), я бы попробовал трюк, где аннотация планирования будет извлечена в отдельный компонент:

@Component
public class NotificationScheduler {
    @Autowired //I prefer contructor injection, but field injection might be needed in this case because or circular dependency 
    private NotificationService notificationService;

    @Scheduled(cron = "0 09 11 * * *")
    public void sampleScheduling() {
        notificationService.sampleNotification();
    }
}

@Service("notificationService")
public class NotificationService{

    @Async
    public void sampleNotificaton(){

    }
}
person luboskrnac    schedule 12.11.2016