一直知道Spring是运用反射技术的,但具体怎么用呢?今天就模拟下getBean方法。

步骤:

1、用Dom4j解析xml配置文件,取出我们需要的信息

2、遍历Bean节点,根据每个Bean节点的class属性值通过反射生成相应的对象

3、解析Bean节点的子节点,用于给对象的属性赋值(调用set方法)或者其他

4、把每个Bean节点封装好的对象放入Map集合里

具体操作如下:

一、xml配置(自己模拟写的xml)

<?xml version="1.0" encoding="UTF-8"?>
<Beans>
<Bean Id="user" class="project.test.User">
<property name="name">Jack</property>
<property name="pwd">1234</property>
</Bean>
<Bean Id="user1" class="project.test.User">
<property name="name">Jack11</property>
<property name="pwd">1234111</property>
</Bean>
</Beans>

二、具体的实现。

User实体类:

package project.test;

public class User {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} }

具体的操作类:

package project.test;

import java.beans.PropertyDescriptor;
import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class BeanFactoryDemo {
private Map<String,Object> map = new HashMap<String,Object>();
public Map<String,Object> getBeanMap() throws Exception {
         //1、用Dom4j解析xml配置文件,取出我们需要的信息 
        SAXReader reader = new SAXReader();
//获取一个Document对象
Document doc =reader.read(new File("resources/demo.xml"));
//通过XPath获得Beans节点下的所有Bean元素
List<Element> list = doc.selectNodes("/Beans/Bean");
//2、遍历Bean节点,根据每个Bean节点的class属性值通过反射生成相应的对象
//遍历Bean元素,找出我们需要的东西如:Id,class属性值
for(Element e :list){
String Id = e.attributeValue("Id");
String cls = e.attributeValue("class");
//通过获取到的class属性值获得一个Class对象用于生成相应的对象
Class clas = Class.forName(cls);
//通过Class新建一个对象
Object obj = clas.newInstance();
//获取Bean的子元素
Iterator<Element> it = e.elementIterator();
while(it.hasNext()){
Element e1 = it.next();
//获得属性元素的文本内容,便于下面给调用对象的set方法赋值
String value = e1.getText();
//获取对应元素的属性列表(如:name)
List<Attribute> ls = e1.attributes();
for(Attribute a:ls){
//3、解析Bean节点的子节点,用于给对象的属性赋值(调用set方法)或者其他
//通过PropertyDescriptor获得obj里的方法,第一个参数是属性名,第二个参数是Class对象
PropertyDescriptor pd = new PropertyDescriptor(a.getValue(), clas);
//获得写方法(set方法)如果要获取get方法即:pd.getReadMethod();
Method m = pd.getWriteMethod();
//反射调用set方法
m.invoke(obj, value);
} }
//4、把每个Bean节点封装好的对象放入Map集合里
            map.put(Id, obj);
}
return map;
}
public Object getBean(String id) throws Exception{
return getBeanMap().get(id);
}
public static void main(String[] args) throws Exception {
User u = (User)new BeanFactoryDemo().getBean("user");
System.out.println(u.getName());
System.out.println(u.getPwd());
User u1 = (User)new BeanFactoryDemo().getBean("user1");
System.out.println(u1.getName());
System.out.println(u1.getPwd());
}
}

以上就是我模拟的getBean方法,当然在spring里比这复杂好多,我还在研究。。。。。

只是粗浅的看法,不对的地方请多多指正,毕竟还是个菜鸟

