Spring源码解读3——Bean资源的注册
2016-07-03 00:00
519 查看
上一节中注册的入口:
实现:
DefaultListableBeanFactory中使用一个HashMap的集合对象存放IoC容器中注册解析的BeanDefinition
编程式调用:
ClassPathResource res = new ClassPathResource("applicationContext.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
BeanDefinition bd =factory.getBeanDefinition("userBean");
PropertyValue pv =bd.getPropertyValues().getPropertyValue("id");
TypedStringValue valueHolder = (TypedStringValue) pv.getValue();
System.out.println(valueHolder.getValue());
[code=language-java]public class DefaultBeanDefinitionDocumentReader{ protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { //对于既不是<Import>元素,又不是<Alias>元素的元素,即Spring配置文件中普通的<Bean>元素 //的解析由BeanDefinitionParserDelegate类的parseBeanDefinitionElement方法来实现。 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); if (bdHolder != null) { bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder); try { //向Spring IoC容器注册解析得到的Bean定义,这是Bean定义向IoC容器注册的入口 //registry就是new Reader时传入的factory BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry()); } } } }
实现:
[code=language-java]public class BeanDefinitionReaderUtils{ public static void registerBeanDefinition( BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException { String beanName = definitionHolder.getBeanName(); //向IoC容器注册BeanDefinition registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); //如果解析的BeanDefinition有别名,向容器为其注册别名 String[] aliases = definitionHolder.getAliases(); if (aliases != null) { for (String aliase : aliases) { registry.registerAlias(beanName, aliase); } } } }
DefaultListableBeanFactory中使用一个HashMap的集合对象存放IoC容器中注册解析的BeanDefinition
[code=language-java]public class DefaultListableBeanFactory{ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(); 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 { ((AbstractBeanDefinition) beanDefinition).validate(); } catch (BeanDefinitionValidationException ex) { throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, "Validation of bean definition failed", ex); } } //注册的过程需要同步,保证数据的一致性 synchronized (this.beanDefinitionMap) { Object oldBeanDefinition = this.beanDefinitionMap.get(beanName); //检查是否有同名的BeanDefinition已经在IoC容器中注册,如果已经注册, //并且不允许覆盖已注册的Bean,则抛出注册失败异常 if (oldBeanDefinition != null) { if (!this.allowBeanDefinitionOverriding) { throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName + "': There is already [" + oldBeanDefinition + "] bound."); } else {//如果允许覆盖,则同名的Bean,后注册的覆盖先注册的 if (this.logger.isInfoEnabled()) { this.logger.info("Overriding bean definition for bean '" + beanName + "': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]"); } } } //IoC容器中没有已经注册同名的Bean,按正常注册流程注册 else { this.beanDefinitionNames.add(beanName); this.frozenBeanDefinitionNames = null; } this.beanDefinitionMap.put(beanName, beanDefinition); //重置所有已经注册过的BeanDefinition的缓存 resetBeanDefinition(beanName); } } }
编程式调用:
ClassPathResource res = new ClassPathResource("applicationContext.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
BeanDefinition bd =factory.getBeanDefinition("userBean");
PropertyValue pv =bd.getPropertyValues().getPropertyValue("id");
TypedStringValue valueHolder = (TypedStringValue) pv.getValue();
System.out.println(valueHolder.getValue());
相关文章推荐
- Maven Drools6.4.0.Final和Spring 整合
- 关于java中原始数据类型与自定义数据类型个人见解
- POJO和javabean的异同
- Java中Collection和Collections的区别
- 【Java基础】对象拷贝
- java程序与java WEB的区别
- spring容器与管理bean的生命周期
- springMVC_后台自动接受map数据
- JAVA中使用POST和GET发送请求
- 设计模式六大原则
- springmvc中的处理模型数据
- MyBatis基于Java API配置
- spring注解方式配置AOP
- java抽象工厂模式(Abstract Factory)-创建型
- java串口通信API说明
- Spring4.* 中整合 Hibernate
- 统计一个字符串中单个字符出现的次数
- 编程珠玑第五章二分搜索(折半查找)之java实现
- java中PreparedStatement接口及ResultSet结果集
- Spring MVC @ModelAttribute详解