предисловие
существуетSpring AOP — Введение в использование методов аннотации (подробное объяснение в длинной статье)В автор вводит использование аннотаций Spring AOP. Это начало нашего анализа исходного кода Spring AOP и немного знаний.
Прежде чем приступить к изучению исходного кода Spring AOP, если вы еще не изучили исходный код Spring IoC, лучше сначала изучить Spring IoC.
- Spring IoC — Дизайн Spring IoC
- Spring IoC — анализ исходного кода инициализации контейнера IoC
- Spring IoC — Анализ исходного кода внедрения зависимостей
То, что Spring AOP действует только на Spring Bean, иллюстрирует взаимосвязь между Spring AOP и Spring IOC.AOP полагается на контейнер IOC для управления, а анализ исходного кода также будет включать исходное содержимое Spring IoC.
Ниже, если вы уже узнали о Spring IoC и использовании Spring AOP, давайте начнем.
На эту статью автор потратил много сил, и я надеюсь, что она может быть вам полезна.
Анализ исходного кода 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
,
Обратите внимание, что этот класс реализует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
Логический фрагмент кода, выполняющий регистрацию в .
Давайте начнем с разделительной линии.После понимания вышеописанного процесса, давайте продолжим думать.
зачем ставитьAspectJAnnotationAutoProxyCreator
Внедрить в контейнер Spring IoC и включить автоматический прокси?
Давайте искать эту триггерную точку.
Во-вторых, время срабатывания автоматического агента
Во-первых, давайте посмотрим наAspectJAnnotationAutoProxyCreator
структура наследования.
Вы узнали,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. Предварительное исследование процесса генерации прокси-класса
Тогда давайте взглянем на тайну здесь.
Вы можете увидеть фактический обратный вызовpostProcessBeforeInitialization
а такжеpostProcessAfterInitialization
Эти два способаAbstractAdvisorAutoProxyCreator
в переопределении.
Местоположение источника:AbstractAdvisorAutoProxyCreator
В JavaDoc четко указаноpostProcessAfterInitialization
Выполнит операцию создания прокси-класса, создаст прокси-класс с настроенными перехватчиками и скажет нам посмотретьgetAdvicesAndAdvisorsForBean
, похоже это будет ключевой метод, тут не торопимся, продолжаем смотреть внизwrapIfNecessary
метод.
Местоположение источника:AbstractAutoProxyCreator#wrapIfNecessary(..)
Ядром этого метода являются две точки, которые я использую соответственно на картинке выше.**** TODO-1 ****
а также**** TODO-2 ****
Идентифицировано.
TODO-1
то естьПолучить советники для текущей адаптации Spring Bean.
TODO-2
то естьСоздать прокси-класс.
В следующих главах мы подробно обсудим эти два.TODO
Содержание. Увидимся в следующий раз.
Если эта статья была вам полезна, я надеюсь, что вы можете поставить лайк, это самая большая мотивация для меня.