简单实现spring里的BeanFactory实现原理
来源:互联网 发布:php quot 转成符号 编辑:程序博客网 时间:2024/06/05 09:42
首先我们先创建一个BeanFactory借口:
/*** Project Name:springAnalog* File Name:BeanFactory.java* Package Name:com.iflytek.beanfactory* Date:2015-11-20下午09:40:50* Copyright (c) 2015, syzhao@iflytek.com All Rights Reserved.**/package com.iflytek.beanfactory;public interface BeanFactory{ /** * getBean:(定义一个获取bean的方法). <br/> * @author syzhao * @param id * @return * @since JDK 1.6 */ public Object getBean(String id);}
我们继续在创建一个实现BeanFactory类 ClassPathXmlApplicationContext这是最重要的:
/*** Project Name:springAnalog* File Name:ClassPathXmlApplicationContext.java* Package Name:com.iflytek.beanfactory* Date:2015-11-20下午09:43:20* Copyright (c) 2015, syzhao@iflytek.com All Rights Reserved.**/package com.iflytek.beanfactory;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class ClassPathXmlApplicationContext implements BeanFactory{ //定义一个filePath变量 private String filePath; //首先定义Map 目的来存放生产的对象 Map<String, Object> map = new HashMap<String, Object>(); public ClassPathXmlApplicationContext(String filePath) { //获取配置文件路径 this.filePath = filePath; //初始化 try { this.readFile(); } catch (Exception e) { e.printStackTrace(); } } /** * readFile:(读取文件). <br/> * @author syzhao * @throws DocumentException * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException * @since JDK 1.6 */ private void readFile() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException { //接下来,用dom4j来解析,,,dom4j下载地址:http://sourceforge.net/projects/dom4j SAXReader reader = new SAXReader(); //获取根节点 Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(filePath)); //获取bean所有的元素 List<Element> list = document.selectNodes("/beans/bean"); for (int i = 0; i < list.size(); i++) { //获取bean的id String id = list.get(i).attributeValue("id"); //获取bean的class也就是类的路径 String classpath = list.get(i).attributeValue("class"); //利用反射获取对象 有三种方式,,,我们通过类的全名+包名来生成 Object object = Class.forName(classpath).newInstance(); //放到我们定义的map里 key =id ,vlaue =获取的对象,为下面getBean()取对象提供条件 map.put(id, object); } } @Override public Object getBean(String id) { //这里根据id来获取对于的对象既可 return map.get(id); } }
接下来我们定义一个person借口
/*** Project Name:springAnalog* File Name:Person.java* Package Name:com.iflytek.person* Date:2015-11-20下午10:39:27* Copyright (c) 2015, syzhao@iflytek.com All Rights Reserved.**/package com.iflytek.person;public interface Person{ public void work();}
我们用student和teacher实现person借口:
Student类:
/*** Project Name:springAnalog* File Name:Student.java* Package Name:com.iflytek.person* Date:2015-11-20下午10:40:42* Copyright (c) 2015, syzhao@iflytek.com All Rights Reserved.**/package com.iflytek.person;public class Student implements Person{ @Override public void work() { //输出一句话 System.out.println("学生的工作是:认真学习!"); } }
Teacher类:
/*** Project Name:springAnalog* File Name:Teacher.java* Package Name:com.iflytek.person* Date:2015-11-20下午10:41:42* Copyright (c) 2015, syzhao@iflytek.com All Rights Reserved.**/package com.iflytek.person;public class Teacher implements Person{ @Override public void work() { //输出一句话 System.out.println("老师的工作是:认真教书!!"); } }
接下来我们创建一个xml:applicationContext.xm
<?xml version="1.0" encoding="UTF-8"?><beans> <bean id="student" class="com.iflytek.person.Student"/> <bean id="teacher" class="com.iflytek.person.Teacher"/></beans>
好了,我们进行测试:
创建test类:
/*** Project Name:springAnalog* File Name:Test.java* Package Name:com.iflytek* Date:2015-11-20下午10:45:20* Copyright (c) 2015, syzhao@iflytek.com All Rights Reserved.**/package com.iflytek;import com.iflytek.beanfactory.BeanFactory;import com.iflytek.beanfactory.ClassPathXmlApplicationContext;import com.iflytek.person.Person;public class Test{ /** * main:(这里用一句话描述这个方法的作用). <br/> * @author syzhao * @param args * @since JDK 1.6 */ public static void main(String[] args) { BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person)beanFactory.getBean("student"); person.work(); person = (Person)beanFactory.getBean("teacher"); person.work(); } }
当你运行时报了 java.lang.ClassNotFoundException: org.jaxen.JaxenException这个异常,不用怕,,
因为你少了,dom4j的另一个jar包:jaxen-1.1-beta-6.jar 这个在dom4j-1.6.1\lib下把jaxen-1.1-beta-6.jar引入既可以了,,
好了在运行一次:
结果完美呈现:
以上就是模拟了一下,,,其实spring内部远比这个复杂,需要大家努力去研究,,,,
1 0
- 简单实现spring里的BeanFactory实现原理
- 简单实现Spring中BeanFactory原理
- 简单实现Spring中BeanFactory原理
- Spring的BeanFactory实现类
- 一个Spring的beanFactory的简单实现示例(传智播客)
- Spring IOC/BeanFactory/ApplicationContext的工作流程/实现原理/初始化/依赖注入源码详解
- spring的BeanFactory原理模拟
- spring的BeanFactory原理模拟
- Spring Cache的原理和简单实现
- 自己简单实现Spring的IOC原理
- 大四狗闲的没事,设计实现SPRING 的BEANFACTORY
- Spring-IOC简单原理 + 实现
- Spring源码分析IOC实现一BeanFactory
- Spring的简单使用BeanFactory和ApplicationContext
- spring cloud 实现原理简单总结
- 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现
- Spring MVC的实现原理
- Spring MVC的实现原理
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 1031 - Easy Game (记忆化搜索)
- 基于linux系统下的SVN服务安装
- Servlet的url-pattern匹配规则
- 《c语言从入门到精通》看书笔记——第12章 位运算
- 简单实现spring里的BeanFactory实现原理
- 逐帧动画
- 【Leetcode】Maximum Depth of Binary Tree
- <LeetCode><Medium>2 Add Two Numbers
- 仿美团加载动画效果
- 用例子理解hibernate的一级缓存
- 通过AVFoundation获取摄像头数据[Swift]
- [Django架构流程分析]请求处理机制其二:Django中间件的解析
- 排序算法学习总结