展开

关键词

Spring 注解编程之 AnnotationMetadata

在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解。 这篇文章我们主要深入 AnnotationMetadata,了解其底层原理。 Spring 版本为 5.1.8-RELEASE AnnotationMetadata 结构 使用 IDEA 生成 AnnotationMetadata 类图,如下: ? 基于 AnnotationMetadata#getMetaAnnotationTypes方法,查看两者实现区别。 总结 本文介绍了 AnnotationMetadata两种实现方案,一种基于 Java 反射,另一种基于 ASM 框架。 两种实现方案适用于不同场景。

93610

【小家Spring】聊聊Spring中的那些【Metadata】,举例讲解:AnnotationMetadata、 MethodMetadata

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 {

3.4K40
  • 广告
    关闭

    【玩转 Cloud Studio】有奖调研征文,千元豪礼等你拿!

    想听听你玩转的独门秘籍,更有机械键盘、鹅厂公仔、CODING 定制公仔等你来拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Spring元数据Metadata的使用,注解编程之AnnotationMetadata,ClassMetadata、MetadataReaderFactory【享学Spring】

    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(

    23420

    程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!

    annotationMetadata) { if (! autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata); // 返回的就是需要注册到 annotationMetadata) { if (! this.isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } else { // annotationMetadata) { if (!

    18930

    Feign自动装配原理

    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<String, Object> attributes) { // 1.获取标注@Feign注解的接口名称 String className = annotationMetadata.getClassName(); // 2.使用BeanDefinitionBuilder构造bean:FeignClientFactoryBean

    42820

    spring 自动配置(中) 自动配置原理

    annotationMetadata) { if (! annotationMetadata) { if (! annotationMetadata) { if (! 其中, grouping.getImports()调用了回调函数 process(AnnotationMetadata annotationMetadata, DeferredImportSelector annotationMetadata)并没有被调用。

    97620

    为什么我要写spring.factories文件?

    通过其源码可以看出关键的部分为, @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { annotationMetadata) { if (! isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes(annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata 进一步查看getCandidateConfigurations方法的源码, protected List<String> getCandidateConfigurations(AnnotationMetadata

    2K20

    spring注解之@Import注解的三种使用方式

    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的类型、

    36930

    SpringBoot - 自动装配 源码解析

    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<String> exclusions = getExclusions(annotationMetadata

    12120

    SpringBoot开篇

    annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { RootBeanDefinition beanDefinition annotationMetadata) { if (! annotationMetadata) { if (! attributes = this.getAttributes(annotationMetadata); // 看这里 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); // 去重 configurations =

    6110

    18-SpringBoot自动配置-@EnableAutoConfiguration注解

    annotationMetadata) { if (! isEnabled(annotationMetadata)) { return NO_IMPORTS; } // 这里会读取很多需要配置的类 AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata); return StringUtils.toStringArray (autoConfigurationEntry.getConfigurations()); } 继续进入 getAutoConfigurationEntry(annotationMetadata) (AnnotationMetadata metadata, AnnotationAttributes attributes) { // 1.

    9120

    从源码看Spring Boot 2.0.1

    public String[] selectImports(AnnotationMetadata annotationMetadata) { if (! this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { AutoConfigurationMetadata ); List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes } } getCandidateConfigurations() 方法 protected List<String> getCandidateConfigurations(AnnotationMetadata    > public String[] selectImports() {List<String> configurations = this.getCandidateConfigurations(annotationMetadata

    29320

    【原创】Spring Boot终极篇《上》

    @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { //判断enableautoconfiguration annotationMetadata) { //判断是否开启注解,如果开启则返回空对象 if (! isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } //获得注解的属性 AnnotationAttributes attributes = getAttributes(annotationMetadata); //这个方法是用来获取默认支持的自动配置类名列表 我们进入这个 getCandidateConfigurations protected List<String> getCandidateConfigurations(AnnotationMetadata

    22720

    源码学习系列之SpringBoot自动配置(篇一)

    DeterminableImports { Registrar() { } public void registerBeanDefinitions(AnnotationMetadata AnnotationMetadata:SpringBoot注解元数据 所以,@AutoConfigurationPackage开启后,就可以将主配置类(@SpringBootApplication)所在包及其子包里面的所有组件都扫描到 annotationMetadata) { if (! this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { try 分隔的实现类,使用SpringFactoriesLoader可以实现将相应的实现类注入Spirng容器 protected List<String> getCandidateConfigurations(AnnotationMetadata

    26120

    神秘又强大的@SpringBootApplication注解

    方法源码如下: @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<String> configurations = getCandidateConfigurations(annotationMetadata

    40650

    Spring Cloud Feign源码解析

    我们来看一下该接口的方法 public void registerBeanDefinitions( AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry); 在FeignClientsRegistrar中的实现 @Override public void registerBeanDefinitions(AnnotationMetadata public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) annotationMetadata = beanDefinition.getMetadata(); Assert.isTrue(annotationMetadata.isInterface @FeignClient can only be specified on an interface"); Map<String, Object> attributes = annotationMetadata

    33120

    springboot自动装配原理

    annotationMetadata) { if (! isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationMetadata autoConfigurationMetadata annotationMetadata) { if (! isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes (annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata,

    14130

    SpringBoot 自动装配简述(八)

    annotationMetadata) { if (! isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationMetadata autoConfigurationMetadata annotationMetadata) { if (! isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes (annotationMetadata); // 获取候选配置 List<String> configurations = getCandidateConfigurations(annotationMetadata

    5310

    SpringBoot-自动配置-原理解析

    annotationMetadata) { if (! isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationEntry autoConfigurationEntry protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { (annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata, 所以我们只需要分析第6行这个方法getCandidateConfigurations(annotationMetadata, attributes); 是它返回了我们需要给容器中默认注册的bean的名称的字符数组

    13831

    扫码关注腾讯云开发者

    领取腾讯云代金券