Spring bean 原理
来源:互联网 发布:上海交大网络学校 编辑:程序博客网 时间:2024/06/10 19:50
存放Java类的id和类地址
package javaBeanYuanLi;public class BeanDefintion { private String id; private String className; public BeanDefintion(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; }}
MyTestClassPathXMLapplicationContext类模仿了Spring 容器,仔细分析其中的代码,可以知道,在这个容器类中,我主要做了以下几个步骤:
1. 读取xml配置文件, 数据封装到BeanDefinition。
2. 将BeanDefinition对象存入list。 3. 遍历list, 通过反射产生对象并存入map。 4. 调用getBean方法返回一个bean对象, 此bean对象为单例。 读取xml配置文件时,我采用的是dom4j 的sax方法,并且通过xpath来匹配xml文档中的节点。因此我们需要在项目中引入两个jar包:dom4j-1.6.1.jar、jaxen-1.1-beta-6.jar。将这两个jar扔到项目的lib文件夹下即可。当我们解析完成xml文档,并且将xml文档中<bean>节点所配置的信息封装到BeanDefinition对象中时,接下来容器会通过这些封装的配置信息,通过反射技术,实例化bean对象,并存入一个Map集合。容器提供了一个getBean方法,在容器外部可以获取到实例化后的bean对象。 容器类已经模仿好了,那么接下来需要进行实例测试了。事先我定义了一个接口,并且编写实现类实现了这个接口,代码如下。
package javaBeanYuanLi;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;/** * * 容器:模拟Spring容器 * @author Administrator * * * */public class MyTestClassPathXMLApplicationContext { //存放BeanDefintion 对象的集合 private List<BeanDefintion> beanDefintions = new ArrayList<BeanDefintion>(); //存放实例化后的bean对象 private Map<String, Object> singletons = new HashMap<String, Object>(); /** * 容器构造方法:用于读取配置文件 * @param resource */ public MyTestClassPathXMLApplicationContext(String resourceName){ //读取配置文件,并将bean的配置信息放入集合中 this.readXML(resourceName); //实例化bean this.instanceBean(); } /** * 根据xml资源名称读取xml文件 * @param resourceName */ public void readXML(String resourceName){ //采用dom4j 的SAX方式读取xml配置文件 SAXReader saxReader = new SAXReader(); Document document = null; try { URL xmlPath = this.getClass().getClassLoader().getResource(resourceName);//获取资源路径 document = saxReader.read(xmlPath);//读取路径的文件,实例化xml文档对象 /** * 采用xpath 匹配查询xml文档节点 */ //增加XPath的命名空间 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); //匹配解析xml文档对象,返回beans.xml文件中bean配置信息节点 List<Element> beans = xsub.selectNodes(document); //遍历获取bean配置信息,实例化BeanDefintion对象 for(Element bean : beans){ String id = bean.attributeValue("id");//id属性值 String clazz = bean.attributeValue("class");//class属性值 //创建BeanDefintion 对象 BeanDefintion beanDefintion = new BeanDefintion(id,clazz); //bean配置对象方法集合中 beanDefintions.add(beanDefintion); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 通过 反射集合实例化bean */ private void instanceBean() { for(BeanDefintion beanDefintion : beanDefintions){ try { if(beanDefintion.getClassName() !=null && !"".equals(beanDefintion.getClassName().trim())){ singletons.put(beanDefintion.getId(), Class.forName(beanDefintion.getClassName()).newInstance()); } } catch (Exception e) { e.printStackTrace(); } } } /** * 根据id获取bean对象 * @param id * @return */ public Object getBean(String key){ return singletons.get(key); }}
public interface StudentService { public void save(); public void say();}package javaBeanYuanLi;public class StudentServiceImpl implements StudentService { public void save() { System.out.println("我是一个保存方法"); } public void say() { System.out.println("我是一个学生,我要抓住凹凸曼!!!"); }}
package javaBeanYuanLi;import org.junit.Test;import org.springframework.test.context.TestExecutionListeners;import com.opensymphony.xwork2.interceptor.annotations.After;import com.opensymphony.xwork2.interceptor.annotations.Before;/** * 测试类 * @author Administrator * */public class JunitTest { @Before public void star() { System.out.println("开始测试"); } @After public void end() { System.out.println("测试结束"); } @Test public void testMyIoc(){ /** * 模仿IOC */ try{ 把bean实例化都存起来,放到map中 MyTestClassPathXMLApplicationContext context = new MyTestClassPathXMLApplicationContext("beans.xml"); StudentService studentService = (StudentService)context.getBean("studentService"); }catch (Exception e) { // TODO: handle exception } }
阅读全文
0 0
- spring管理bean原理
- spring加载bean原理。
- spring 解析bean原理
- Spring bean 原理
- spring管理bean原理
- spring加载bean原理
- Spring管理Bean的原理
- Spring之Bean装配原理
- spring管理bean的原理
- spring管理bean的原理
- spring管理bean的原理
- Spring bean初始化原理详解
- spring管理bean的原理
- spring管理bean的原理
- Spring:spring管理bean的原理
- spring实例化Bean的原理
- Spring管理bean的原理自定义实现
- 简单模拟spring装载注入bean原理
- Win32 API获取AVI视频文件信息
- 全面进阶 H5 直播
- webpack+react+es6环境配置
- 自己实现的parseInt方法
- Tomcat日志级别修改
- Spring bean 原理
- C++虚函数实现机制
- jQuery 中ajax异步请求 回调函数的相关问题
- python_文件的读取
- 机器学习入门资源推介
- CDH Can't scan a pre-transactional edit log,Timed out waiting 120000ms ,JournalNode数据文件破坏集群恢复方法
- 网页页面实现自动刷新的3种代码
- javaweb开发环境搭建
- 核心网一些基本知识