Наглядно объясните исходный код Spring AOP с помощью изображений и текстов (1)

Java
Наглядно объясните исходный код Spring AOP с помощью изображений и текстов (1)

предисловие

существуетSpring AOP — Введение в использование методов аннотации (подробное объяснение в длинной статье)В автор вводит использование аннотаций Spring AOP. Это начало нашего анализа исходного кода Spring AOP и немного знаний.

Прежде чем приступить к изучению исходного кода Spring AOP, если вы еще не изучили исходный код Spring IoC, лучше сначала изучить Spring IoC.

То, что Spring AOP действует только на Spring Bean, иллюстрирует взаимосвязь между Spring AOP и Spring IOC.AOP полагается на контейнер IOC для управления, а анализ исходного кода также будет включать исходное содержимое Spring IoC.

Ниже, если вы уже узнали о Spring IoC и использовании Spring AOP, давайте начнем.

На эту статью автор потратил много сил, и я надеюсь, что она может быть вам полезна.

Spring AOP.png

Анализ исходного кода Spring AOP, о котором мы говорили ранее, исходных кодов так много, что нас действительно беспокоит?

Какова функция Spring АОП? Грубо говоря, это сгенерировать прокси-класс в соответствии с нашей конфигурацией, перехватить указанный метод и вплести в него указанный совет.

То, на что мы должны обратить внимание, можно резюмировать следующим образом:

  • Когда время запуска Spring AOP?
  • Как Spring AOP анализирует наш настроенный Aspect и генерирует цепочку Advisors?
  • Как Spring AOP генерирует прокси-классы и как вплетать рекомендации в прокси-классы?

Кроме того, содержание всего анализа исходного кода слишком велико для удобства чтения читателя и его собственной организации времени. Я объясню его вам в трех частях в соответствии с тремя пунктами, изложенными выше.

Анализ исходного кода в этой статье объясняется на примере аннотации АОП, которая отличается от других методов, главным образом, инициированием записи, а основной процесс аналогичен. Надеюсь, читатели смогут провести аналогию.

1. Загадка открытия АОП автоматических прокси

мы вSpring AOP — Введение в использование методов аннотации (подробное объяснение в длинной статье)введен в@EnableAspectJAutoProxyАннотации используются для включения использования аннотаций Spring AOP. Функция этого состоит в том, чтобы автоматически заставить все советники в ioc-контейнере соответствовать методу.В советниках есть советы, так что их внутренние советы могут выполнять обработку перехвата (Примечание: советники могут рассматриваться как комбинация pointcut+advisor). Английский перевод этой аннотации означает включение автоматического прокси.

Так в чем тайна внутри?

Давайте зайдем и посмотрим на эту аннотацию.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
    boolean proxyTargetClass() default false;
    boolean exposeProxy() default false;
}

@Import(AspectJAutoProxyRegistrar.class)использовать@ImportАннотации будутAspectJAutoProxyRegistrarВнедрить в контейнер IoC.

Если вы не знакомы с этой аннотацией, вы можете узнать о ней@Import Annotation in Spring Framework

давайте посмотрим на этоAspectJAutoProxyRegistrar,

AspectJAutoProxyRegistrar.png

Обратите внимание, что этот класс реализуетImportBeanDefinitionRegistrarинтерфейс.

Этот интерфейс являетсяМощный интерфейс расширения Spring, его роль:

Register additional bean definitions when processing @Configuration classes. Useful when operating at the bean definition level (as opposed to @Bean method/instance level) is desired or necessary.

это,это нужно и@ConfigurationС использованием,существует@ConfigurationРанее зарегистрированный bean-компонент, к которому можно получить доступ с помощьюImportBeanDefinitionRegistrarинтерфейс, который предоставляет один из следующих методов:

void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)

