Dependência circular
Definição: A dependência circular é uma referência circular, o que significa que dois ou mais feijões se mantêm, por exemplo, a circularidade refere -se à circularidadeB, a circularidadeB refere -se à circularidade e circularidade refere -se à circularidade. Formar uma relação de referência circular.
Ao usar o Spring, se você usar principalmente o método de injeção de dependência baseado em construtor, poderá encontrar dependências circulares. Em suma, o construtor do feijão A depende do feijão B, e o construtor do feijão B depende do feijão A. Nesse caso, a primavera lançará uma concriação de beanscratalização no momento da compilação.
Classe A.
@ComPonenPublic Class Classa {private ClassB ClassB; @Autowired public Classa (classe ClassB) {this.classb = ClassB; } public void printClass () {System.out.println ("classe A =" + this); System.out.println ("classe B =" + classB); }}Classe B.
@ComPonentPublic ClassB {private Classa Classa; @Autowired public ClassB (Classa Classa) {this.classa = Classa; } public void printClass () {System.out.println ("classe A =" + Classa); System.out.println ("classe B =" + this); }}teste
@ContextConfiguration (Classes = {Classa.class, classb.class}) @runwith (springrunner.class) classe pública mytest {@autowired private Classa Classa; @AUTOWIRED PRIVADO CLASSB ClassB; @Test public void name () {Classa.printClass (); Classb.printClass (); }}razão
Neste momento, você descobrirá que uma exceção de exceção do BeansCreationException é lançada. A razão para isso é que, quando a primavera cria um feijão, ela instanciará o objeto primeiro e depois injetará a dependência. Suponha que a primavera crie a Classe A primeiro, depois descobrirá que existe uma dependência de Classe B no construtor; portanto, ele se transformará em criar a classe B e, em seguida, encontrar a dependência da classe A no construtor da classe B. Nesse momento, a classe A não foi inicializada, por isso se transformará para criar a classe A, que cairá em um loop morto.
Solução
Mudar para a injeção de dependência baseada em setter pode resolver esse problema. Como a injeção de dependência baseada em setter chamará primeiro o construtor padrão para instanciar o objeto e depois chama o Setter para implementar a injeção de dependência. Dessa maneira, não há dependência no estágio de instanciação do objeto. Portanto, depois que a classe A é instanciada, a Classe B é chamada e, após a instantação da classe B, ele começa a definir valores. Neste momento, a classe A já está instantada, para que possa se referir com sucesso à classe A.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.