首页 > 其他分享 >Spring的BeanDefinition定义、BeanDefinitionRegistry注册中心及解析原理

Spring的BeanDefinition定义、BeanDefinitionRegistry注册中心及解析原理

时间:2022-11-25 11:57:53浏览次数:33  
标签:String Nullable Spring void Bean boolean BeanDefinitionRegistry BeanDefinition

BeanDefinition定义

Bean的定义信息是Spring容器的一个核心概念,核心接口是BeanDefinition。

Spring容器启动的过程中,会将Bean解析成Spring内部的BeanDefinition结构。

不管是是通过xml配置文件的<Bean>标签,还是通过注解配置的@Bean,它最终都会被解析成一个Bean定义信息(对象),最后我们的Bean工厂就会根据这份Bean的定义信息,对bean进行实例化、初始化等等操作。

BeanDefinition源码分析

总体的类图:

因为它继承了AttributeAccessor,和BeanMetadataElement,所以我们先有必要来了解下这两个接口:

AttributeAccessor:定义了对对象元数据访问的抽象接口

// 接口都比较简单  就是定义了对对象属性的一些访问方法
//说明它可以持有Bean元数据元素,作用是可以持有XML文件的一个bean标签对应的Object(或者@Configuration元配置对象)
public interface AttributeAccessor {
	
    void setAttribute(String name, @Nullable Object value);
    @Nullable
    Object getAttribute(String name);
    @Nullable
    Object removeAttribute(String name);
    boolean hasAttribute(String name);
    String[] attributeNames();
}

AttributeAccessorSupport是唯一抽象实现,内部基于LinkedHashMap实现了所有的接口,供其他子类继承使用 主要针对属性CRUD操作。

BeanMetadataElement:具有访问source(配置源)的能力

这个方法在@Configuration中使用较多,因为它会被代理。

//接口提供了一个getResource()方法,用来传输一个可配置的源对象。
public interface BeanMetadataElement {

    /**
     * Return the configuration source {@code Object} for this metadata element
     * (may be {@code null}).
     * 返回元数据元素配置元对象
     */
    @Nullable
    Object getSource();
}

BeanDefinition:定义了Bean的各种信息

一个BeanDefinition描述了一个bean的实例,包括属性值,构造方法参数值和继承自它的类的更多信息。

BeanDefinition仅仅是一个最简单的接口,主要功能是允许BeanFactoryPostProcessor能够检索并修改属性值和别的bean的元数据,例如:PropertyPlaceHolderConfigurer

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

    // 单例Bean还是原型Bean
    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    
    // Bean角色
    int ROLE_APPLICATION = 0; //应用程序重要组成部分
    int ROLE_SUPPORT = 1; //做为大量配置的一部分(支持、扩展类)  实际上就是说,我这个Bean是用户的,是从配置文件中过来的。
    int ROLE_INFRASTRUCTURE = 2; //指内部工作的基础构造  实际上是说我这Bean是Spring自己的,和你用户没有一毛钱关系


    // Modifiable attributes
    //parent definition(若存在父类的话,就设置进去)
    void setParentName(@Nullable String parentName);
    @Nullable
    String getParentName();
    
    // 指定Class类型。需要注意的是该类型还有可能被改变在Bean post-processing阶段
    // 若是getFactoryBeanName  getFactoryMethodName这种情况下会改变
    void setBeanClassName(@Nullable String beanClassName);
    @Nullable
    String getBeanClassName();

    //SCOPE_SINGLETON或者SCOPE_PROTOTYPE两种
    void setScope(@Nullable String scope);
    @Nullable
    String getScope();

    // @Lazy 是否需要懒加载(默认都是立马加载的)
    void setLazyInit(boolean lazyInit);
    boolean isLazyInit();
    
    // 此Bean定义需要依赖的Bean(显然可以有多个)
    void setDependsOn(@Nullable String... dependsOn);
    @Nullable
    String[] getDependsOn();
    
    // 这个Bean是否允许被自动注入到别的地方去(默认都是被允许的)
    // 注意:此标志只影响按类型装配,不影响byName的注入方式的~~~~
    void setAutowireCandidate(boolean autowireCandidate);
    boolean isAutowireCandidate();

    // 是否是首选的  @Primary
    void setPrimary(boolean primary);
    boolean isPrimary();
    
    // 指定使用的工厂Bean(若存在)的名称~
    void setFactoryBeanName(@Nullable String factoryBeanName);
    @Nullable
    String getFactoryBeanName();
    //指定工厂方法~
    void setFactoryMethodName(@Nullable String factoryMethodName);
    @Nullable
    String getFactoryMethodName();
    
    // 获取此Bean的构造函数参数值们  ConstructorArgumentValues:持有构造函数们的 
    // 绝大多数情况下是空对象 new ConstructorArgumentValues出来的一个对象
    // 当我们Scan实例化Bean的时候,可能用到它的非空构造,这里就会有对应的值了,然后后面就会再依赖注入了
    ConstructorArgumentValues getConstructorArgumentValues();
    default boolean hasConstructorArgumentValues() {
    	return !getConstructorArgumentValues().isEmpty();
    }

	// 获取普通属性集合~~~~
    MutablePropertyValues getPropertyValues();
    default boolean hasPropertyValues() {
    	return !getPropertyValues().isEmpty();
    }

    // Read-only attributes
    boolean isSingleton();
    boolean isPrototype();
    boolean isAbstract();
	
    // 对应上面的role的值
    int getRole();
    //@Description
    @Nullable
    String getDescription();
    // 返回该Bean定义来自于的资源的描述(用于在出现错误时显示上下文)
    @Nullable
    String getResourceDescription();
    //返回原始BeanDefinition,如果没有则返回@null
    // 若这个Bean定义被代理、修饰过  这个方法可以返回原始的
    @Nullable
    BeanDefinition getOriginatingBeanDefinition();
}

 

