关于BeanDefinition见《Spring之Ⅰ:BeanDefinition

BeanDefinitionRegistry的类图:

BeanDefinition 的注册接口,如 RootBeanDefinition 和 ChildBeanDefinition。它通常由 BeanFactories 实现,在 Spring 中已知的实现者为:DefaultListableBeanFactory 和 GenericApplicationContext。BeanDefinitionRegistry 是 Spring 的 Bean 工厂包中唯一封装 BeanDefinition 注册的接口。BeanDefinitionRegistry 接口定义了关于 BeanDefinition 注册、注销、查询等一系列的操作。

BeanDefinitionRegistry接口源码如下:

  1. package org.springframework.beans.factory.support;
  2. public interface BeanDefinitionRegistry extends AliasRegistry {
  3. // 往注册表中注册一个新的 BeanDefinition 实例
  4. void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
  5. throws BeanDefinitionStoreException;
  6.  
  7. // 移除注册表中已注册的 BeanDefinition 实例
  8. void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
  9.  
  10. // 从注册中取得指定的 BeanDefinition 实例
  11. BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
  12.  
  13. // 判断 BeanDefinition 实例是否在注册表中(是否注册)
  14. boolean containsBeanDefinition(String beanName);
  15.  
  16. // 取得注册表中所有 BeanDefinition 实例的 beanName(标识)
  17. String[] getBeanDefinitionNames();
  18.  
  19. // 返回注册表中 BeanDefinition 实例的数量
  20. int getBeanDefinitionCount();
  21.  
  22. // beanName(标识)是否被占用
  23. boolean isBeanNameInUse(String beanName);
  24. }

SimpleBeanDefinitionRegistry

SimpleBeanDefinitionRegistry 是 BeanDefinitionRegistry 一个简单的实现,它还继承 SimpleAliasRegistry( AliasRegistry 的简单实现),它仅仅只提供注册表功能,无工厂功能。

SimpleBeanDefinitionRegistry 使用 ConcurrentHashMap 来存储注册的 BeanDefinition。

  1. public class SimpleBeanDefinitionRegistry extends SimpleAliasRegistry implements BeanDefinitionRegistry {
  2.  
  3. /** Map of bean definition objects, keyed by bean name */
  4. private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);

他对注册其中的 BeanDefinition 都是基于 beanDefinitionMap 这个集合来实现的,如下:

  1. @Override
  2. public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
  3. throws BeanDefinitionStoreException {
  4.  
  5. Assert.hasText(beanName, "'beanName' must not be empty");
  6. Assert.notNull(beanDefinition, "BeanDefinition must not be null");
  7. this.beanDefinitionMap.put(beanName, beanDefinition);
  8. }
  9.  
  10. @Override
  11. public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
  12. if (this.beanDefinitionMap.remove(beanName) == null) {
  13. throw new NoSuchBeanDefinitionException(beanName);
  14. }
  15. }
  16.  
  17. @Override
  18. public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
  19. BeanDefinition bd = this.beanDefinitionMap.get(beanName);
  20. if (bd == null) {
  21. throw new NoSuchBeanDefinitionException(beanName);
  22. }
  23. return bd;
  24. }
  25.  
  26. @Override
  27. public boolean containsBeanDefinition(String beanName) {
  28. return this.beanDefinitionMap.containsKey(beanName);
  29. }
  30.  
  31. @Override
  32. public String[] getBeanDefinitionNames() {
  33. return StringUtils.toStringArray(this.beanDefinitionMap.keySet());
  34. }
  35.  
  36. @Override
  37. public int getBeanDefinitionCount() {
  38. return this.beanDefinitionMap.size();
  39. }
  40.  
  41. @Override
  42. public boolean isBeanNameInUse(String beanName) {
  43. return isAlias(beanName) || containsBeanDefinition(beanName);
  44. }

示例测试:

  1. public class Test {
  2.  
  3. public static void main(String[] args) throws Exception {
  4. BeanDefinitionRegistry beanDefinitionRegistry = new SimpleBeanDefinitionRegistry();
  5. AnnotatedGenericBeanDefinition genericBeanDefinition = new AnnotatedGenericBeanDefinition(Test.class);
  6. beanDefinitionRegistry.registerBeanDefinition("springBean",genericBeanDefinition);
  7. System.out.println(beanDefinitionRegistry.isBeanNameInUse("springBean"));
  8. }
  9. }

