From b88fee21f8074f898fe7bec6e201a917e0f47950 Mon Sep 17 00:00:00 2001 From: huifer Date: Fri, 13 Mar 2020 08:04:35 +0800 Subject: [PATCH] =?UTF-8?q?spring=20import=20=E6=B3=A8=E8=A7=A3=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/Spring/clazz/Spring-Import.md | 98 ++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 docs/Spring/clazz/Spring-Import.md diff --git a/README.md b/README.md index 40a86e2..5d5b176 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ - [Spring messageSource](/docs/Spring/clazz/Spring-MessageSource.md) - [Spring 自定义属性解析器](/docs/Spring/clazz/Spring-Custom-attribute-resolver.md) - [Spring 排序工具](/docs/Spring/clazz/Spring-OrderUtils.md) +- [Spring-import注解](/docs/Spring/clazz/Spring-Import.md) ### Spring5 新特性 - [Spring5-spring.components解析](/docs/Spring/Spring5新特性/Spring-spring-components.md) diff --git a/docs/Spring/clazz/Spring-Import.md b/docs/Spring/clazz/Spring-Import.md new file mode 100644 index 0000000..30be05f --- /dev/null +++ b/docs/Spring/clazz/Spring-Import.md @@ -0,0 +1,98 @@ +# Spring Import +- Author: [HuiFer](https://github.com/huifer) +- 源码阅读仓库: [SourceHot-spring](https://github.com/SourceHot/spring-framework-read) + +## 分析 +- org.springframework.context.annotation.Import +```java +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Import { + + /** + * {@link Configuration @Configuration}, {@link ImportSelector}, + * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import. + * + * 需要导入的类 + */ + Class[] value(); +} +``` +### ImportBeanDefinitionRegistrar +- 注册Import Bean +- `org.springframework.context.annotation.ImportBeanDefinitionRegistrar` +```java +public interface ImportBeanDefinitionRegistrar { + + /** + * Register bean definitions as necessary based on the given annotation metadata of + * the importing {@code @Configuration} class. + *

Note that {@link BeanDefinitionRegistryPostProcessor} types may not be + * registered here, due to lifecycle constraints related to {@code @Configuration} + * class processing. + * + * 对import value属性的注册 + * @param importingClassMetadata annotation metadata of the importing class + * @param registry current bean definition registry + */ + void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry); + +} +``` +- 两个实现类 + 1. `org.springframework.context.annotation.AutoProxyRegistrar` + 2. `org.springframework.context.annotation.AspectJAutoProxyRegistrar` + +#### AutoProxyRegistrar +```java +public class AutoProxyRegistrar implements ImportBeanDefinitionRegistrar { + + private final Log logger = LogFactory.getLog(getClass()); + + /** + * 注册import bean定义 + */ + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + boolean candidateFound = false; + // 获取注解 + Set annTypes = importingClassMetadata.getAnnotationTypes(); + for (String annType : annTypes) { + // 注解属性 + AnnotationAttributes candidate = AnnotationConfigUtils.attributesFor(importingClassMetadata, annType); + if (candidate == null) { + continue; + } + // 获取 mode 属性 + Object mode = candidate.get("mode"); + // 获取代理对象 + Object proxyTargetClass = candidate.get("proxyTargetClass"); + if (mode != null && proxyTargetClass != null && AdviceMode.class == mode.getClass() && + Boolean.class == proxyTargetClass.getClass()) { + candidateFound = true; + if (mode == AdviceMode.PROXY) { + // 注册 + AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry); + if ((Boolean) proxyTargetClass) { + AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry); + return; + } + } + } + } + if (!candidateFound && logger.isInfoEnabled()) { + String name = getClass().getSimpleName(); + logger.info(String.format("%s was imported but no annotations were found " + + "having both 'mode' and 'proxyTargetClass' attributes of type " + + "AdviceMode and boolean respectively. This means that auto proxy " + + "creator registration and configuration may not have occurred as " + + "intended, and components may not be proxied as expected. Check to " + + "ensure that %s has been @Import'ed on the same class where these " + + "annotations are declared; otherwise remove the import of %s " + + "altogether.", name, name, name)); + } + } + +} +``` \ No newline at end of file