Как @Lazy и прокси-компонент влияют на циклические зависимости весной? - PullRequest
1 голос
/ 17 июня 2019

Давайте посмотрим на следующий пример

    @Service
    class AServiceImpl{

         @Autowired
         BService bservice
    }

    @Service
    class BServiceImpl{

         @Autowired
         AService aservice
    }

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

Но в Spring, если AService имеет аннотацию @Transactional, Spring создаст прокси-компонент для A с использованием BeanPostProcessor, и этот процесс происходит после @Autowired.Это означает, что, хотя B имеет ссылку на не полностью инициализированный компонент A из кэша, ссылка не указывает на прокси-компонент, что, по-видимому, неверно.Что-то не так с моими рассуждениями?

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

@Lazy
@Service
class AServiceImpl{

     @Autowired
     BService bservice
}

или

@Service
class BServiceImpl{

     @Lazy
     @Autowired
     AService aservice
}

В некоторых пояснениях этой аннотации говорится, что аннотированный бин будет инициализирован, если онссылается на другой бин.Но я думаю, с этим или без него, «аннотированный бин всегда будет инициализирован, если на него ссылается другой бин», так как же он может решить проблему циклической зависимости?

Некоторые другие объяснения говорят, что аннотированныйbean будет инициализирован, если его методы будут вызваны, это звучит разумно, но я попытался, и мне кажется, что даже если ни один из методов в AService не вызывается, B все равно может содержать ссылку на последний прокси-компонент bean-компонента AService, что не такс моей попыткой?

1 Ответ

0 голосов
/ 17 июня 2019

Другой способ находится внутри конструктора

@Autowired
public AService(@Lazy BService bservice) {
    this.bservice = bservice;
}

, вместо полной инициализации компонента, он создаст прокси-сервер для внедрения его в другой компонент.Внедренный компонент будет полностью создан только тогда, когда он будет необходим.

...