标签:String,Nullable,Spring,void,Bean,boolean,BeanDefinitionRegistry,BeanDefinition
From: https://www.cnblogs.com/xfeiyun/p/16924660.html

相关文章

  • springboot创建多级实体
    1.创建实体,这是排序的基本字段,其他字段自定义增加importjava.util.List;importorg.springframework.data.annotation.Transient;publicclassHierachyDeviceMod......
  • 【Java】java | springcloud-alibaba版本说明 | springboot对应版本
     ......
  • 【Java】java | springboot | 全局异常处理 | 拦截404
    一、说明        1、maven项目        2、springboot项目        3、走统一异常处理二、代码1、拦截4041)直接copy@ExceptionHandler(NoHandlerFoun......
  • Spring Data Jpa
    SpringDataJpa学习SpringDataJpa是应⽤于Dao层的⼀个框架,简化数据库开发的,作⽤和Mybatis框架⼀样,但是在使⽤⽅式和底层机制是有所不同的。最明显的⼀个特点,SpringDat......
  • Spring Security(5)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 经常上网的人都应该有这样的体验:很多网站或者APP只需要第一次登录时输入用户名和密码之后,后面很长一段时间内就不需要再......
  • SpringCloud-OpenFeign-使用细节
    1.openfeign调用HttpServletRequest作为参数报错..(主要针对请求头信息透传)https://blog.csdn.net/qq_44783283/article/details/1135309102.OpenFeign传输文件(针对文件......
  • springboot笔记
    微服务阶段javase:OOPmysql:持久化html+css+js+jquery+框架:视图,框架不熟练,css不好;Javaweb:独立开发MVC三层架构的网站了:原始ssm:框架:简化了我们的开发流程,配置也开始较......
  • 在Spring Security中如何获取AuthenticationManager对象?
    有时需要使用AuthenticationManager(以下简称Manager)对象,可是这个对象不是Bean,没有直接保存在Spring的Bean库中。那么如何获取SpringSecurity中的这个对象呢?在SpringSecu......
  • SpringBoot整合Quartz
    1.Quartz1.1.Quartz简介Quartz是OpenSymphony开源组织在JobScheduling领域又一个开源项目,是完全由Java开发的一个开源任务日程管理系统,“任务进度管理器”就......
  • Spring 5 中文解析之测试篇-Spring测试介绍和单元测试
    微信公众号:测试本章介绍了Spring对集成测试的支持以及单元测试的最佳实践。Spring团队提倡测试驱动开发(TDD)。Spring的团队发现,正确使用控制反转(IoC)的确是简化单元测试和......