现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理。

<?xml version="1.0" encoding="UTF-8"?>
<beans>
   <bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
       <property name="userDao" ref="userDao"></property>
   </bean>
   <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
</beans>

1 定义bean相关的pojo类

1.1 PropertyValue类

用于封装bean的属性,体现到上面的配置文件就是封装bean标签的子标签property标签数据。

/**
* @version v1.0
* @ClassName: PropertyValue
* @Description: 用来封装bean标签下的property标签的属性
*             name属性
*             ref属性
*             value属性 : 给基本数据类型及String类型数据赋的值
*/
public class PropertyValue {

 private String name;
 private String ref;
 private String value;

 public PropertyValue() {
}

 public PropertyValue(String name, String ref,String value) {
   this.name = name;
   this.ref = ref;
   this.value = value;
}

 public String getName() {
   return name;
}

 public void setName(String name) {
   this.name = name;
}

 public String getRef() {
   return ref;
}

 public void setRef(String ref) {
   this.ref = ref;
}

 public String getValue() {
   return value;
}

 public void setValue(String value) {
   this.value = value;
}
}

1.2 MutablePropertyValues类

一个bean标签可以有多个property子标签,所以再定义一个MutablePropertyValues类,用来存储并管理多个PropertyValue对象。

/**
* @version v1.0
* @ClassName: MutablePropertyValues
* @Description: 用户存储和管理多个PropertyValue对象
*/
public class MutablePropertyValues implements Iterable<PropertyValue> {

   //定义list集合对象,用来存储PropertyValue对象
   private final List<PropertyValue> propertyValueList;

   public MutablePropertyValues() {
       this.propertyValueList = new ArrayList<PropertyValue>();
  }

   public MutablePropertyValues(List<PropertyValue> propertyValueList) {
       this.propertyValueList = (propertyValueList != null ? propertyValueList : new ArrayList<PropertyValue>());
  }

   //获取所有的PropertyValue对象,返回以数组的形式
   public PropertyValue[] getPropertyValues() {
       //将集合转换为数组并返回
       return this.propertyValueList.toArray(new PropertyValue[0]);
  }

   //根据name属性值获取PropertyValue对象
   public PropertyValue getPropertyValue(String propertyName) {
       //遍历集合对象
       for (PropertyValue pv : this.propertyValueList) {
           if (pv.getName().equals(propertyName)) {
               return pv;
          }
      }
       return null;
  }

   //获取迭代器对象
   @Override
   public Iterator<PropertyValue> iterator() {
       return propertyValueList.iterator();
  }

   //判断集合是否为空
   public boolean isEmpty() {
       return this.propertyValueList.isEmpty();
  }

   //添加PropertyValue对象
   public MutablePropertyValues addPropertyValue(PropertyValue pv) {
       //判断集合中存储的PropertyValue对象是否和传递进行的重复了,如果重复了,进行覆盖
       for (int i = 0; i < this.propertyValueList.size(); i++) {
           //获取集合中每一个PropertyValue对象
           PropertyValue currentPv = this.propertyValueList.get(i);
           if (currentPv.getName().equals(pv.getName())) {
               this.propertyValueList.set(i, new PropertyValue(pv.getName(),pv.getRef(), pv.getValue()));
               return this;//目的就是实现链式编程
          }
      }
       this.propertyValueList.add(pv);
       return this;//目的就是实现链式编程
  }

   //判断是否有指定name属性值的对象
   public boolean contains(String propertyName) {
       return getPropertyValue(propertyName) != null;
  }
}

1.3 BeanDefinition类

BeanDefinition类用来封装bean信息的,主要包含id(即bean对象的名称)、class(需要交由spring管理的类的全类名)及子标签property数据。

/**
* @version v1.0
* @ClassName: BeanDefinition
* @Description: 用来封装bean标签数据
*     id属性
*     class属性
*     property子标签的数据
*/
public class BeanDefinition {
   private String id;
   private String className;

   private MutablePropertyValues propertyValues;

   public BeanDefinition() {
       propertyValues = new MutablePropertyValues();
  }

   public String getId() {
       return id;
  }

   public void setId(String id) {
       this.id = id;
  }

   public String getClassName() {
       return className;
  }

   public void setClassName(String className) {
       this.className = className;
  }

   public void setPropertyValues(MutablePropertyValues propertyValues) {
       this.propertyValues = propertyValues;
  }

   public MutablePropertyValues getPropertyValues() {
       return propertyValues;
  }
}

2 定义注册表相关类

2.1 BeanDefinitionRegistry接口

BeanDefinitionRegistry接口定义了注册表的相关操作,定义如下功能:

  • 注册BeanDefinition对象到注册表中

  • 从注册表中删除指定名称的BeanDefinition对象

  • 根据名称从注册表中获取BeanDefinition对象

  • 判断注册表中是否包含指定名称的BeanDefinition对象

  • 获取注册表中BeanDefinition对象的个数

  • 获取注册表中所有的BeanDefinition的名称