模拟Spring中的getBean方法的更多相关文章

  1. 模拟Spring容器的getBean方法(Maven工程)

    Spring容器的getBean方法是通过反射机制实现的,下面的测试程序模拟getBean的实现原理. 步骤一:pom.xml文件配置解析XML文件的dom4j.jar 步骤二:XML文件中配置bea ...

  2. 模拟jQuery中的ready方法及实现按需加载css,js实例代码

    这篇文章介绍了模拟jQuery中的ready方法及实现按需加载css,js实例代码,有需要的朋友可以参考一下     一.ready函数的实现经常用jQuery类库或其他类库中的ready方法,有时候 ...

  3. Spring中的Lookup(方法注入)

    在使用Spring时,可能会遇到这种情况:一个单例的Bean依赖另一个非单例的Bean.如果简单的使用自动装配来注入依赖,就可能会出现一些问题,如下所示: 单例的Class A @Component ...

  4. Spring中的destroy-method方法

    1. Bean标签的destroy-method方法 配置数据源的时候,会有一个destroy-method方法 <bean id = "dataSource" class  ...

  5. 模拟jQuery中的ready方法及实现按需加载css,js

    一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合 ...

  6. Spring中集合注入方法

    集合注入重要是对数组.List.Set.map的注入,具体注入方法请参照一下代码(重点是applicationContext.xml中对这几个集合注入的方式): 1.在工程中新建一个Departmen ...

  7. 模拟Spring中applicationContext.xml配置文件初始化bean的过程

    package com.xiaohao.action; import java.io.File; import java.lang.reflect.Method; import java.util.C ...

  8. Spring中处理Post方法中文乱码

    在Web.xml中配置: <!-- 注册Spring提供的处理Post请求的乱码问题 --> <filter> <filter-name>CharacterEnco ...

  9. SSM-Spring-13:Spring中RegexpMethodPointcutAdvisor正则方法切入点顾问

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- RegexpMethodPointcutAdvisor:正则方法切入点顾问 核心: <property ...

随机推荐

  1. 团队项目-第七次scrum 会议

    时间:11.3 时长:30分钟 地点:F楼1039教室 工作情况 团队成员 已完成任务 待完成任务 解小锐 学习cocos creator样例 修复员工招聘时bug 陈鑫 完成fire()与UI的对接 ...

  2. Mifare简介

    Mifare简介 MIFARE是NXP的知名品牌,是一个应用广泛的非接触式IC产品(13.56MHz非接触性辨识技术),一个典型的通信距离为10厘米,在全球有40多个不同的应用领域.有2.6亿个读写器 ...

  3. [洛谷P2613]【模板】有理数取余

    题目大意:给你$a,b(a,b\leqslant10^{10001})$,求出$\dfrac a b\equiv1\pmod{19260817}$,无解输出 Angry! 题解:在读入的时候取模,若$ ...

  4. [2018-9-4T2]探索黑暗dark

    题目大意:有一棵树,第$i$个点的点权为$s_i(s_1>0)$.初始有每个点都是亮的.$m$次修改,每次改变一个点的亮暗,回答包含$1$的全亮的连通块中点权和最大的连通块的和的值. 题解:正解 ...

  5. ubuntu启动报错 Errors were found while checking the disk-drive for /

    开机报这个错误,主要原因是硬盘检测不通过导致的,下面介绍两种方法规避该问题: 修改grub 这个方法网上比较多,直接贴过来: 进入Ubuntu启动菜单时,光标选中 *Ubuntu 后,按键盘上的 e ...

  6. Codeforces Round #324 (Div. 2) A

    A. Olesya and Rodion time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. sublime text 3将px换算为rem的插件的安装及使用

    标签: rem这个单位对于移动端来说是比较强大的,所以这里给大家介绍sublime text 3将px换算为rem的插件的安装及使用,只要安装了这个插件,输入多少px,sublime就会提示相应的re ...

  8. git的回退和撤销操作

    回退是git的使用中很常用的一个操作,如果清楚各个回退命令的作用,不仅大大加快代码回退的效率,还能避免代码回退造成的事故 1.git reset --hard [commit] 清空暂存和未暂存的更改 ...

  9. 理想中的SQL语句条件拼接方式

    背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...

  10. Git 新项目关联到远程仓库

    最近前端学到小有成果,准备写一个新项目放在githup,结果没有提前在仓库创建项目,现在我把写好的项目推送到远程gitHup 1.先初始化本地仓库 Git init : 这样在项目里面都创建了一个隐藏 ...