Spring之27:BeanDefinitionRegistry
关于BeanDefinition见《Spring之Ⅰ:BeanDefinition》
BeanDefinitionRegistry的类图:
BeanDefinition 的注册接口,如 RootBeanDefinition 和 ChildBeanDefinition。它通常由 BeanFactories 实现,在 Spring 中已知的实现者为:DefaultListableBeanFactory 和 GenericApplicationContext。BeanDefinitionRegistry 是 Spring 的 Bean 工厂包中唯一封装 BeanDefinition 注册的接口。BeanDefinitionRegistry 接口定义了关于 BeanDefinition 注册、注销、查询等一系列的操作。
BeanDefinitionRegistry接口源码如下:
- package org.springframework.beans.factory.support;
- public interface BeanDefinitionRegistry extends AliasRegistry {
- // 往注册表中注册一个新的 BeanDefinition 实例
- void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
- throws BeanDefinitionStoreException;
- // 移除注册表中已注册的 BeanDefinition 实例
- void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
- // 从注册中取得指定的 BeanDefinition 实例
- BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
- // 判断 BeanDefinition 实例是否在注册表中(是否注册)
- boolean containsBeanDefinition(String beanName);
- // 取得注册表中所有 BeanDefinition 实例的 beanName(标识)
- String[] getBeanDefinitionNames();
- // 返回注册表中 BeanDefinition 实例的数量
- int getBeanDefinitionCount();
- // beanName(标识)是否被占用
- boolean isBeanNameInUse(String beanName);
- }
SimpleBeanDefinitionRegistry
SimpleBeanDefinitionRegistry 是 BeanDefinitionRegistry 一个简单的实现,它还继承 SimpleAliasRegistry( AliasRegistry 的简单实现),它仅仅只提供注册表功能,无工厂功能。
SimpleBeanDefinitionRegistry 使用 ConcurrentHashMap 来存储注册的 BeanDefinition。
- public class SimpleBeanDefinitionRegistry extends SimpleAliasRegistry implements BeanDefinitionRegistry {
- /** Map of bean definition objects, keyed by bean name */
- private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);
他对注册其中的 BeanDefinition 都是基于 beanDefinitionMap 这个集合来实现的,如下:
- @Override
- public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
- throws BeanDefinitionStoreException {
- Assert.hasText(beanName, "'beanName' must not be empty");
- Assert.notNull(beanDefinition, "BeanDefinition must not be null");
- this.beanDefinitionMap.put(beanName, beanDefinition);
- }
- @Override
- public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
- if (this.beanDefinitionMap.remove(beanName) == null) {
- throw new NoSuchBeanDefinitionException(beanName);
- }
- }
- @Override
- public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
- BeanDefinition bd = this.beanDefinitionMap.get(beanName);
- if (bd == null) {
- throw new NoSuchBeanDefinitionException(beanName);
- }
- return bd;
- }
- @Override
- public boolean containsBeanDefinition(String beanName) {
- return this.beanDefinitionMap.containsKey(beanName);
- }
- @Override
- public String[] getBeanDefinitionNames() {
- return StringUtils.toStringArray(this.beanDefinitionMap.keySet());
- }
- @Override
- public int getBeanDefinitionCount() {
- return this.beanDefinitionMap.size();
- }
- @Override
- public boolean isBeanNameInUse(String beanName) {
- return isAlias(beanName) || containsBeanDefinition(beanName);
- }
示例测试:
- public class Test {
- public static void main(String[] args) throws Exception {
- BeanDefinitionRegistry beanDefinitionRegistry = new SimpleBeanDefinitionRegistry();
- AnnotatedGenericBeanDefinition genericBeanDefinition = new AnnotatedGenericBeanDefinition(Test.class);
- beanDefinitionRegistry.registerBeanDefinition("springBean",genericBeanDefinition);
- System.out.println(beanDefinitionRegistry.isBeanNameInUse("springBean"));
- }
- }
输出:
- true
Spring之27:BeanDefinitionRegistry的更多相关文章
- 【j2ee spring】27、巴巴荆楚网-整合hibernate4+spring4(2)
巴巴荆楚网-整合hibernate4+spring4(2) 1.图文项目 2.首先我们引入对应的jar包 这里用的是oracle 11g,所以我们使用的数据库连接jar包是ojdbc6, 的区别就是支 ...
- 09.Spring Bean 注册 - BeanDefinitionRegistry
基本概念 BeanDefinitionRegistry ,该类的作用主要是向注册表中注册 BeanDefinition 实例,完成 注册的过程. 它的接口定义如下: public interface ...
- Spring Boot (27) actuator服务监控与管理
actuaotr是spring boot项目中非常强大的一个功能,有助于对应用程序进行监控和管理,通过restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...
- 【Spring】27、JPA 实现乐观锁@Version注解的使用
持久层使用jpa时,默认提供了一个注解@Version来实现乐观锁 简单来说就是用一个version字段来充当乐观锁的作用.先来设计实体类 /** * Created by xujingfeng on ...
- spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)
本章是<spring4.1.8扩展实战>系列的第六篇,目标是学习如何通过自己写代码的方式,向spring容器中注册bean: 原文地址:https://blog.csdn.net/boli ...
- Spring框架之beans源码完全解析
导读:Spring可以说是Java企业开发里最重要的技术.而Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Oriented Programmin ...
- Spring容器初始化过程
一.Spring 容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配号Bean之间的依 ...
- spring源码深度解析-1核心实现
xml配置文件的读取:1:通过集成字AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件2:通过Docum ...
- (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制
前面讲过,spring的生命周期为:实例化前奏-->实例化-->实例化后期-->初始化前期-->初始化-->初始化后期-->bean的具体调用-->销毁前-- ...
随机推荐
- ICEM-interface相关操作
原视频下载地址: https://pan.baidu.com/s/14Tx-eYPccvhrg5wrg7gYvw 密码: 8fdp
- Spring Boot|监控-Actuator
Spring Boot 为我们提供了一个生产级特性-Actuator,包含很多实际有用的API,下面我们就一起来看看这些API. 一.Actuator 首先在程序中引入Actuator <!-- ...
- Python将多张图片进行合并拼接
import PIL.Image as Image import os IMAGES_PATH = r'D:\pics22223\\' # 图片集地址 IMAGES_FORMAT = ['.jpg', ...
- PHP的ini_set函数用法
PHP ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效.无需打开php.ini文件,就能修改配置,对于虚拟空间来说,很方便. 函数格式:string in ...
- MFC调用CEF实现单页面单COOKIE管理《转》
cookie简单介绍 cookie存储了网站的一些很重要的信息,如用户身份信息.常用设置.设置地理位置等等各种信息.使用cef访问网站时,如果设置了CefSettings.cache_path参数,则 ...
- Linux 限制IP——/etc/hosts.allow和/etc/hosts.deny文件【转】
就像是 限制特定IP来访 想法 看起来通常的做法是利用hosts的拒绝设置,而它的设置是针对某一个具体的进程,具体的服务,在这里就是sshd了 看起来设置一个网段使用的是 x.x.x.0/24 后面加 ...
- 【MySQL】Mac通过brew安装的MySQL重启方法
问题 在 Mac 上通过 brew install mysql 安装的的MySQL使用基本MySQL命令重启会失败: mysql.server stop mysql.server start mysq ...
- Java基础 return 退出main方法的示例
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- Java中字符串操作的基本方法总结:
1.字母大小写转换: package com.imooc; public class SortDemo { public static void main(String[] args) { char ...
- linux无网络情况下安装rpm包
首先理清楚两个东西:rpm和yum.rpm全称redhat package manager,用来管理软件包:yum全称yellow dog updater,modified,它是rpm的前端程序,因为 ...