Spring BeanDefinitionRegistry
来源:互联网 发布:37轩辕剑骑兵进阶数据 编辑:程序博客网 时间:2024/06/06 00:30
该类的作用是向注册表中注册BeanDefinition实例,完成注册过程。
// 关键 -> 往注册表中注册一个新的 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);}
该类是DefaultListableBeanFactory接口的基本实现类,但同时也实现了其他接口的功能,这里只探讨关于注册BeanDefinition实例的相关方法。
首先来看它的成员变量:
// 关键-> 注册表,由 BeanDefinition 的标识 (beanName) 与其实例组成private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, bean>(64);// 标识(beanName)集合private final List<String> beanDefinitionNames = new ArrayList<String>(64);
再来看BeanDefinitionReaderUtils的registerBeanDefinition方法。该方法的主要作用是调用注册器(DefaultListableBeanFactory)完成注册过程。
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { Assert.hasText(beanName, "Bean name must not be empty"); Assert.notNull(beanDefinition, "BeanDefinition must not be null"); if (beanDefinition instanceof AbstractBeanDefinition) { try { // BeanDefinition 校验 ((AbstractBeanDefinition) beanDefinition).validate(); }catch (BeanDefinitionValidationException ex) { // 抛出异常... } } BeanDefinition oldBeanDefinition; oldBeanDefinition = this.beanDefinitionMap.get(beanName); if (oldBeanDefinition != null) { if (!isAllowBeanDefinitionOverriding()) { // 抛出异常... }else if (oldBeanDefinition.getRole() < beanDefinition.getRole()) { // 日志输出... } else if (!beanDefinition.equals(oldBeanDefinition)) { // 日志输出... } else { // 日志输出... } }else { // 添加标识进 List this.beanDefinitionNames.add(beanName); this.manualSingletonNames.remove(beanName); this.frozenBeanDefinitionNames = null; } // 关键 -> 添加进 map this.beanDefinitionMap.put(beanName, beanDefinition); if (oldBeanDefinition != null || containsSingleton(beanName)) { resetBeanDefinition(beanName); }}
观察代码可以发现该方法最重要的步骤其实就是:
this.beanDefinitionMap.put(beanName, beanDefinition);
阅读全文
0 0
- Spring BeanDefinitionRegistry
- 09.Spring Bean 注册 - BeanDefinitionRegistry
- Spring框架之注册—BeanDefinitionRegistry接口
- Spring
- Spring
- spring
- spring
- spring
- spring
- Spring
- spring
- spring
- Spring
- Spring
- spring
- Spring
- Spring
- spring
- 路由trace
- 程序员都是技术宅?他们完全刷新了我们对程序员的认知
- storm 学习教程
- HTML 基础详解
- call undefined function openssl_cipher_iv_length
- Spring BeanDefinitionRegistry
- Java内存分配
- UIView显示图片高级技巧
- 最新的node.js入门到实战项目视频教程(目前已更新40讲)
- 双11享Go了吗?2017阿里双11在线峰会续写科技盛宴!
- 适合程序员充电的10本书
- 2017年11月反思
- mt6735 在Play Music中开放源码许可证界面长按选择字符,手机横屏,会弹出Play Music停止运行
- 天皇法则 Mikado Method