返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBeanDefinition使用介绍
  • 494
分享到

SpringBeanDefinition使用介绍

SpringBeanDefinition作用SpringBeanDefinition 2023-01-04 15:01:30 494人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 前言2. BeanDefinition2.1 AttributeAccessor2.2 BeanMetadataElement2.3 BeanDefinition2.4 A

1. 前言

spring最重要的一个概念当属Bean了,我们写的Controller、Service、Dao凡是加了对应注解交给Spring管理的,都是Spring容器中的一个Bean。把我们自己写的类变成一个Bean交给Spring管理有很多的好处,比如我们不用自己去new对象了,Spring会帮我们在适当的时候去实例化对象;再比如Spring还会维护Bean的依赖关系,自动注入依赖的对象;再比如Spring还可以基于Bean生成代理对象,来对原生的Bean进行功能上的增强等等。

Spring源码中,有一个重要的接口BeanDefinition,它用来表示Bean的定义。比如Bean的名称、所属的Class、是否需要延迟实例化,是单例还是原型?等等信息。不管你是通过xml来配置,还是JavaConfig的方式,还是基于注解的方式,在Spring看来它们都是一个BeanDefinition

2. BeanDefinition

BeanDefinition是一个接口,本身的类图还是比较简单的,继承了AttributeAccessorBeanMetadataElement接口。

2.1 AttributeAccessor

AttributeAccessor接口代表一个属性访问器,它的作用是可以给Bean附加一些自定义的属性,并提供访问方法。

例如:originalTargetClass属性代表aop被代理的原始Class对象;preserveTargetClass属性代表是否基于类进行代理。

AttributeAccessorSupport是其中一个实现类,它底层通过LinkedHashMap来存储这些附加属性。

public interface AttributeAccessor {
	void setAttribute(String name, @Nullable Object value);
	Object getAttribute(String name);
	Object removeAttribute(String name);
	boolean hasAttribute(String name);
	String[] attributeNames();
}

2.2 BeanMetadataElement

BeanMetadataElement接口我也不是很清楚具体作用是啥,网上对它的介绍也比较少。

public interface BeanMetadataElement {
	
	@Nullable
	Object getSource();
}

经过实验发现,对于常规的Bean来说,可以通过getSource()方法获取Bean对应的资源。例如:现在有一个BeanDefinition它的BeanClass来自ClassPath下的包,getSource()方法可以获取到这个Class文件对应的FileSystemResource资源。

2.3 BeanDefinition

终于看到主角了,BeanDefinition还是一个接口,它提供了一系列方法来读写Bean的一些属性定义,方法名基本都能见名知意,注释里已经把方法的作用写上了。

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
  
  void setParentName(@Nullable String parentName);
  String getParentName();
  
  void setBeanClassName(@Nullable String beanClassName);
  String getBeanClassName();
  
  void setScope(@Nullable String scope);
  String getScope();
  
  void setLazyInit(boolean lazyInit);
  boolean isLazyInit();
  
  void setDependsOn(@Nullable String... dependsOn);
  String[] getDependsOn();
  
  void setAutowireCandidate(boolean autowireCandidate);
  boolean isAutowireCandidate();
  
  void setPrimary(boolean primary);
  boolean isPrimary();
  void setFactoryBeanName(@Nullable String factoryBeanName);
  String getFactoryBeanName();
  void setFactoryMethodName(@Nullable String factoryMethodName);
  String getFactoryMethodName();
  
  ConstructorArgumentValues getConstructorArgumentValues();
  default boolean hasConstructorArgumentValues() {
    return !getConstructorArgumentValues().isEmpty();
  }
  
  MutablePropertyValues getPropertyValues();
  default boolean hasPropertyValues() {
    return !getPropertyValues().isEmpty();
  }
  
  void setInitMethodName(@Nullable String initMethodName);
  @Nullable
  String getInitMethodName();
  
  void setDestroyMethodName(@Nullable String destroyMethodName);
  String getDestroyMethodName();
  void setRole(int role);
  int getRole();
  
  void setDescription(@Nullable String description);
  String getDescription();
  
  boolean isSingleton();
  
  boolean isPrototype();
  
  boolean isAbstract();
  @Nullable
  String getResourceDescription();
  
  @Nullable
  BeanDefinition getOriginatingBeanDefinition();
}

2.4 AbstractBeanDefinition

AbstractBeanDefinition是一个抽象类,实现了绝大多数BeanDefinition的功能,源码也很简单,通过大量属性来记录BeanDefinition对应方法设置的属性值,代码就不贴了。

2.5 GenericBeanDefinition

GenericBeanDefinition是一个类,它是BeanDefinition的标准实现,继承自AbstractBeanDefinition。刚刚已经说过了,由于AbstractBeanDefinition已经实现了绝大多数方法了,所以GenericBeanDefinition的代码也极其简单,只实现了一个读写parentName的方法。

2.6 AnnotatedGenericBeanDefinition

顾名思义,AnnotatedGenericBeanDefinition是一个基于注解的BeanDefinition标准实现,它继承自GenericBeanDefinition,已经获得了BeanDefinition完整的能力了。只不过,由于是基于注解的标准实现,所以它还实现了AnnotatedBeanDefinition接口,以此来获得获取注解元数据的能力。

public interface AnnotatedBeanDefinition extends BeanDefinition {
  // 获取注解元数据
  AnnotationMetadata getMetadata();
  // 获取工厂方法元数据的能力
  MethodMetadata getFactoryMethodMetadata();
}

AnnotatedGenericBeanDefinition的代码也同样极其简单,只是提供了两个属性metadatafactoryMethodMetadata来记录注解元数据和工厂方法元数据而已。

2.7 其它实现

