spring容器默认情况下,当服务启动时,解析配置文件,实例化文件中的所有类。

我们直接使用spring时,获取spring注入的bean是这样的,

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

MyService myService1 = (MyService) ctx.getBean("myService");

那下面我们模拟spring管理bean这个的过程,代码如下

1.         第一步,创建Javaproject,引入spring.jar

2.         创建spring.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/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

</beans>

3.         创建接口MyService,只需要一个测试方法save

4.         创建实现类MyServiceImpl,控制台输出一句话

5.         创建一个自己的解析类MyClassPathXmlApplicationContext

主要是构造方法中的两步

     // 装载实例化bean

        private Map<String, Object> beanMap = new HashMap<String, Object>();

        // 装载配置文件的属性和值

        private List<MyBeans> beanlist = new ArrayList<MyBeans>();

        public MyClassPathXmlApplicationContext(String filename) {

               //第一步,解析spring配置文件

               readXml(filename);

               //第二步,通过反射,实例化所有注入bean

               initBeans();

        }

        /**

         * 通过反射机制,初始化配置文件中的bean

         */

        private void initBeans() {

               for (MyBeans bean : beanlist) {

                      try {

                             if (bean.getClassName() != null && !"".equals(bean.getClassName())) {

                                    beanMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());

                             }

                      } catch (Exception e) {

                             e.printStackTrace();

                      }

               }

        }

        /**

         * 解析配置文件,把解析后的bean设置到实体中,并保持到list

         *

         * @param filename

         */

        private void readXml(String filename) {

               SAXReader reader = new SAXReader();

               Document doc = null;

               URL xmlpath = this.getClass().getClassLoader().getResource(filename);

               try {

                      Map<String, String> nsMap = new HashMap<String, String>();

                      nsMap.put("ns", "http://www.springframework.org/schema/beans");

                      doc = reader.read(xmlpath);

                      XPath xpath = doc.createXPath("//ns:beans//ns:bean");// 创建//ns:beans//ns:bean查询路径

                      xpath.setNamespaceURIs(nsMap);// 设置命名空间

                      List<Element> eles = xpath.selectNodes(doc);// 取得文档下所有节点

                      for (Element element : eles) {

                             String id = element.attributeValue("id");

                             String cn = element.attributeValue("class");

                             //自定义实体bean,保存配置文件中id和class

                             MyBeans beans = new MyBeans(id, cn);

                             beanlist.add(beans);

                      }

               } catch (Exception e) {

                      e.printStackTrace();

               }

        }

        public Object getBean(String beanId) {

               return beanMap.get(beanId);

        }

 6.         实体类

 package com.mooing.service;

 public class MyBeans {

        private String id;

        private String className;

        public MyBeans(String id, String className) {

               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;

        }

 }

7.         测试

       MyClassPathXmlApplicationContext ctx = new MyClassPathXmlApplicationContext("spring.xml");

               MyService myService = (MyService) ctx.getBean("myService");

                myService.save();

总结:

自定义代码同样可以得到使用spring容器实例化的效果,也就是说,实际spring实例化管理bean时,也是经过两大步:第一,服务启动解析配置文件,并保存配置文件中的元素;第二,实例化所有元素,并提供获取实例方法。

最新文章

  1. idea 如何隐藏/展示不想看到的文件
  2. 温故而知新 css + html 超级牛逼的居中策略
  3. Redis 主从配置和参数详解
  4. Linux使用lvresize扩展或缩减lv大小
  5. Android -- 使用图库文件并可以裁剪文件(ImageView)
  6. 【Splay】bzoj3223-Tyvj1729文艺平衡树
  7. 后台管理UI皮肤的选择
  8. 再探jQuery
  9. QQ右下角图标不见了
  10. UNIX网络编程-基本API介绍(二)
  11. Centos 5.x/6.x 配置163网易yum源
  12. Android-The specified child already has a parent. You must call removeView() on the child&#39;s parent first.
  13. 一个ajax实现表单上传文件的神器 formdata
  14. C#编程基础-&gt;XML系列导航
  15. 【一天一道LeetCode】#303.Range Sum Query - Immutable
  16. ORACLE里锁有以下几种模式,v$locked_object,locked_mode
  17. 用JDOM和DOM4J解析节点名节点值
  18. Cubase独占声卡问题
  19. Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)
  20. 从客户端(......)中检测到有潜在危险的 Request.Form 值

热门文章

  1. JavaScriptr -- 常用对象 String, date, prototype
  2. 分享知识-快乐自己:遍历Map集合
  3. POJ 1270 Following Orders(拓扑排序)
  4. Raft 为什么是更易理解的分布式一致性算法——(1)Leader在时,由Leader向Follower同步日志 (2)Leader挂掉了,选一个新Leader,Leader选举算法。
  5. codeforces 29D Ant on the Tree (dfs,tree,最近公共祖先)
  6. 幻想乡三连B:连在一起的幻想乡
  7. poj2420 A Star not a Tree? 模拟退火
  8. tarjan求割点
  9. Send Code to evernote by my specify notebook
  10. VIJOS:P1706(舞会)