Skip to content

Latest commit

 

History

History
106 lines (90 loc) · 3.84 KB

Spring-Import.md

File metadata and controls

106 lines (90 loc) · 3.84 KB

Spring Import

分析

  • org.springframework.context.annotation.Import
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documentedpublic @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
publicinterfaceImportBeanDefinitionRegistrar { /** * Register bean definitions as necessary based on the given annotation metadata of * the importing {@code @Configuration} class. * <p>Note that {@link BeanDefinitionRegistryPostProcessor} types may <em>not</em> 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 */voidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata, BeanDefinitionRegistryregistry); }
  • 两个实现类
    1. org.springframework.context.annotation.AutoProxyRegistrar
    2. org.springframework.context.annotation.AspectJAutoProxyRegistrar

AutoProxyRegistrar

publicclassAutoProxyRegistrarimplementsImportBeanDefinitionRegistrar { privatefinalLoglogger = LogFactory.getLog(getClass()); /** * 注册import bean定义 */@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata, BeanDefinitionRegistryregistry) { booleancandidateFound = false; // 获取注解Set<String> annTypes = importingClassMetadata.getAnnotationTypes(); for (StringannType : annTypes) { // 注解属性AnnotationAttributescandidate = AnnotationConfigUtils.attributesFor(importingClassMetadata, annType); if (candidate == null) { continue; } // 获取 mode 属性Objectmode = candidate.get("mode"); // 获取代理对象ObjectproxyTargetClass = 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()) { Stringname = 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)); } } }
close