本文着重分析了AnnotatedGenericBeanDefinition这一条分支,实际上在Spring中BeanDefinition还有很多实现类,例如:

  • RootBeanDefinition:ChildBeanDefinition:基于父Bean的子BeanDefinition。
  • ConfigurationClassBeanDefinition:加了@Bean注解的BeanDefinition。
  • ScannedGenericBeanDefinition:加了@Component及其派生注解的BeanDefinition。

到此这篇关于Spring BeanDefinition使用介绍的文章就介绍到这了,更多相关Spring BeanDefinition内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBeanDefinition使用介绍

本文链接: https://lsjlt.com/news/176711.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBeanDefinition使用介绍
    目录1. 前言2. BeanDefinition2.1 AttributeAccessor2.2 BeanMetadataElement2.3 BeanDefinition2.4 A...
    99+
    2023-01-04
    Spring BeanDefinition作用 Spring BeanDefinition
  • mysqldump使用介绍
    1,备份单个数据库的结构和数据mysqldump -uroot -p123456 test1 > /root/test1.sql2,还原单个数据库的结构和数据方法1:使用mysql命令mysql -u...
    99+
    2024-04-02
  • GoLangchannel使用介绍
    目录停止信号任务定时解耦生产方和消费方控制并发数停止信号 channel 用于停止信号的场景还是挺多的,经常是关闭某个 channel 或者向 channel 发送一个元素,使得接收...
    99+
    2024-04-02
  • puppet介绍、使用
    Puppet是一个自动化配置管理工具,可以帮助管理和部署大规模的计算机系统和网络设备。它允许用户通过定义所需的系统状态和配置,然后自...
    99+
    2023-09-23
    puppet
  • MinIO介绍使用
    MinIO介绍使用 MinIO 介绍 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。 MinIO 英文官网 MinIO 中文官网 注意:中...
    99+
    2023-09-02
    docker linux java
  • PreferenceActivity使用介绍
    PreferenceActivity是Android中的一个界面组件,用于展示和编辑应用程序的设置选项。它继承自Activity,并...
    99+
    2023-09-14
    使用
  • ZookeeperZkClient使用介绍
    目录前言1、创建会话2、创建节点3、删除节点4、获取子节点5、获取数据(节点是否存在、更新、删除)前言 接下来,还是从创建会话、创建节点、读取数据、更新数据、删除节点等方面来介绍如何...
    99+
    2024-04-02
  • JS.findElementById()使用介绍
    复制代码 代码如下: his.findElementById = function (identifier, frame) { if (!frame) { frame = windo...
    99+
    2022-11-15
    findElementById
  • Android WorkManager使用介绍
    一、引言   WorkManager 是google提供的异步执行任务的管理框架,是 Android Jetpack 的一部分,会根据手机的API版本和应用程序的状态来选择适当的方式执行任务。   在...
    99+
    2023-09-07
    android
  • Apache介绍及使用
    Apache的介绍 Apache全称:Apache HTTPD Server ;是Apache基金会的一个开源网页服务器,可以在大多数计算机操作系统中运行。Apache提供的服务器又称为:补丁服务器 ...
    99+
    2023-09-17
    apache php 服务器
  • VuePostCSS的使用介绍
    目录PostCSS使用安装依赖运行使用第三方插件autoprefixer使用第三方插件postcss-preset-env使用第三方插件postcss-pxtorem运行的新方式Po...
    99+
    2023-02-06
    Vue PostCSS Vue PostCSS的使用
  • ehcache 3.* 使用介绍
    官网地址:http://×××w.ehcache.org/documentation/3.6/getting-started.html    根据官网的说明使用起来非常简单,尤其是在3.0之后, 不管事xml配置文件还是链式编码配置。先看示...
    99+
    2023-01-31
    ehcache
  • Zookeeper Curator使用介绍
    目录1、添加依赖2、创建会话3、创建节点4、删除节点5、获取数据6、更新数据从编码风格上来讲,curator提供了基于Fluent的编程风格支持 1、添加依赖 在pom.xml文件中...
    99+
    2024-04-02
  • Android ViewBinding使用介绍
    目录一、kotlin-android-extensions二、ViewBinding使用1.gradle配置2.在Activity 使用3.在Fragment使用4.在Adapter...
    99+
    2024-04-02
  • fastjson2 介绍及使用
    目录 前言一、导入fastjson2依赖二、json对象与json数组的创建json对象创建json数组创建 三、json对象取值与json数组遍历取值json对象取值json数组遍历取值 四、json对象与字符串的转换js...
    99+
    2023-08-18
    java fastjson2 fastjson fastJson
  • SVN介绍和使用
    文章目录 SVN的介绍SVN是什么作用 安装包下载SVN的使用检出提交显示日志更新 patch的使用创建使用 SVN的介绍 SVN是什么 SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分...
    99+
    2023-08-19
    svn
  • jQuery cdn使用介绍
    jQuery是一个快速、小巧、功能丰富的JavaScript库。使用jQuery可以简化HTML文档的遍历、事件处理、动画等操作。j...
    99+
    2023-08-17
    jQuery
  • Python中itertools简介使用介绍
    目录Python中itertools模块一、 简介二、 使用介绍1、 常用迭代器1.1 chain1.2 groupby2、 无穷迭代器2.1 count2.2 cycle2.3 r...
    99+
    2022-12-28
    Python中itertools Python itertools详解 Python itertools
  • Android View Binding使用介绍
    前言 Android Studio稳定版发布了3.6版本,带来了一些新变化:首先外观,启动页变了,logo改了,更显现代化;增加Multi Pr...
    99+
    2022-06-06
    view Android
  • JDBC的介绍与使用
    1. JDBC的介绍   jdbc为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。  访问数据库的流程  在连接这一过程中,一般初学者是MySQL和java在同一个电脑上,建立...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作