Этот метод может получить@Importэтого классаAnnotation Metadata, а в это времяBeanDefinitionRegistryобъект, черезBeanDefinitionRegistryВы можете получить все зарегистрированные в настоящее время BeanDefinitions, и вы можете настроить логику для динамической регистрации некоторых BeanDefinitions, которые вы считаете необходимыми.

PS: многие платформы с открытым исходным кодом расширяют этот интерфейс при интеграции с Spring, например ApolloConfigRegistrar для Apollo, MapperScannerRegistrar для mybatis и т. д.

Расширенное чтениеwoohoo.logic big.com/tutorials/ да…

существуетAspectJAutoProxyRegistrar, на самом деле,AspectJAnnotationAutoProxyCreatorизBeanDefinitionЗарегистрируйтесь в контейнере IoC.

НижеAopConfigUtilsЛогический фрагмент кода, выполняющий регистрацию в .

image.png


Давайте начнем с разделительной линии.После понимания вышеописанного процесса, давайте продолжим думать.

зачем ставитьAspectJAnnotationAutoProxyCreatorВнедрить в контейнер Spring IoC и включить автоматический прокси?

Давайте искать эту триггерную точку.

Во-вторых, время срабатывания автоматического агента

Во-первых, давайте посмотрим наAspectJAnnotationAutoProxyCreatorструктура наследования.

AnnatationAwareAspectJAutoProxyCreator.png

Вы узнали,AspectJAnnotationAutoProxyCreatorэтоBeanPostProcessor!

После изучения Spring IoC вы должны быть чрезвычайно чувствительны к этому классу.

public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

Давайте сначала рассмотрим и подумаем о реализации режима агента:(интерфейс) + класс реальной реализации + класс прокси.

Нужно ли иметь реальный класс реализации перед созданием прокси-класса? !

существуетSpring IoC — Анализ исходного кода внедрения зависимостейМы представили процесс создания Spring Bean после выполнения шага 1 для создания экземпляра объекта.createBeanInstance()и сборка свойств Step2populateBean()После этого считаемполучить реальный класс реализации.

в шаге 3initializeBean(), контейнер IoC обрабатывает различные события обратного вызова после инициализации компонента, а затем возвращает «возможно обработанный» объект компонента.

который включаетBeanPostProcessorизpostProcessBeforeInitializationобратный вызов иpostProcessAfterInitializationПерезвоните.

а такжеAspectJAnnotationAutoProxyCreatorровно одинBeanPostProcessor(простите, что повторяюсь снова), то легко подумать, что Spring AOP находится на этом шаге,Сделайте улучшения прокси!

3. Предварительное исследование процесса генерации прокси-класса

Тогда давайте взглянем на тайну здесь.

image.png

Вы можете увидеть фактический обратный вызовpostProcessBeforeInitializationа такжеpostProcessAfterInitializationЭти два способаAbstractAdvisorAutoProxyCreatorв переопределении.

Местоположение источника:AbstractAdvisorAutoProxyCreator

AbstractAdvisorAutoProxyCreator

В JavaDoc четко указаноpostProcessAfterInitializationВыполнит операцию создания прокси-класса, создаст прокси-класс с настроенными перехватчиками и скажет нам посмотретьgetAdvicesAndAdvisorsForBean, похоже это будет ключевой метод, тут не торопимся, продолжаем смотреть внизwrapIfNecessaryметод.

Местоположение источника:AbstractAutoProxyCreator#wrapIfNecessary(..)

wrapIfNecessary

Ядром этого метода являются две точки, которые я использую соответственно на картинке выше.**** TODO-1 ****а также**** TODO-2 ****Идентифицировано.

TODO-1то естьПолучить советники для текущей адаптации Spring Bean.

TODO-2то естьСоздать прокси-класс.


В следующих главах мы подробно обсудим эти два.TODOСодержание. Увидимся в следующий раз.

Если эта статья была вам полезна, я надеюсь, что вы можете поставить лайк, это самая большая мотивация для меня.