Se a injeção do construtor for usada, um cenário de dependência circular que não pode ser analisado poderá ser criado.
O que é dependência circular
A dependência circular é na verdade referência circular, ou seja, dois ou mais feijões se mantêm e, eventualmente, formam um loop fechado. Por exemplo, a depende de B, B depende de C e C depende de A. Como mostrado na figura abaixo:
Observe que essa não é uma chamada de loop para a função, mas uma interdependência do objeto. As chamadas de loop são na verdade um loop morto, a menos que haja uma condição final.
Existem cenários de dependência de loop na primavera:
(1) Dependência circular do construtor (2) Dependência circular do atributo de campo.
Como detectar se há uma dependência circular
É relativamente fácil detectar dependências circulares. Quando o feijão é criado, ele pode marcar o feijão. Se a chamada recursiva estiver de volta e descobrir que está sendo criada, significa que a dependência circular é.
Aqui está a situação que encontrei, a estrutura do código é a seguinte:
Classe de configuração SpringSecurity:
@ConfigurationPublic Class BrowSerSecurityConfig estende WebSecurityConfigureRAdApter {private final UserDetailSService UserDetailSService; / ** * injete o userDetailSService através do construtor da classe de configuração */ @AUTOWIRED Public BrowSerSecurityConfig (UserDETAILSSERVICE USERDETAILSSERVICE) {this.UserDetailSService = UserDetailSService; } / ** * Declare o codificador de criptografia na classe de configuração * / @Bean Public PasswordEncoder PasswordEncoder () {return new BCryptPasswordEncoder (); } ... ...}UserDetailSService Class:
@ComponentPublic Classe myUserDetailService implementa o userDetailSService {private final senhaEncoder senhaNcoder; Logger privado Logger = LoggerFactory.getLogger (getClass ()); / ** * Injetar a senha do Construtor */ @aUTowired Public MyUserDetailService (senha do PasswordEncoder PasswordEncoder) {this.passwordEncoder = senhaEncoder; } ... ...}Após a corrida, a primavera lança a seguinte mensagem de erro:
Descrição:
As dependências de alguns dos feijões no contexto do aplicativo formam um ciclo:
┌────┐
| BrowSerSecurityConfig definido no arquivo [d: /code/java/ideprojects/mango-tecurity/mango-security-browser/target/classes/stu/mango/security/browsher/browsecurityconfig.class]
↑ ↓
| MyUserDetailService definido no arquivo [d: /code/java/ideprojects/mango-nsecurity/mango-nseecurity-browser/target/classes/stu/mango/security/browsher/myuserdetailservice.class]
└────┘
Neste exemplo, o BrowSecurityConfig injeta a instância do UserDetailSService através do construtor, e o UserDetailSService é injetado no senha declarado no BrowSecurityConfig através do construtor.
Em resumo, a dependência circular do feijão da mola significa que a classe A precisa injetar uma instância de classe B (ou um feijão declarado em b) no construtor, enquanto a classe B precisa injetar uma instância de classe A (ou um feijão declarado em A) no construtor. Se os grãos das Classe A e da Classe B estiverem configurados para injetar um ao outro, o contêiner do IOC da primavera detectará essa referência de loop no tempo de execução e aumentará uma concração de concração em torrente. Ao contrário do caso típico (sem dependências circulares), a dependência circular entre o feijão A e o Bean B força um dos feijões a ser injetado no outro antes de serem totalmente inicializados (este é um cenário típico de "Chicken First ou Egg First").
Solução
Para simplificar, não é para usar a injeção de dependência baseada em construtor. Pode ser resolvido pelo seguinte método.
Use a anotação @Autowired em campo e deixe a primavera decidir injetar no momento certo. 【Recomendar】
Substitua a injeção de dependência baseada em construtor pela injeção de dependência baseada em setter para resolver a dependência circular.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.