二、注册的具体过程
1、职责类
- 由DefaultListableBeanFactory来完成,该接口实现了ListableBeanFactory和BeanDefinitionRegistry接口;
2、源码解读
前一节中谈到,生成BeanDefinition后,由
BeanDefinitionReaderUtils.registerBeanDefinition()来完成向容器中注册Bean定义信息,该方法即
调用了下面的registerBeanDefinition()方法;下面是DefaultListableBeanFactory实现
BeanDefinitionRegistry接口的部分:
//---------------------------------------------------------------------
// Implementation of BeanDefinitionRegistry interface
//---------------------------------------------------------------------
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");
// 普通的bean,在生成BeanDefinition时,都是GenericBeanDefinition的实例,它是AbstractBeanDefinition的子类
if (beanDefinition instanceof AbstractBeanDefinition) {
try {
((AbstractBeanDefinition) beanDefinition).validate();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Validation of bean definition failed", ex);
}
}
// 开始注册到容器,注意了
synchronized (this.beanDefinitionMap) {
// 先看一下存放BeanDefinition的map里是否已经包含了相同beanName的BeanDefinition
Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);
if (oldBeanDefinition != null) {
// 如果已经存在,则需要根据容器的属性(beanDefinition是否可以被覆盖,默认为true)来做不同的处理
if (!this.allowBeanDefinitionOverriding) {
// 如果不允许覆盖,抛错
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
"': There is already [" + oldBeanDefinition + "] bound.");
}
else {
// 允许覆盖,继续后面的操作
if (this.logger.isInfoEnabled()) {
this.logger.info("Overriding bean definition for bean '" + beanName +
"': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]");
}
}
}
else {
// 如果map中没有该beanName,则将beanNames存放在list中
this.beanDefinitionNames.add(beanName);
this.frozenBeanDefinitionNames = null;
}
// 将beanName及beanDefinition放在map中,完成注册
this.beanDefinitionMap.put(beanName, beanDefinition);
resetBeanDefinition(beanName);
}
}
public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
Assert.hasText(beanName, "'beanName' must not be empty");
synchronized (this.beanDefinitionMap) {
// 从map中清除指定beanName的beanDefinition
BeanDefinition bd = (BeanDefinition) this.beanDefinitionMap.remove(beanName);
if (bd == null) {
if (this.logger.isTraceEnabled()) {
this.logger.trace("No bean named '" + beanName + "' found in " + this);
}
throw new NoSuchBeanDefinitionException(beanName);
}
this.beanDefinitionNames.remove(beanName);
this.frozenBeanDefinitionNames = null;
resetBeanDefinition(beanName);
}
}
3、小结
- 到现在为止,只是将XML里定义的bean定义信息生成GenericBeanDefinition实例,然后注册到容器中(所谓注册,也就是存放在一个map中,key为beanName,value为BeanDefinition实例);
- 其实,后面还有很多工作要做。。。。。。
分享到:
相关推荐
Ajax+SpringMVC+Spring+Mybatis+MySql+js用户注册实例,具体过程和效果看博文:http://blog.csdn.net/evankaka/article/details/47023975
使用的是阿里通讯短信 首先要去阿里通讯注册账号 具体过程参照阿里云通讯文档 该项目提供了开箱即用的功能 使用方法 在本地把项目下下来 git clone 下下来后执行mvn clean install 命令 在本地安装jar包 (可以把打...
12.6.4 编写注册控制器RegeditAction.java 12.6.5 编写登录控制器LoginAction.java 12.6.6 建立数据库表 12.6.7 生成映射文件User.hbm.xml 12.6.8 生成POJO 12.6.9 编写注册的业务逻辑接口Regedit.java 12.6.10 编写...
2.15 在Spring中注册属性编辑器 96 2.15.1 问题 96 2.15.2 解决方案 96 2.15.3 工作原理 97 2.16 创建自定义属性编辑器 99 2.16.1 问题 99 2.16.2 解决方案 100 2.16.3 工作原理 100 2.17 使用...
3) 利用Spring的@Service、@Repository两个Annotation来实现Service类、DAO类在Spring容器中的自动注册,利用@Autowired来实现Service与其他对象的引用。 通过框架提供的以上组件,除了基本的配置,如数据源、事务等...
12.6.4 编写注册控制器RegeditAction.java 12.6.5 编写登录控制器LoginAction.java 12.6.6 建立数据库表 12.6.7 生成映射文件User.hbm.xml 12.6.8 生成POJO 12.6.9 编写注册的业务逻辑接口Regedit.java 12.6.10 编写...
Spring IoC的控制反转实例:通过一个示例演示了使用Spring的IoC容器实现控制反转的过程。你将会看到如何配置Spring的IoC容器,定义和注册Bean,以及如何通过注解或XML配置文件来完成依赖注入。 简单工厂模式的实例...
(4)使用Spring.net实现Ioc; (5)Romoting; (6)利用Ioc在不动一行代码的情 况下实现Remoting。为了更好的理解文中的内容,最好顺序阅读。 作为一个应用系统,代码复用至关重要。如果在你的设计中,类与类存在...
2.15 在Spring中注册属性编辑器 96 2.15.1 问题 96 2.15.2 解决方案 96 2.15.3 工作原理 97 2.16 创建自定义属性编辑器 99 2.16.1 问题 99 2.16.2 解决方案 100 2.16.3 工作原理 100 2.17 使用...
12.6.4 编写注册控制器RegeditAction.java 12.6.5 编写登录控制器LoginAction.java 12.6.6 建立数据库表 12.6.7 生成映射文件User.hbm.xml 12.6.8 生成POJO 12.6.9 编写注册的业务逻辑接口Regedit.java 12.6.10 编写...
5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 ...
阅读建议:此资源以开发SpringCloud微服务架构的移动安保系统学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来实践,并调试对应的代码。
这是老外写的用JSF+Spring+Hibernate开发的简单应用实例 使用MySQL作为数据库,整合了JSF(MyFaces)、 Spring及Hibernate,以具体的用户登陆及注册业务来说明具体的使用过程
这是用SpringCloud的方式实现了两个服务,一个是客户端customer,另一个是服务端Controller。两个服务之间传递的方式是RestTemplate。具体过程可以去看我写的有关nacos服务注册与发现的博客。
5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章 Spring AOP基础 6.1 AOP概述 6.1.1 AOP到底是什么 6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 ...
前端界面由Vue构建,后端利用Spring Boot来简化Spring应用的配置和部署过程,从而提高开发效率。数据库方面,选择MySQL 1.前端用户功能(1)用户界面:系统提供用户注册功能,注册账户后可以登录系统,进行购买商品,...
SpringMVC数据验证——注册用户格式的验证实例,具体过程和效果看博文http://blog.csdn.net/evankaka/article/details/45789283
订单提交与支付:用户在选择完维修服务后,可以填写具体的维修需求和地址信息,提交订单。系统支持微信支付功能,用户可以在小程序上完成订单支付,确保交易的便捷和安全。 维修师傅匹配与预约:系统根据用户提交的...
12.6.4 编写注册控制器RegeditAction.java 12.6.5 编写登录控制器LoginAction.java 12.6.6 建立数据库表 12.6.7 生成映射文件User.hbm.xml 12.6.8 生成POJO 12.6.9 编写注册的业务逻辑接口Regedit.java 12.6.10 编写...
本系统可以根据实际应用的具体情况,适当加以修改,以便更好应用。本系统操作简单,灵活性好,系统安全性高,运行稳定。本文详细介绍了快递管理系统开发和设计的全过程。 系统包括 注册页面、登录页面、快递员界面...