Давайте посмотрим на следующий пример
@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, что не такс моей попыткой?