Visão geral
No artigo anterior, é apresentado que, se você se injetar em um feijão, se tiver @async e @transaction, se injetar -se com @Autowire, reportará uma dependência circular. Se você se injetar com o BeanFactoryAware, o @Transaction será inválido. Por exemplo:
@ServicePublic Class MyService implementa BeanFactoryAware {private MyService eu; // A anotação da transação é inválida @Transaction Public void notwork () {...} @async public Future async () {...} @Override public void setBeanFactory (BeanFactory BeanFactory) lança beansception {self = beanFactor.getBean (myService.cl); }}Acabei de mencioná -lo brevemente naquele momento, e este artigo é para apresentar por que ele falhou.
Em geral
As seguintes condições devem ser atendidas na situação acima:
O resultado é: exceto para @async, a anotação entra em vigor e nenhum outro entra em vigor, como mostrado na figura abaixo
O proxy normal deve ser a seguinte figura:
razão
A primeira coisa que vem à mente é que o método de processamento da anotação @async pode ser diferente dos outros. Na implementação do assíncanárioBeanPostProcessor (o código específico está em sua classe de pai abstrataDVISINGBeanPostProcessor), foi encontrado um problema, foi encontrado, foi encontrado, foi encontrado, foi encontrado, foi encontrado, foi encontrado, foi encontrado, foi encontrado, foi encontrado um problema, foi encontrado, foi encontrado, foi encontrado um problema, um problema
Em circunstâncias normais, o feijão que entra já é uma classe dinâmica de proxy que está sendo proxyed e, quando falha, a classe real que entra é de fato, como mostrado na figura abaixo:
Então, depois de analisar o código, se for uma classe real, quando atingir a linha 69, ele retorna true e adicione o consultor da AYSNC ao princípio dinâmico. Se for uma classe real, quando atingir a linha 83, criará uma classe proxy e adicionará apenas o consultor da AYSNC ao proxy dinâmico, então o @Transaction já será inválido.
Por que os agentes não estão entrando?
De fato, a única diferença é se você se obteve através do BeanFactoryAware. Então, por que você usa o Beanfactory para se buscar e, em seguida, não é um proxy no prostitro subsequente do feijão? Se você estiver familiarizado com o mecanismo de carregamento da Spring @Transaction, saberá que a criação dinâmica de proxy, como @Transaction e @retryable Anotações, é criada no AnoTationAWAREASPETJAutoProxycreator. Através da depuração, descobrimos que, depois de passar pelo anotaçãowareaspectJautoProxycreator, nossa proxy dinâmica não foi adicionada.
Vamos dar uma olhada na implementação no AnoTationAWAREASPETJAUTOPROXYCRATOR, mas depois dela, nenhuma aula de proxy foi gerada. O motivo é que há "MyService" no mapa exposto com antecedência.
Quando ele foi exposto? Na verdade, é
@OverridePublic void setBeanFactory (BeanFactory BeanFactory) lança beansexception {self = beanfactory.getbean (myservice.class);}Então, tudo veio à luz. No caso MyService, o BeanFactoryAue foi acionado e uma classe de proxy foi criada através do BeanFactory.getBean (myService.class); (Dicas: A classe de proxy atual não contém o Adivisor do @Async), porque a primavera está realmente criando o feijão MyService e ainda não foi colocado no Beanfactory. Então desencadeamos BeanFactory.getBean (myService.class); Nesse processo, criamos o proxy e retornamos e nos juntamos ao mapa exposto com antecedência. Isso leva a uma série de problemas que se seguiram. Parece um pouco emaranhado. Fale com a foto:
Normalmente, o processo a seguir deve ser:
Este é o caso da situação anormal
resumo
Em circunstâncias normais, use @Autowire para injetar (se o AutoCire for usado, a situação acima lançará diretamente a dependência circular). Obviamente, se houver um problema, você não pode deixá -lo ir. Você deve saber o motivo e o motivo!
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.