【Sping管理bean的原理】

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

主要是构造方法中的两步

  1     // 装载实例化bean
  2
  3        private Map<String, Object> beanMap = new HashMap<String, Object>();
  4
  5        // 装载配置文件的属性和值
  6
  7        private List<MyBeans> beanlist = new ArrayList<MyBeans>();
  8
  9
 10
 11        public MyClassPathXmlApplicationContext(String filename) {
 12
 13               //第一步,解析spring配置文件
 14
 15               readXml(filename);
 16
 17               //第二步,通过反射,实例化所有注入bean
 18
 19               initBeans();
 20
 21        }
 22
 23
 24
 25        /**
 26
 27         * 通过反射机制,初始化配置文件中的bean
 28
 29         */
 30
 31        private void initBeans() {
 32
 33               for (MyBeans bean : beanlist) {
 34
 35                      try {
 36
 37                             if (bean.getClassName() != null && !"".equals(bean.getClassName())) {
 38
 39                                    beanMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());
 40
 41                             }
 42
 43                      } catch (Exception e) {
 44
 45                             e.printStackTrace();
 46
 47                      }
 48
 49               }
 50
 51        }
 52
 53
 54
 55        /**
 56
 57         * 解析配置文件,把解析后的bean设置到实体中,并保持到list
 58
 59         *
 60
 61         * @param filename
 62
 63         */
 64
 65        private void readXml(String filename) {
 66
 67               SAXReader reader = new SAXReader();
 68
 69
 70
 71               Document doc = null;
 72
 73               URL xmlpath = this.getClass().getClassLoader().getResource(filename);
 74
 75               try {
 76
 77                      Map<String, String> nsMap = new HashMap<String, String>();
 78
 79                      nsMap.put("ns", "http://www.springframework.org/schema/beans");
 80
 81                      doc = reader.read(xmlpath);
 82
 83                      XPath xpath = doc.createXPath("//ns:beans//ns:bean");// 创建//ns:beans//ns:bean查询路径
 84
 85                      xpath.setNamespaceURIs(nsMap);// 设置命名空间
 86
 87                      List<Element> eles = xpath.selectNodes(doc);// 取得文档下所有节点
 88
 89                      for (Element element : eles) {
 90
 91                             String id = element.attributeValue("id");
 92
 93                             String cn = element.attributeValue("class");
 94
 95                             //自定义实体bean,保存配置文件中id和class
 96
 97                             MyBeans beans = new MyBeans(id, cn);
 98
 99                             beanlist.add(beans);
100
101                      }
102
103               } catch (Exception e) {
104
105                      e.printStackTrace();
106
107               }
108
109
110
111        }
112
113
114
115        public Object getBean(String beanId) {
116
117               return beanMap.get(beanId);
118
119        }
120
121
122
123 6.         实体类
124
125
126
127 package com.mooing.service;
128
129
130
131 public class MyBeans {
132
133        private String id;
134
135        private String className;
136
137
138
139        public MyBeans(String id, String className) {
140
141               this.id = id;
142
143               this.className = className;
144
145        }
146
147
148
149        public String getId() {
150
151               return id;
152
153        }
154
155
156
157        public void setId(String id) {
158
159               this.id = id;
160
161        }
162
163
164
165        public String getClassName() {
166
167               return className;
168
169        }
170
171
172
173        public void setClassName(String className) {
174
175               this.className = className;
176
177        }
178
179 }

7.         测试

1       MyClassPathXmlApplicationContext ctx = new MyClassPathXmlApplicationContext("spring.xml");
2
3               MyService myService = (MyService) ctx.getBean("myService");
4
5                myService.save();
6
7  

总结:

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

时间: 2024-11-06 04:05:30

【Sping管理bean的原理】的相关文章

编码剖析Spring管理Bean的原理

