개요
이전 기사에서는 콩에 자신을 주입하는 경우 @async 및 @transaction이있는 경우 @autowire를 주입하면 원형 의존성을보고합니다. BeanFactoryAware를 주사하면 @Transaction이 유효하지 않습니다. 예를 들어:
@ServicePublic Class MyService는 BeanFactoryAware {private myservice self; // 트랜잭션 주석은 유효하지 않은 @transactional public void notwork () {...} @async public future async () {...} @override public void setbeanfactory (beanfactory beanfactory) beansexception {self = beancatory.getbean (myservice.class); }}방금 그 당시에 간단히 언급 했으며이 기사는 왜 실패한 이유를 소개하는 것입니다.
일반적인
위의 상황에서는 다음과 같은 조건을 충족해야합니다.
결과는 @async를 제외하고는 주석이 적용되며 아래 그림과 같이 다른 것들은 적용되지 않습니다.
일반 프록시는 다음 그림이어야합니다.
이유
가장 먼저 떠오르는 것은 @async 주석의 처리 방법이 다른 것과 다를 수 있다는 것입니다. AsyncannotationBeanPostProcessor의 구현에서 (특정 코드는 부모 클래스에 있습니다.
정상적인 상황에서, 들어오는 콩은 이미 근접한 역동적 인 프록시 클래스이며, 실패 할 때, 실제 클래스는 아래 그림과 같이 실제로 다음과 같습니다.
그런 다음 코드를 분석 한 후 코드가 실제 클래스 인 경우 69 행에 도달하면 True를 반환하고 동적 원리에 @aysnc의 고문을 추가합니다. 실제 클래스 인 경우 83 행에 도달하면 프록시 클래스를 생성하고 동적 프록시에 @aysnc의 고문 만 추가하므로 이미 @transaction이 유효하지 않습니다.
에이전트가 들어오지 않는 이유는 무엇입니까?
실제로, 유일한 차이점은 Beanfactoryaware를 통해 자신을 얻었는지 여부입니다. 그렇다면 왜 BeanFactory를 사용하여 자신을 얻는 다음 후속 BeanPostProcessor의 대리가 아닌가? 스프링 @transaction로드 메커니즘에 익숙하다면 @transaction 및 @retryable 주석과 같은 동적 프록시 생성이 AnnotationAwareaspectjautoProxycreator에서 생성된다는 것을 알게 될 것입니다. 디버그를 통해 AnnotationAwareaspectjautoProxycreator를 통과 한 후 동적 프록시가 추가되지 않았 음을 발견했습니다.
AnnotationAwareaspectjautoProxycreator의 구현을 살펴 보겠습니다. 그러나 그 후에는 프록시 클래스가 생성되지 않았습니다. 그 이유는지도에 미리 노출 된 "MyService"가 있기 때문입니다.
그는 언제 노출 되었습니까? 사실입니다
@overridepublic void setbeanfactory (beanfactory beanfactory)는 beansexception을 던지려고 {self = beanfactory.getbean (myservice.class);}그런 다음 모든 것이 밝혀졌습니다. MyService의 경우, BeanFactoryAware가 트리거되었고, Proxy 클래스는 BeanFactory.getBean (myservice.class)을 통해 만들어졌습니다. (팁 : 현재 프록시 클래스에는 @async의 adivisor가 포함되어 있지 않음). 스프링은 실제로 MyService Bean을 만들고 아직 Beanfactory에 넣지 않았기 때문입니다. 그런 다음 BeanFactory.getBean (MyService.class)을 트리거했습니다. 그리고 프록시를 만들고 반환 한 후 미리 노출 된지도에 추가되었습니다. 이로 인해 일련의 문제가 발생합니다. 약간 얽힌 느낌이 듭니다. 사진과 대화하십시오 :
일반적으로 다음 과정은 다음 과정이어야합니다.
이것은 비정상적인 상황의 경우입니다
요약
정상적인 상황에서는 @autowire를 사용하여 주입합니다 (Autowire가 사용되는 경우 위의 상황은 원형 의존성을 직접 던집니다). 물론, 문제가 있으면 버릴 수 없습니다. 당신은 이유와 이유를 알아야합니다!
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.