模拟Spring中的getBean方法
一直知道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方法的更多相关文章
- 模拟Spring容器的getBean方法(Maven工程)
Spring容器的getBean方法是通过反射机制实现的,下面的测试程序模拟getBean的实现原理. 步骤一:pom.xml文件配置解析XML文件的dom4j.jar 步骤二:XML文件中配置bea ...
- 模拟jQuery中的ready方法及实现按需加载css,js实例代码
这篇文章介绍了模拟jQuery中的ready方法及实现按需加载css,js实例代码,有需要的朋友可以参考一下 一.ready函数的实现经常用jQuery类库或其他类库中的ready方法,有时候 ...
- Spring中的Lookup(方法注入)
在使用Spring时,可能会遇到这种情况:一个单例的Bean依赖另一个非单例的Bean.如果简单的使用自动装配来注入依赖,就可能会出现一些问题,如下所示: 单例的Class A @Component ...
- Spring中的destroy-method方法
1. Bean标签的destroy-method方法 配置数据源的时候,会有一个destroy-method方法 <bean id = "dataSource" class ...
- 模拟jQuery中的ready方法及实现按需加载css,js
一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合 ...
- Spring中集合注入方法
集合注入重要是对数组.List.Set.map的注入,具体注入方法请参照一下代码(重点是applicationContext.xml中对这几个集合注入的方式): 1.在工程中新建一个Departmen ...
- 模拟Spring中applicationContext.xml配置文件初始化bean的过程
package com.xiaohao.action; import java.io.File; import java.lang.reflect.Method; import java.util.C ...
- Spring中处理Post方法中文乱码
在Web.xml中配置: <!-- 注册Spring提供的处理Post请求的乱码问题 --> <filter> <filter-name>CharacterEnco ...
- SSM-Spring-13:Spring中RegexpMethodPointcutAdvisor正则方法切入点顾问
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- RegexpMethodPointcutAdvisor:正则方法切入点顾问 核心: <property ...
随机推荐
- php 数据库内容增删改查----增
首先,建立一个主页面(crud.php) <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- HttpRuntime.Cache再学习
摘抄: 可以看到:读缓存,其实是在调用Get方法,而写缓存则是在调用Insert方法的最简单的那个重载版本. 注意了:Add方法也可以将一个对象放入缓存,这个方法有7个参数,而Insert也有一个签名 ...
- CSLA多语言设置
1.在程序运行文件夹例如“\Bin\Debug\”中包含csla生成的资源文件: 2.在程序运行时,设置CSLA的当前语言为你想要的语言,例如:Csla.Properties.Resources.Cu ...
- 基于linux操作系统安装、使用redis详解
服务端安装 Redis的官方下载站是http://redis.io/download,可以去上面下载最新的安装程序下来,我写此文章时的的稳定版本是2.6.11. 步骤一: 下载Redis 进入软件安装 ...
- 第十一篇:MySQL基础
本篇内容 MySQL概述 MySQL安装 MySQL库增.删.改.查 MySQL表增.删.改.查 MySQL表记录增.删.改.查 一. MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典 M ...
- JZOJ 5279 香港记者
一句话题意:一个带点权边权的无向图,输出从1号点到n号点的最短路中字典序最小的一条路径 样例输入: 8 9 1 2 3 4 5 6 7 8 1 2 2 2 3 3 3 8 3 1 4 3 4 5 2 ...
- Batting Practice LightOJ - 1408
Batting Practice LightOJ - 1408(概率dp) 题意:有无限个球,进球的概率为p,问你连续不进k1个球或者连续进k2个球需要使用的球的个数的期望 思路: \(定义f[i]表 ...
- BZOJ5299 [Cqoi2018]解锁屏幕 【状压dp】
题目链接 BZOJ5299 题解 就一个毒瘤卡常题..写了那么久 设\(f[i][s]\)表示选了集合\(s\)中的点,最后一个是\(i\),进行转移 要先预处理出两点间的点,然后卡卡常就可以过了 # ...
- CF888E Maximum Subsequence (Meet in the middle,贪心)
题目链接 Solution Meet in the middle. 考虑到 \(2^{35}\) 枚举会超时,于是分成两半枚举(尽量平均). 然后不能 \(n^2\) 去匹配,需要用到一点贪心: 将数 ...
- 搭建自己的YUM源HTTP服务器
createrepo是linux下的创建仓库的软件包.create是创建的意思,repo是repository的缩写,是仓库的意思.yum(Yellowdog Updater,Modified)主要的 ...