在Spring的第一个案例中,我们已经知道了怎么将bean交给Spring容器进行管理,并且明白了怎么从Spring容器中获取bean.那我们就有一个疑问了:Spring是如何创建并管理bean的呢?现在我们就来编码剖析Spring管理Bean的原理. 本文是在Spring的第一个案例的基础上展开的. 我们要使用dom4j读取Sping的配置文件--beans.xml <?xml version="1.0" encoding="UTF-8"?> <

深入探索spring技术内幕(二): 剖析spring管理Bean的原理与配置

求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度. 例如输入 a / \ b c / \ / \ d e f g 返回3. 详细描述: 接口说明 原型: int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) 输入参数: head 需要获取深度的二叉树头结点 输出参数(指针指向的内存区域保证有效): pulWidth 宽度 pulHeight 高度 返回值: 0 成功 1 失败

Spring学习笔记——Sprin管理Bean的原理

当我们使用Spring时候在Xml文件中通过 <bean id="service" class="com.finance.service.AmountServiceImpl" /> 配置就可以操作该Bean的属性和方法,那么Spring到底是如何实现的呢?下面让我们自己实现这个过程. 首先我模拟Spring的命名方式创建一个Bean管理类MyClassPathXMLApplicationContext.java,代码如下: // 自定义容器 public

Spring中管理Bean以及解析XML

Spring是分层的轻量级框架 以IoC(Inverse of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程)为核心 应用Spring的好处: 方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦截.运行监控等功能 声明式事务的支持 只需要通过配置就可以完成对事务的管理,而无需手动编程 方便集成各种优秀框架

Spring是如何管理Bean

容器是什么?spring中是如何体现的?一直有疑惑,这两天看了一下Spring管理bean的Demo,对于Spring中的容器有了简单的认识. 我们知道,容器是一个空间的概念,一般理解为可盛放物体的地方.在Spring容器通常理解为BeanFactory或者ApplicationContext.我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象. 其中有BeanFactory与ApplicationContext两种方式可以创建对象. 那么

Spring4.0学习笔记(5) —— 管理bean的生命周期

Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法创建Bean的实例 2.为Bean的属性设置值和对其他Bean的引用 3.调用Bean的初始化方法 4.Bean可以使用了 5.当容器关闭时,调用Bean的销毁方法 bean文件 package com.spring.cycle; public class Car { public Car(){ S

linux系统-用户管理-概念及原理

linux系统-用户管理-概念及原理 一 相关概念 1 /etc/passwd 的文件格式:用户名:密码位:用户标识号:组标识号:注释等相关描述:宿主目录:默认的shell,列如 chengzhi:x:500:500:chengzhi-CentOS:/home/chengzhi:/bin/shell 2 /etc/shadow 的文件格式:用户名:md5加密的密码(md5是单向不可逆的算法,固定长度):最后一次修改的时间:最大时间间隔:最小时间间隔:警告时间:闲置时间:失效文件:标志,前面两项比

linux 文件系统的管理 (硬盘) 工作原理

一.系统在初始化时如何识别硬盘 1.系统初始时根据MBR的信息来识别硬盘,其中包括了一些执行文件就来载入系统,这些执行文件就是MBR里前面446bytes里的boot loader 程式,而后面的16X4的空间就是存储分区表信息的位置:如下图 2.在分区表中,主要储存了以下信息:(1)分区号,常见的分区号有以下几种:其它编号可以使用fdisk指令,再执行 l (小写L) 查看 0x5 (or 0xf) 扩展分区 0x82 Linux swap 0x83 Linux 0x8e Linux LVM

采用Spring管理Bean和依赖注入

1.实例化spring容器 和 从容器获取Bean目标 实例化Spring容器常用的两种办法: 办法一: 在类途径下寻觅配置文件来实例化容器 [引荐运用] ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"}); 办法二: 在文件体系途径下寻觅配置文件来实例化容器 [这种办法能够在开发期间运用] ApplicationContext ctx = new FileSyst