spring ioc简易实现

手写spring ioc简易实现: 反射 + dom4j

beanXml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="user1" class="com.java.es.pojo.UserEntity">
		<property name="userId" value="0001"></property>
		<property name="userName" value="花哥"></property>
	</bean>
	<bean id="user2" class="com.java.es.pojo.UserEntity">
		<property name="userId" value="0002"></property>
		<property name="userName" value="花少"></property>
	</bean>
</beans>
package com.java.es.pojo;

public class UserEntity {
	private String userId;
	private String userName;

	public UserEntity() {
		System.out.println("使用反射执行无参数构造函数");
	}

	public String getUserId() {

		return userId;
	}

	public void setUserId(String userId) {

		this.userId = userId;
	}

	public String getUserName() {

		return userName;
	}

	public void setUserName(String userName) {

		this.userName = userName;
	}

}

 

实现代码

package com.java.es.pojo;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * @author jiangli
 * @date 2019/11/20 22:40
 * 手写spring ioc实现: 反射 + dom4j
 */
public class SpringIOC {
	private String xmlPath;

	public SpringIOC(String xmlPath) {
		this.xmlPath = xmlPath;
	}

	public static void main(String[] args) throws Exception{
		SpringIOC ctx = new SpringIOC("user.xml");
		List<Object> bean = ctx.getBean();
		for (Object o : bean) {
			UserEntity user = (UserEntity) o;
			System.out.println(user.getUserId() + "----" + user.getUserName());
		}
	}

	private List<Object> getBean() throws Exception{
		// spring 加载过程 或者spring ioc实现原理
		// 1.读取xml配置文件
		// 获取xml解析器
		SAXReader saxReader = new SAXReader();
		// this.getClass().getClassLoader().getResourceAsStream("xmlPath")
		// 获取当前项目路径
		Document document = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath));
		// 获取跟节点对象
		Element root = document.getRootElement();
		// 获取所有子节点
		List<Element> elements = root.elements();
		List<Object> objects = new ArrayList<>();
		for (Element element : elements) {
			//使用反射创建bean
			String className = element.attributeValue("class");
			Class<?> forName = Class.forName(className);
			Object object = forName.newInstance();
			// 取所有成员属性
			List<Element> filedElements = element.elements();
			for (Element filedElement : filedElements) {
				//为属性赋值
				String name = filedElement.attributeValue("name");
				String value = filedElement.attributeValue("value");
				Field declaredField = forName.getDeclaredField(name);
				//y允许为私有成员赋值
				declaredField.setAccessible(true);
				declaredField.set(object, value);
			}
			objects.add(object);
		}
		return objects;
	}
}

执行结果 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值