java反射ioc_java反射模拟Spring IOC(DI)

众所周知,Spring的IOC主要就是使用了java的反射机制来完成的。

IOC主要步骤:

1.配置XML文件。

我们模拟一下Spring简单的一个XML文件。

hello

123

这份XML文件中我们在beans下设置了一个bean,包含两个属性:userName和password。接下来要做的就是如何通过这份XML文件把这两个属性的属性值注入到指定的javabean中。

2.编写BeanFactory工厂类,完成XML解析。

package com.test.day002;

import java.beans.PropertyDescriptor;

import java.io.File;

import java.io.InputStream;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import com.sun.xml.internal.ws.org.objectweb.asm.Attribute;

public class BeanFactory {

Document doc=null;

private Map beanMap = new HashMap();

void init(String xml) throws Exception{

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

//从class目录下获取指定的xml文件

InputStream ins = classLoader.getResourceAsStream(xml);

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

DocumentBuilder db;

db = dbf.newDocumentBuilder();

doc=db.parse(ins);

//根节点

Element root=doc.getDocumentElement();

//bean节点

NodeList beanNodeList=root.getElementsByTagName("bean");

for(int i = 0 ;i

Element beanElement=(Element)beanNodeList.item(i);

//获取bean的属性id和class

String id = beanElement.getAttribute("id");

String cls = beanElement.getAttribute("class");

//利用Java反射机制,通过class的名称获取Class对象

Class bean = Class.forName(cls);

//获取对应class的信息

java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);

//获取其属性描述

java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();

//设置值的方法

Method mSet = null;

//创建一个对象

Object obj = bean.newInstance();

NodeList propertyNodeList=beanElement.getElementsByTagName("property");

for(int j = 0 ;j

Element propertyElement=(Element)propertyNodeList.item(j);

String name = propertyElement.getAttribute("name");

NodeList valueNodeList=propertyElement.getElementsByTagName("value");

for(int k = 0 ;k

Element valueElement=(Element)valueNodeList.item(k);

String value = valueElement.getTextContent();

for (int l = 0; l < pd.length; l++) {

if (pd[l].getName().equalsIgnoreCase(name)) {

mSet = pd[l].getWriteMethod();

//利用Java的反射极致调用对象的某个set方法,并将值设置进去

mSet.invoke(obj, value);

}

}

}

}

//将对象放入beanMap中,其中key为id值,value为对象

beanMap.put(id, obj);

}

}

public Object getBean(String beanName) {

Object obj = beanMap.get(beanName);

return obj;

}

}

接下来我们可以测试一下。

JavaBean类

public class JavaBean {

private String userName;

private String password;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}

public class Test03 {

public static void main(String[] args) throws Exception {

BeanFactory factory = new BeanFactory();

factory.init("com/test/day002/config.xml");

Test03JavaBean javaBean = (Test03JavaBean) factory.getBean("javaBean");

System.out.println("userName=" + javaBean.getUserName());

System.out.println("password=" + javaBean.getPassword());

}

}

输出

userName=hello

password=123 以上内容参考了网上资料,做了修改整理,便于自己理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值