Обзор
В предыдущей статье представлены, что если вы введете себя в боб, если у вас есть @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 = beanfactory.getbean (myservice.class); }}Я только что упомянул об этом в то время, и эта статья заключается в том, чтобы представить, почему она потерпела неудачу.
Общий
Следующие условия должны быть выполнены в вышеуказанной ситуации:
Результатом является: за исключением @Async, аннотация вступает в силу, и никакие другие вступают в силу, как показано на рисунке ниже
Нормальный прокси должен быть следующим рисунком:
причина
Первое, что приходит на ум, это то, что метод обработки аннотации @Async может отличаться от других. В реализации AsyncannotationBeanpostProcessor (конкретный код находится в своем родительском классе AbstractAdvisingBeanpostProcessor), была найдена проблема, была найдена, была найдена проблема
При нормальных обстоятельствах, который входит в бобы, уже является динамичным классом прокси, который прокси -конвертируется, и когда он терпит неудачу, фактический класс, который входит, действительно, как показано на рисунке ниже:
Затем, после анализа кода, если это фактический класс, когда он достигнет строки 69, он возвращает True и добавляет советника @Aysnc к динамическому принципу. Если это фактический класс, когда он достигнет строки 83, он создаст класс прокси и только добавит советника @Aysnc к динамическому прокси, так что @Transaction будет недействительным.
Почему агенты не приходят?
На самом деле, единственное отличие состоит в том, получили ли вы себя через BeanFactoryAware. Тогда почему вы используете BeanFactory, чтобы получить себя, а затем вы не прокси в последующем BeanpostProcessor? Если вы знакомы с механизмом загрузки Spring @Transaction, вы узнаете, что динамическое создание прокси, такое как @Transaction и @retryable Annotations, создается в AnnotationAwareSpectjautoproxycreator. Благодаря отладке мы обнаружили, что после прохождения AnnotationAwareSpectjautoproxycreator наш динамический прокси не был добавлен.
Давайте посмотрим на реализацию в AnnotationAwareSpectjautoproxycreator, но после этого не было получено никакого прокси -класса. Причина в том, что на карте есть «MyService».
Когда он был выставлен? На самом деле это
@OverridePublic void setbeanFactory (beanfactory beanfactory) бросает Beansexception {self = beanfactory.getbean (myservice.class);}Затем все выявилось. В случае MyService, BeanFactoryAware был вызван, и прокси -класс был создан через BeanFactory.getBean (myservice.class); (Советы: текущий класс прокси не содержит @Async Adivisor), потому что Spring на самом деле создает бобов MyService и еще не был помещен в BeanFactory. Затем мы запустили beanfactory.getbean (myservice.class); В этом процессе мы создали прокси и вернулись, и присоединились к нему к карте, выставленной заранее. Это приводит к серии последующих проблем. Это чувствует себя немного запутанным. Поговорите с картинкой:
Обычно следующий процесс должен быть:
Это относится к ненормальной ситуации
краткое содержание
При нормальных обстоятельствах используйте @autowire для инъекции (если используется Autowire, вышеупомянутая ситуация будет напрямую бросить круглую зависимость). Конечно, если есть проблема, вы не можете ее отпустить. Вы должны знать причину и причину!
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.