предисловие
существует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Содержание. Увидимся в следующий раз.
Если эта статья была вам полезна, я надеюсь, что вы можете поставить лайк, это самая большая мотивация для меня.