输出:

  1. true

Spring之27:BeanDefinitionRegistry的更多相关文章

  1. 【j2ee spring】27、巴巴荆楚网-整合hibernate4+spring4(2)

    巴巴荆楚网-整合hibernate4+spring4(2) 1.图文项目 2.首先我们引入对应的jar包 这里用的是oracle 11g,所以我们使用的数据库连接jar包是ojdbc6, 的区别就是支 ...

  2. 09.Spring Bean 注册 - BeanDefinitionRegistry

    基本概念 BeanDefinitionRegistry ,该类的作用主要是向注册表中注册 BeanDefinition 实例,完成 注册的过程. 它的接口定义如下: public interface ...

  3. Spring Boot (27) actuator服务监控与管理

    actuaotr是spring boot项目中非常强大的一个功能,有助于对应用程序进行监控和管理,通过restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...

  4. 【Spring】27、JPA 实现乐观锁@Version注解的使用

    持久层使用jpa时,默认提供了一个注解@Version来实现乐观锁 简单来说就是用一个version字段来充当乐观锁的作用.先来设计实体类 /** * Created by xujingfeng on ...

  5. spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)

    本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...

  6. Spring框架之beans源码完全解析

    导读:Spring可以说是Java企业开发里最重要的技术.而Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Oriented Programmin ...

  7. Spring容器初始化过程

    一.Spring 容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配号Bean之间的依 ...

  8. spring源码深度解析-1核心实现

    xml配置文件的读取:1:通过集成字AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件2:通过Docum ...

  9. (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制

    前面讲过,spring的生命周期为:实例化前奏-->实例化-->实例化后期-->初始化前期-->初始化-->初始化后期-->bean的具体调用-->销毁前-- ...

随机推荐

  1. ICEM-interface相关操作

    原视频下载地址: https://pan.baidu.com/s/14Tx-eYPccvhrg5wrg7gYvw 密码: 8fdp

  2. Spring Boot|监控-Actuator

    Spring Boot 为我们提供了一个生产级特性-Actuator,包含很多实际有用的API,下面我们就一起来看看这些API. 一.Actuator 首先在程序中引入Actuator <!-- ...

  3. Python将多张图片进行合并拼接

    import PIL.Image as Image import os IMAGES_PATH = r'D:\pics22223\\' # 图片集地址 IMAGES_FORMAT = ['.jpg', ...

  4. PHP的ini_set函数用法

    PHP   ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效.无需打开php.ini文件,就能修改配置,对于虚拟空间来说,很方便. 函数格式:string   in ...

  5. MFC调用CEF实现单页面单COOKIE管理《转》

    cookie简单介绍 cookie存储了网站的一些很重要的信息,如用户身份信息.常用设置.设置地理位置等等各种信息.使用cef访问网站时,如果设置了CefSettings.cache_path参数,则 ...

  6. Linux 限制IP——/etc/hosts.allow和/etc/hosts.deny文件【转】

    就像是 限制特定IP来访 想法 看起来通常的做法是利用hosts的拒绝设置,而它的设置是针对某一个具体的进程,具体的服务,在这里就是sshd了 看起来设置一个网段使用的是 x.x.x.0/24 后面加 ...

  7. 【MySQL】Mac通过brew安装的MySQL重启方法

    问题 在 Mac 上通过 brew install mysql 安装的的MySQL使用基本MySQL命令重启会失败: mysql.server stop mysql.server start mysq ...

  8. Java基础 return 退出main方法的示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  9. Java中字符串操作的基本方法总结:

    1.字母大小写转换: package com.imooc; public class SortDemo { public static void main(String[] args) { char ...

  10. linux无网络情况下安装rpm包

    首先理清楚两个东西:rpm和yum.rpm全称redhat package manager,用来管理软件包:yum全称yellow dog updater,modified,它是rpm的前端程序,因为 ...