在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解。...这篇文章我们主要深入 AnnotationMetadata,了解其底层原理。...Spring 版本为 5.1.8-RELEASE AnnotationMetadata 结构 使用 IDEA 生成 AnnotationMetadata 类图,如下: ?...基于 AnnotationMetadata#getMetaAnnotationTypes方法,查看两者实现区别。...总结 本文介绍了 AnnotationMetadata两种实现方案,一种基于 Java 反射,另一种基于 ASM 框架。 两种实现方案适用于不同场景。
AnnotatedTypeMetadata:对AnnotatedElement的封装适配 它没有Standard的实现(毕竟AnnotatedElement也是接口,没办法做基础实现的),但是它有两个非常重要的子接口:AnnotationMetadata...和MethodMetadata 这两个接口是Spring内部的直接运用 二级接口AnnotationMetadata和MethodMetadata 这两个元数据接口,在Spring内部非常常用,需要掌握...前者Spring2.5就有了,后者Spring3.0才有的 AnnotationMetadata:对Class相关的多个注解进行获取和判断 public interface AnnotationMetadata...先聊聊标准实现(前两个) StandardAnnotationMetadata:扩展了StandardClassMetadata增加对注解的支持 它继承了StandardClassMetadata,然后实现了AnnotationMetadata...public class StandardAnnotationMetadata extends StandardClassMetadata implements AnnotationMetadata {
annotationMetadata; // 唯一构造函数:给上面三个私有属性赋值,下面就只需提供get方法即可 SimpleMetadataReader(Resource resource,...Spring注解编程中AnnotationMetadata的使用 Spring从3.0开始就大量的使用到了注解编程模式,所以可想而知它对元数据(特别是注解元数据)的使用是非常多的,此处我只给出非常简单的总结...子接口的效果(重要) System.out.println("==============AnnotationMetadata=============="); AnnotationMetadata...annotationMetadata = metadata; System.out.println(annotationMetadata.getAnnotationTypes()); // [...())); // false(注意这一组的结果和上面相反,因为它看的是meta) System.out.println(annotationMetadata.hasMetaAnnotation(
@Override //根据autoConfigurationMetadata条件执行过滤 public String[] selectImports(AnnotationMetadata...annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return NO_IMPORTS; } //加载自动装配的元信息 AutoConfigurationMetadata...annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } //获取@EnableAutoConfiguration标注类的元信息
* */public interface ImportSelector { /** * 根据导入的 @Configuration 类的 AnnotationMetadata(注解元数据),...String importClassName; public Entry(AnnotationMetadata metadata, String importClassName)...下面我们来看看 selectImports 方法的源码,如下所示: @Override public String[] selectImports(AnnotationMetadata annotationMetadata...*/ protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata...isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } // 从AnnotationMetadata
annotationMetadata) { if (!...autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata); // 返回的就是需要注册到...annotationMetadata) { if (!...this.isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } else { //...annotationMetadata) { if (!
通过其源码可以看出关键的部分为, @Override public String[] selectImports(AnnotationMetadata annotationMetadata) {...annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes...= getAttributes(annotationMetadata); List configurations = getCandidateConfigurations(annotationMetadata...进一步查看getCandidateConfigurations方法的源码, protected List getCandidateConfigurations(AnnotationMetadata
registerFeignClients(metadata, registry); } 这里分为了2步 注册缺省配置 private void registerDefaultConfiguration(AnnotationMetadata...类型的bean,这个类型的bean也是本文刚开始提到的被Feign上下文持有的各个Feign客户端持有的 注册各个Feign客户端 public void registerFeignClients(AnnotationMetadata...annotationMetadata = beanDefinition.getMetadata(); Assert.isTrue(annotationMetadata.isInterface...annotationMetadata, Map attributes) { // 1.获取标注@Feign注解的接口名称 String className...= annotationMetadata.getClassName(); // 2.使用BeanDefinitionBuilder构造bean:FeignClientFactoryBean
annotationMetadata) { if (!...annotationMetadata) { if (!...annotationMetadata) { if (!...其中, grouping.getImports()调用了回调函数 process(AnnotationMetadata annotationMetadata, DeferredImportSelector...annotationMetadata)并没有被调用。
annotationMetadata) { if (!...());}protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata...getAttributes(annotationMetadata); List configurations = getCandidateConfigurations(annotationMetadata...检查自动配置是否开启的源码,如下所示:@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {...);// 从 AnnotationMetadata 返回适当的 AnnotationAttributes。
annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return NO_IMPORTS; } // 这里会读取很多需要配置的类 AutoConfigurationEntry...autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata); return StringUtils.toStringArray...(autoConfigurationEntry.getConfigurations()); } 继续进入 getAutoConfigurationEntry(annotationMetadata)...(AnnotationMetadata metadata, AnnotationAttributes attributes) { // 1.
//获取主程序所在的目录为位置,metadata是元注解信息@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata...annotationMetadata) {if (!...annotationMetadata) { //判断是否启用了自动配置if (!...isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata...); //获取候选自动配置类列表List configurations = getCandidateConfigurations(annotationMetadata,attributes
方法源码如下: @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationMetadata autoConfigurationMetadata...annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes...= getAttributes(annotationMetadata); List configurations = getCandidateConfigurations(annotationMetadata
public interface ImportSelector String[] selectImports (AnnotationMetadata importingClassMetadata); }...ImportSelector 接口只提供了一个 参数为 AnnotationMetadata 的方法,返回的结果为一个字符串数组。...其中参数 AnnotationMetadata 内包含了被@lmport 注解的类的注解信息。...annotationMetadata) { //检查自动配置功能是否开肩,默认为开启 if (!...@Override public String[] selectImports (AnnotationMetadata annotationMetadata) { if (!
annotationMetadata) { if (!...()); } protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata...(annotationMetadata); List configurations = getCandidateConfigurations(annotationMetadata,...annotationMetadata) { if (!...(annotationMetadata); List configurations = getCandidateConfigurations(annotationMetadata,
因为在它的selectImports()你可以实现各种获取bean Class的逻辑,通过其参数AnnotationMetadata可以获取到@Import标注的Class的各种信息,包括其Class名称...annotationMetadata, DeferredImportSelector deferredImportSelector) { Assert.state(deferredImportSelector...annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes =...getAttributes(annotationMetadata); List configurations = getCandidateConfigurations(annotationMetadata
that should be imported */ protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata...annotationMetadata) { if (!...isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes...(annotationMetadata, attributes); // 排重 configurations = removeDuplicates(configurations); //...根据EnableAutoConfiguration注解中属性,获取不需要自动装配的类名单 Set exclusions = getExclusions(annotationMetadata
annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { RootBeanDefinition beanDefinition...annotationMetadata) { if (!...annotationMetadata) { if (!...attributes = this.getAttributes(annotationMetadata); // 看这里 List configurations...= this.getCandidateConfigurations(annotationMetadata, attributes); // 去重 configurations =
annotationMetadata) { return new String[0]; } } 分析实现接口的selectImports方法中的: 1、返回值: 就是我们实际上要导入到容器中的组件全类名...【重点 】 2、参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】 需要注意的是selectImports方法可以返回空数组但是不能返回null,...annotationMetadata) { return new String[]{"com.yc.Test.TestDemo3"}; } } 第二步:编写TestDemo 类...annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { } } 参数分析: 第一个参数:annotationMetadata...annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { //指定bean定义信息(包括bean的类型、
public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!...this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { AutoConfigurationMetadata...); List configurations = this.getCandidateConfigurations(annotationMetadata, attributes...} } getCandidateConfigurations() 方法 protected List getCandidateConfigurations(AnnotationMetadata... ?> public String[] selectImports() {List configurations = this.getCandidateConfigurations(annotationMetadata
领取专属 10元无门槛券
手把手带您无忧上云