专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

spring源码 之 AnnotatedBeanDefinitionReader

作用

用于注解BeanDefinition的读取解析

在哪里初始化:

    public AnnotationConfigApplicationContext() {
        this.reader = new AnnotatedBeanDefinitionReader(this);
        this.scanner = new ClassPathBeanDefinitionScanner(this);
    }

初始化 AnnotationConfigApplicationContext 上下文的时候同时初始化AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner

初始化的时候做了什么事情

    public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
        // 省略非主流程代码......
        //注册spring自带的 BeanFactoryPostProcessor 和 BeanPostProcessor

        (this.registry);
    }

AnnotationConfigUtils.registerAnnotationConfigProcessors 做了什么事情

   // 往bean工厂设置了用于排序的类
    beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
    //这个不懂  todo
    beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());

    //接下来很重要
    //往bean工厂注册 ConfigurationClassPostProcessor //(是一种BeanDefinitionRegistryPostProcessor)很重要,后面讲
    RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
    def.setSource(source);
    beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));    

    //接下来不贴代码,都是往bean工厂注册 BeanPostProcessor
    // 重点 跟@Autowired  @Value  @Inject 有关 
    AutowiredAnnotationBeanPostProcessor 
    // 重点 和@PostConstruct  @Resource @PreDestroy 有关
    CommonAnnotationBeanPostProcessor
    PersistenceAnnotationBeanPostProcessor
    EventListenerMethodProcessor
    DefaultEventListenerFactory

所以初始化就是往bean工厂添加几个spring自带的PostProcessor

需要关注的方法


public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) { // 传入一个class 解析成beandefinition AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass); // 。。。 省略一堆代码,认为是解析beandefinition的过程,比如解析 //是否有@Lazy 然后设置懒加载属性,解析是否有 Primary //然后设置Primary属性 //接下来就是注册beandefinition到bean工厂中,在另外一个类中DefaultListabl // eBeanFactory#registerBeanDefinition 专门解析,其实比较简单,就是往 // map中put BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName); definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry); BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry); }

总结

AnnotatedBeanDefinitionReader 在spring上下文初始化的时候调用,AnnotatedBeanDefinitionReader自己在初始化的时候会往bean工厂注册spring自带的beanFactoryPostProcessor和beanPostProcessor,这些注册到bean工厂的list中,后面会使用到。AnnotatedBeanDefinitionReader#register 可以往bean工厂注册beanDefinition

文章永久链接:https://tech.souyunku.com/26715

未经允许不得转载:搜云库技术团队 » spring源码 之 AnnotatedBeanDefinitionReader

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们