/**
* @version v1.0
* @ClassName: BeanDefinitionRegistry
* @Description: 注册表对象
*/
public interface BeanDefinitionRegistry {

   //注册BeanDefinition对象到注册表中
   void registerBeanDefinition(String beanName, BeanDefinition beanDefinition);

   //从注册表中删除指定名称的BeanDefinition对象
   void removeBeanDefinition(String beanName) throws Exception;

   //根据名称从注册表中获取BeanDefinition对象
   BeanDefinition getBeanDefinition(String beanName) throws Exception;

   boolean containsBeanDefinition(String beanName);

   int getBeanDefinitionCount();

   String[] getBeanDefinitionNames();
}

2.2 SimpleBeanDefinitionRegistry类

该类实现了BeanDefinitionRegistry接口,定义了Map集合作为注册表容器。

/**
* @version v1.0
* @ClassName: SimpleBeanDefinitionRegistry
* @Description: 注册表接口的子实现类
*/
public class SimpleBeanDefinitionRegistry implements BeanDefinitionRegistry {

   //定义一个容器,用来存储BeanDefinition对象
   private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<String, BeanDefinition>();

   @Override
   public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
       beanDefinitionMap.put(beanName,beanDefinition);
  }

   @Override
   public void removeBeanDefinition(String beanName) throws Exception {
       beanDefinitionMap.remove(beanName);
  }

   @Override
   public BeanDefinition getBeanDefinition(String beanName) throws Exception {
       return beanDefinitionMap.get(beanName);
  }

   @Override
   public boolean containsBeanDefinition(String beanName) {
       return beanDefinitionMap.containsKey(beanName);
  }

   @Override
   public int getBeanDefinitionCount() {
       return beanDefinitionMap.size();
  }

   @Override
   public String[] getBeanDefinitionNames() {
       return beanDefinitionMap.keySet().toArray(new String[1]);
  }
}

设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相关类的更多相关文章

  1. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  2. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

  3. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

  4. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

  5. Spring框架中的单例bean是线程安全的吗?

    不,Spring框架中的单例bean不是线程安全的.

  6. Spring 框架中的单例 bean 是线程安全的吗?

    不,Spring 框架中的单例 bean 不是线程安全的.

  7. 《经久不衰的Spring框架:Spring+SpringMVC+MyBatis 整合》

    前言 主角即Spring.SpringMVC.MyBatis,即所谓的SSM框架,大家应该也都有所了解,概念性的东西就不写了,有万能的百度.之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目 ...

  8. Spring MVC -- Spring框架入门(IoC和DI)

    Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...

  9. 什么是Spring框架? Spring框架有哪些主要的模块?

    Spring框架是一个为java应用程序的开发提供了综合,广泛的基础性支持的java平台.Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发.Spring框架本身亦是 ...

  10. 什么是spring框架?spring特点与好处,使用spring框架的好处是什么?

    转载:https://blog.csdn.net/hht006158/article/details/80181207. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Ja ...

随机推荐

  1. kali 下安装tplmap

    kali 下安装tplmap 1. 安装kali下的python2的pip工具 kali2020版及以上, 输入python2命令会执行python2, python3也存在. 但pip默认是pip3 ...

  2. What is the Best Python IDE for Data Science?

    Created by Guido van Rossum, Python was first released back in 1991. The interpreted high-level prog ...

  3. microbit问题记录

    问题: 1.电子罗盘东南西北:不太好用 2.    micropython代码:震动.声音显示不对 makecode代码:声音不好用 已解决: 1.摇杆下和左不管用了(已解决:改软件包代码) 2.ma ...

  4. js过滤filter 按条件过滤

    const dataList = this.formData.tableData.filter(item => item.name !== '');

  5. 2003031120—廖威—Python数据分析第三周作业—numpy的简单操

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/pexy/20sj 这个作业要求链接 https://edu.cnblogs.com/campus/pexy ...

  6. 构建 Maven 项目卡爆?优化后:1 秒完成…

    在实际开发中,我们通常会用到maven的archetype插件(原型框架)来生成项目框架. 但是无奈,创建时,总会卡在: [INFO] Generating project in Batch mode ...

  7. down_interruptible()获取信号量

    信号量(Semaphore)是操作系统中最典型的用于同步和互斥的手段,信号量的值可以是0.1或者n.信号量与操作系统中的经典概念PV操作对应. P(S):①将信号量S的值减1,即S=S-1:②如果S≥ ...

  8.  NuGet国内镜像

    NuGet国内镜像 https://nuget.cdn.azure.cn/v3/index.json

  9. Chrome浏览器:Your Connection is not private 您的连接不是私密连接

    在图片图片所示的任何地方输入: thisisunsafe 没错就是这么6,然后就可以访问了.输错了请刷新再来(微笑) https://blog.csdn.net/filbert_917/article ...

  10. CBV源码分析及模板语法之传值 过滤器 标签 继承 导入

    CBV的源码分析 # CBV的源码入口从哪里看呢? CBV的核心源码: return self.dispatch(request, *args, **kwargs) def dispatch(self ...