Если используется инъекция конструктора, может быть создан сценарий круговой зависимости, который не может быть проанализирован.
Что такое круговая зависимость
Круглая зависимость на самом деле является круговой ссылкой, то есть два или более бобов удерживают друг друга и в конечном итоге образуют закрытый цикл. Например, зависит от B, B зависит от C и C зависит от A., как показано на рисунке ниже:
Обратите внимание, что это не вызов петли для функции, а взаимозависимость объекта. Звоны петлей на самом деле являются мертвой петлей, если нет конечного условия.
Весной есть сценарии зависимости петлей:
(1) Круглувая зависимость конструктора (2) Круглой зависимости атрибута поля.
Как обнаружить, если есть круговая зависимость
Относительно легко обнаружить круговые зависимости. Когда фасоль создан, он может отметить бобы. Если рекуртивный вызов вернулся и обнаруживает, что он создается, это означает, что круговая зависимость.
Вот ситуация, с которой я столкнулся, структура кода заключается в следующем:
Класс конфигурации Springsecurity:
@ConfigurationPublic Class BrowserSecurityConfig Extends WebseCurityConfigurerAdapter {Private Final UserDetailsService userDetailsService; / ** * Inject userDetailsService через конструктор класса конфигурации */ @autowired public BrowserSecurityConfig (userDetailsService userDetailsService) {this.UserDetailsService = userDetailSservice; } / ** * Объявит энкодер шифрования в классе конфигурации * / @bean publyenceencoder passwordEncoder () {return new bcryptpasswordencoder (); } ... ...}Userdetailsservice class:
@Componentpublic class myuserdetailservice реализует userdetailsservice {private final passwordEncoder passwordEncoder; private logger logger = loggerFactory.getLogger (getClass ()); / ** * Inject passwordEncoder через конструктор */ @autowired public myuserdetailService (passwordEncoder passwordEncoder) {this.passwordencoder = passwordEncoder; } ... ...}После запуска пружина бросает следующее сообщение об ошибке:
Описание:
Зависимости некоторых из бобов в контексте приложения образуют цикл:
ڡ000
| BrowserSecurityConfig определяется в файле [d: /code/java/ideaprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/browsersecurityconfig.class]
↑ ↓
| MyuserDetailService, определенный в файле [d: /code/java/ideaprojects/mango-security/mango-security-rawser/target/classes/stu/mango/security/browser/myuserdetailservice.class]
└í000
В этом примере BrowserSecurityConfig внедряет экземпляр userDetailsService через конструктор, а пользовательский проводник вводится в парользойр, объявленный в BroweserSecurityConfig через конструктор.
Таким образом, круговая зависимость пружинного боба означает, что класс A должен вводить экземпляр класса B (или бобов, объявленного в B) в конструктор, в то время как класс B должен вводить экземпляр класса A (или бобов, объявленного в а) в конструктор. Если бобы класса A и класса B настроены для того, чтобы вводить друг друга, пружинный контейнер IOC обнаруживает эту ссылку на цикл во время выполнения и повышает бонсуртурно -цифровое обращение. В отличие от типичного случая (без круговых зависимостей), круговая зависимость между фасолью A и фасоли B заставляет одного из бобов вводить в другую, прежде чем полностью инициализироваться (это типичный сценарий «курица первым или яйцом первым»).
Решение
Проще говоря, он не должен использовать инъекцию зависимости на основе конструкторов. Это может быть решено следующим методом.
Используйте аннотацию @autowired на поле и позвольте Spring решить внедрить в нужное время. 【Рекомендую】
Замените инъекцию зависимостей на основе конструктора на инъекцию зависимости на основе сеттера для решения круговой зависимости.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.