当了解了spring容器的实例化之后,我们可以进行简单的进行模拟这个过程:

1.首先进行加载spring的xml配置文件

2.进行解析这个配置文件,将节点映射成一个类

3.进行对<bean进行实例化,并存在一个集合map中

4.然后在这个集合中根据id进行bean。

mybens.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!-- 使用类构造器实例化 -->      <bean id="refrectShili" class="cn.can.dao.impl.RefrectShili"></bean>
</beans>

节点对应的类,这里只简单的存储id和class类型,采用的是xml配置使用bean的类构造器进行实例化

package cn.can.myspring;//xml中节点的
//<bean id="refrectShili" class="cn.can.dao.impl.RefrectShili"></bean>对应的类
public class MyBean {private String id;private String className;public MyBean() {super();}public MyBean(String id, String className) {super();this.id = id;this.className = className;}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;}}

关键是下面的解析xml和实例化,用了xpath进行解析xml和反射机制进行实例化类。

package cn.can.myspring;import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import cn.can.myspring.exception.NoIdClassException;public class MyApplicationContext {// 因为bean是多个的private List<MyBean> myBeans = new ArrayList<MyBean>();  //存储实例化之后的引用private Map<String, Object> singles = new HashMap<String, Object>();// 这里可以传入一个xml,或者传入多个xmlpublic MyApplicationContext() {}public Object getBean(String id) throws NoIdClassException{if(singles.size() <= 0){throw new NoIdClassException("不存在这个类");}Object obj = singles.get(id);if(obj == null){throw new NoIdClassException("不存在这个类");}return obj;}public MyApplicationContext(String fileName) {init(fileName);// 获得xml的信息之后initObject();// 进行实例化<bean
    }// 2.进行实例化private void initObject() {try {if (myBeans != null && myBeans.size() > 0) {// 遍历bean // <xml中的<bean 节点,可以抽象成一个类for (MyBean bean : myBeans) {String id = bean.getId();String clazz = bean.getClassName();if (id != null && !"".equals(id)) {if (clazz != null && !"".equals(clazz)) {// 这个时候进行实例化Class cl = Class.forName(clazz);Object o = cl.newInstance();singles.put(id, o);}}}}} catch (Exception e) {}}public MyApplicationContext(String[] fileNames) {}// 1.进行加载xml,解析xml文件private void init(String fileName) {SAXReader saxReader = new SAXReader();Document document = null;try {URL xmlpath = this.getClass().getClassLoader().getResource(fileName);document = saxReader.read(xmlpath);Map<String, String> nsMap = new HashMap<String, String>();nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空间XPath xsub = document.createXPath("//ns:beans/ns:bean");// 创建beans/bean查询路径xsub.setNamespaceURIs(nsMap);// 设置命名空间List<Element> beans = xsub.selectNodes(document);// 获取文档下所有bean节点for (Element e : beans) {String id = e.attributeValue("id");// 获取id属性值String clazz = e.attributeValue("class"); // 获取class属性值MyBean myBean = new MyBean(id, clazz);// 得到一个<bean></bean>myBeans.add(myBean);// 将xml中的所有bean都进行解析
            }} catch (Exception e) {}}}

在这基础上可以进行继续扩展。考虑<bean中的所有子节点和属性如何解析和处理。

转载于:https://www.cnblogs.com/shinycan/p/3650962.html

spring管理bean容器(笔记)[继]相关推荐

  1. 2014-03-09 Spring的学习(1)------Spring管理Bean(实例化Bean)

    2019独角兽企业重金招聘Python工程师标准>>> 1.搭建与测试Spring的开发环境 PS: Spring-beans-2.5.xsd  (为使在Beans.xml操作顺畅) ...

  2. (转)编码剖析Spring管理Bean的原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52832434 在Spring的第一个案例中,我们已经知道了怎么将bean交给Spring容器进 ...

  3. Spring 管理Bean(获取Bean,初始化bean事件,自动匹配ByName······等)

    1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...

  4. 采用Spring管理Bean和依赖注入

    1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...

  5. spring学习之将类交给spring管理,bean的注入,scope,集合注入,自动装配,生命周期,迟加载

    一.将类交给spring管理(IOC) 1.将类交给spring容器管理 如何将一个类交给spring容器进行管理呢? 方法很简单,只需要在applicationContext.xml中加入对应的xm ...

  6. aop的实现原理_非Spring管理Bean如何添加AOP呢?

    前几天有个朋友问了一个问题,觉得可以给大家分享一下. 问题如下图 归其根本这是个历史项目,里面有很多的类并没有交给spring管理,但现在需要统一添加日志. 面对这样的问题,其实只要了解AOP的原理, ...

  7. Spring管理Bean的生命周期

    1.通过构造器或工厂方法创建对象 2.注入属性 3.后置处理器前置处理 4.调用初始化方法 5.后置处理器后置处理 6.使用Bean 7.销毁Bean

  8. spring管理bean

    转载于:https://www.cnblogs.com/daochong/p/5292050.html

  9. Spring学习笔记4,注解方式管理Bean

    Spring框架的Bean管理注解方式的快速入门 1. 步骤一:下载Spring框架的开发包 解压后的目录结构如下 * docs – API和开发规范 * libs – jar包和源码      Sp ...

  10. Spring框架学习笔记04:初探Spring——采用Java配置类管理Bean

    文章目录 一.课程引入 二.采用Java配置类管理Bean (一)打开项目[SpringDemo2021] (二)创建net.hw.spring.lesson04包 (三)创建杀龙任务类 (四)创建勇 ...

最新文章

  1. PouchContainer 发布 0.3.0 版本,支持 Kubernetes 拥抱 CNCF 生态
  2. 人形AI捉迷藏惊煞网友:飞檐走壁纯靠自学,表情丰富还会合作,姚班学霸吴翼参与...
  3. 聊聊事件驱动的架构模式
  4. 2014 I/O归来:Google连接一切
  5. android 手机内存其他文件夹里,手机储存里的其他是什么以及应该怎样删除
  6. 解决ncnn配置中缺少“vulkan”文件
  7. Polynomial(2019南昌邀请赛)(拉格朗日插值)
  8. java上传png_java上传png图片出现红色背景
  9. Shell脚本语法2
  10. php中的server数组各个值详解 有利于对请求进行识别处理!
  11. 达梦数据库查看某个表的字段类型、常用数据库驱动类名以及URL
  12. 游戏设计类毕业论文文献(推荐10篇)
  13. java的swing案例
  14. 华为隐藏功能扩大内存代码大全_华为手机隐藏功能代码大 | 手游网游页游攻略大全...
  15. 2020年度中职组“网络空间安全”赛项xx市竞赛任务书
  16. linux有线网设置方法,有线网络使用教程
  17. 深度哲学:王阳明心学精髓
  18. mysqldb mysql config_python 安装MySQLdb mysql_config not fount原因
  19. 年底到了,消费者纷纷抢购,特斯拉成为汽车市场的超级网红
  20. k8s跑一个nginx-app体验

热门文章

  1. kubernetes PVC介绍
  2. excel日期改成字符类型_EXCEL的一些基础知识
  3. dns代表计算机哪个术语,windows dns 术语解释
  4. 二十、对象的引用与传递
  5. 安装tensorflow出现的问题
  6. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_2.RabbitMQ研究-RabbitMQ介绍...
  7. 阶段3 1.Mybatis_10.JNDI扩展知识_3 补充-测试JNDI数据源的使用以及使用细节
  8. TMS320C64x+ DSP-----Cache 优化
  9. 学习使用Django一 安装虚拟环境
  10. user 不在 sudoers 文件中。此事将被报告。