Java仿Spring框架IOC控制反转利用反射简单实现(源码)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MadCode2222222222222/article/details/78769851

效果:


xml配置文件:

运行效果:(对象为单例)


实现思路:

1.创建实体类

Student.java

package com.bean;

public class Student {

	private int id;

	private String name;

	private String sex;

	private int age;

	private String hobby;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(int id, String name, String sex, int age, String hobby) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.hobby = hobby;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

}

User.java

package com.bean;

public class User {

	private int _id;

	private String username;

	private String password;

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	

	public int get_id() {
		return _id;
	}

	public void set_id(int _id) {
		this._id = _id;
	}

	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;
	}

}

2.在工程根目录新建xml配置文件beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans>


	<bean id="student" class="com.bean.Student">

	</bean>


	<bean id="user" class="com.bean.User">

	</bean>



</beans>

3.核心工具类:

①Dom4j解析beans.xml,将id和class属性值保存进对象Bean

Bean类:

package com.bean;

public class Bean {
	private String id;

	private String clazz;

	public Bean() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Bean(String id, String clazz) {
		super();
		this.id = id;
		this.clazz = clazz;
	}

	@Override
	public String toString() {
		return "Bean [id=" + id + ", clazz=" + clazz + "]";
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getClazz() {
		return clazz;
	}

	public void setClazz(String clazz) {
		this.clazz = clazz;
	}

}

解析xml:(需要jar包dom4j)

// 获取所有xml中的所有bean

	public void getBeans() {

		list = new ArrayList<Bean>();

		// 1创建dom4j的SAX解析

		SAXReader sr = new SAXReader();

		// 2加载xml文件获取dom4j的Document对象

		System.out.println("getBeans:" + file.getName());
		try {
			Document document = sr.read(file);

			// 3获取根元素

			Element root_element = document.getRootElement();

			List<Element> bean_list = root_element.elements("bean");

			for (Element element : bean_list) {

				String id = element.attributeValue("id");

				String clazz = element.attributeValue("class");

				Bean bean = new Bean(id, clazz);

				list.add(bean);

			}

			for (Bean bean : list) {

				System.out.println(bean.toString());

			}

		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}


②利用Java反射创建对象的方法

// 根据bean对象中的信息反射创建对象

	public static Object createObj(String clazz) {

		Object obj = null;

		try {
			Class cla = Class.forName(clazz);

			obj = cla.newInstance();

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return obj;

	}

③根据Bean对象中的信息,创建出对象,保存进Map集合,为根据id得到对象准备数据

// 创建beans中所有类的对象,保存进Map集合

	public void createAllObj() {

		map = new HashMap<String, Object>();

		for (Bean bean : list) {

			String id = bean.getId();

			Object obj = createObj(bean.getClazz());

			map.put(id, obj);

		}

	}
④提供getBean方法

public Object getBean(String id) {

		Object obj = map.get(id);

		return obj;

	}

实现单例效果(在核心工具类创建对象时,调用方法,准备出数据)

public BeanUtils(String path) {
		this.path = path;

		file = new File(path);

		// 解析xml,获取bean信息

		getBeans();

		// 根据bean创建对象信息

		createAllObj();

	}

完整代码下载:

CSDN下载地址:

点击打开链接










猜你喜欢

转载自blog.csdn.net/MadCode2222222222222/article/details/78769851